Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Kernel Liteos A
提交
0fa1310a
K
Kernel Liteos A
项目概览
OpenHarmony
/
Kernel Liteos A
8 个月 前同步成功
通知
450
Star
414
Fork
55
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
4
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel Liteos A
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
4
Issue
4
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
0fa1310a
编写于
9月 28, 2021
作者:
O
openharmony_ci
提交者:
Gitee
9月 28, 2021
浏览文件
操作
浏览文件
下载
差异文件
!584 OsLockDepCheckIn异常处理中存在g_lockdepAvailable锁嵌套调用,导致死锁异常信息不正常输出
Merge pull request !584 from zhangfanfan2/master
上级
7d7cff4c
bf030b6b
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
52 addition
and
19 deletion
+52
-19
kernel/base/mp/los_lockdep.c
kernel/base/mp/los_lockdep.c
+52
-19
未找到文件。
kernel/base/mp/los_lockdep.c
浏览文件 @
0fa1310a
...
@@ -36,9 +36,10 @@
...
@@ -36,9 +36,10 @@
#include "los_atomic.h"
#include "los_atomic.h"
#include "los_exc.h"
#include "los_exc.h"
#ifdef LOSCFG_KERNEL_SMP_LOCKDEP
#ifdef LOSCFG_KERNEL_SMP_LOCKDEP
#define PRINT_BUF_SIZE 256
#define LOCKDEP_GET_NAME(lockDep, index) (((SPIN_LOCK_S *)((lockDep)->heldLocks[(index)].lockPtr))->name)
#define LOCKDEP_GET_NAME(lockDep, index) (((SPIN_LOCK_S *)((lockDep)->heldLocks[(index)].lockPtr))->name)
#define LOCKDEP_GET_ADDR(lockDep, index) ((lockDep)->heldLocks[(index)].lockAddr)
#define LOCKDEP_GET_ADDR(lockDep, index) ((lockDep)->heldLocks[(index)].lockAddr)
...
@@ -102,6 +103,30 @@ WEAK VOID OsLockDepPanic(enum LockDepErrType errType)
...
@@ -102,6 +103,30 @@ WEAK VOID OsLockDepPanic(enum LockDepErrType errType)
while
(
1
)
{}
while
(
1
)
{}
}
}
STATIC
VOID
OsLockDepPrint
(
const
CHAR
*
fmt
,
va_list
ap
)
{
UINT32
len
;
CHAR
buf
[
PRINT_BUF_SIZE
]
=
{
0
};
len
=
vsnprintf_s
(
buf
,
PRINT_BUF_SIZE
,
PRINT_BUF_SIZE
-
1
,
fmt
,
ap
);
if
((
len
==
-
1
)
&&
(
*
buf
==
'\0'
))
{
/* parameter is illegal or some features in fmt dont support */
UartPuts
(
"OsLockDepPrint is error
\n
"
,
strlen
(
"OsLockDepPrint is error
\n
"
),
0
);
return
;
}
*
(
buf
+
len
)
=
'\0'
;
UartPuts
(
buf
,
len
,
0
);
}
STATIC
VOID
OsPrintLockDepInfo
(
const
CHAR
*
fmt
,
...)
{
va_list
ap
;
va_start
(
ap
,
fmt
);
OsLockDepPrint
(
fmt
,
ap
);
va_end
(
ap
);
}
STATIC
VOID
OsLockDepDumpLock
(
const
LosTaskCB
*
task
,
const
SPIN_LOCK_S
*
lock
,
STATIC
VOID
OsLockDepDumpLock
(
const
LosTaskCB
*
task
,
const
SPIN_LOCK_S
*
lock
,
const
VOID
*
requestAddr
,
enum
LockDepErrType
errType
)
const
VOID
*
requestAddr
,
enum
LockDepErrType
errType
)
{
{
...
@@ -109,24 +134,24 @@ STATIC VOID OsLockDepDumpLock(const LosTaskCB *task, const SPIN_LOCK_S *lock,
...
@@ -109,24 +134,24 @@ STATIC VOID OsLockDepDumpLock(const LosTaskCB *task, const SPIN_LOCK_S *lock,
const
LockDep
*
lockDep
=
&
task
->
lockDep
;
const
LockDep
*
lockDep
=
&
task
->
lockDep
;
const
LosTaskCB
*
temp
=
task
;
const
LosTaskCB
*
temp
=
task
;
PrintExc
Info
(
"lockdep check failed
\n
"
);
OsPrintLockDep
Info
(
"lockdep check failed
\n
"
);
PrintExc
Info
(
"error type : %s
\n
"
,
OsLockDepErrorStringGet
(
errType
));
OsPrintLockDep
Info
(
"error type : %s
\n
"
,
OsLockDepErrorStringGet
(
errType
));
PrintExc
Info
(
"request addr : 0x%x
\n
"
,
requestAddr
);
OsPrintLockDep
Info
(
"request addr : 0x%x
\n
"
,
requestAddr
);
while
(
1
)
{
while
(
1
)
{
PrintExc
Info
(
"task name : %s
\n
"
,
temp
->
taskName
);
OsPrintLockDep
Info
(
"task name : %s
\n
"
,
temp
->
taskName
);
PrintExc
Info
(
"task id : %u
\n
"
,
temp
->
taskID
);
OsPrintLockDep
Info
(
"task id : %u
\n
"
,
temp
->
taskID
);
PrintExc
Info
(
"cpu num : %u
\n
"
,
temp
->
currCpu
);
OsPrintLockDep
Info
(
"cpu num : %u
\n
"
,
temp
->
currCpu
);
PrintExc
Info
(
"start dumping lockdep infomation
\n
"
);
OsPrintLockDep
Info
(
"start dumping lockdep infomation
\n
"
);
for
(
i
=
0
;
i
<
lockDep
->
lockDepth
;
i
++
)
{
for
(
i
=
0
;
i
<
lockDep
->
lockDepth
;
i
++
)
{
if
(
lockDep
->
heldLocks
[
i
].
lockPtr
==
lock
)
{
if
(
lockDep
->
heldLocks
[
i
].
lockPtr
==
lock
)
{
PrintExc
Info
(
"[%d] %s <-- addr:0x%x
\n
"
,
i
,
LOCKDEP_GET_NAME
(
lockDep
,
i
),
OsPrintLockDep
Info
(
"[%d] %s <-- addr:0x%x
\n
"
,
i
,
LOCKDEP_GET_NAME
(
lockDep
,
i
),
LOCKDEP_GET_ADDR
(
lockDep
,
i
));
LOCKDEP_GET_ADDR
(
lockDep
,
i
));
}
else
{
}
else
{
PrintExc
Info
(
"[%d] %s
\n
"
,
i
,
LOCKDEP_GET_NAME
(
lockDep
,
i
));
OsPrintLockDep
Info
(
"[%d] %s
\n
"
,
i
,
LOCKDEP_GET_NAME
(
lockDep
,
i
));
}
}
}
}
PrintExc
Info
(
"[%d] %s <-- now
\n
"
,
i
,
lock
->
name
);
OsPrintLockDep
Info
(
"[%d] %s <-- now
\n
"
,
i
,
lock
->
name
);
if
(
errType
==
LOCKDEP_ERR_DEAD_LOCK
)
{
if
(
errType
==
LOCKDEP_ERR_DEAD_LOCK
)
{
temp
=
lock
->
owner
;
temp
=
lock
->
owner
;
...
@@ -138,8 +163,6 @@ STATIC VOID OsLockDepDumpLock(const LosTaskCB *task, const SPIN_LOCK_S *lock,
...
@@ -138,8 +163,6 @@ STATIC VOID OsLockDepDumpLock(const LosTaskCB *task, const SPIN_LOCK_S *lock,
break
;
break
;
}
}
}
}
OsLockDepPanic
(
errType
);
}
}
STATIC
BOOL
OsLockDepCheckDependancy
(
const
LosTaskCB
*
current
,
LosTaskCB
*
lockOwner
)
STATIC
BOOL
OsLockDepCheckDependancy
(
const
LosTaskCB
*
current
,
LosTaskCB
*
lockOwner
)
...
@@ -167,7 +190,11 @@ VOID OsLockDepCheckIn(SPIN_LOCK_S *lock)
...
@@ -167,7 +190,11 @@ VOID OsLockDepCheckIn(SPIN_LOCK_S *lock)
{
{
UINT32
intSave
;
UINT32
intSave
;
enum
LockDepErrType
checkResult
=
LOCKDEP_SUCEESS
;
enum
LockDepErrType
checkResult
=
LOCKDEP_SUCEESS
;
#ifdef LOSCFG_COMPILER_CLANG_LLVM
VOID
*
requestAddr
=
(
VOID
*
)
__builtin_return_address
(
1
);
#else
VOID
*
requestAddr
=
(
VOID
*
)
__builtin_return_address
(
0
);
VOID
*
requestAddr
=
(
VOID
*
)
__builtin_return_address
(
0
);
#endif
LosTaskCB
*
current
=
OsCurrTaskGet
();
LosTaskCB
*
current
=
OsCurrTaskGet
();
LockDep
*
lockDep
=
&
current
->
lockDep
;
LockDep
*
lockDep
=
&
current
->
lockDep
;
LosTaskCB
*
lockOwner
=
NULL
;
LosTaskCB
*
lockOwner
=
NULL
;
...
@@ -206,11 +233,12 @@ OUT:
...
@@ -206,11 +233,12 @@ OUT:
lockDep
->
waitLock
=
lock
;
lockDep
->
waitLock
=
lock
;
lockDep
->
heldLocks
[
lockDep
->
lockDepth
].
lockAddr
=
requestAddr
;
lockDep
->
heldLocks
[
lockDep
->
lockDepth
].
lockAddr
=
requestAddr
;
lockDep
->
heldLocks
[
lockDep
->
lockDepth
].
waitTime
=
OsLockDepGetCycles
();
/* start time */
lockDep
->
heldLocks
[
lockDep
->
lockDepth
].
waitTime
=
OsLockDepGetCycles
();
/* start time */
}
else
{
OsLockDepRelease
(
intSave
);
OsLockDepDumpLock
(
current
,
lock
,
requestAddr
,
checkResult
)
;
return
;
}
}
OsLockDepDumpLock
(
current
,
lock
,
requestAddr
,
checkResult
);
OsLockDepRelease
(
intSave
);
OsLockDepRelease
(
intSave
);
OsLockDepPanic
(
checkResult
);
}
}
VOID
OsLockDepRecord
(
SPIN_LOCK_S
*
lock
)
VOID
OsLockDepRecord
(
SPIN_LOCK_S
*
lock
)
...
@@ -248,7 +276,11 @@ VOID OsLockDepCheckOut(SPIN_LOCK_S *lock)
...
@@ -248,7 +276,11 @@ VOID OsLockDepCheckOut(SPIN_LOCK_S *lock)
UINT32
intSave
;
UINT32
intSave
;
INT32
depth
;
INT32
depth
;
enum
LockDepErrType
checkResult
=
LOCKDEP_SUCEESS
;
enum
LockDepErrType
checkResult
=
LOCKDEP_SUCEESS
;
#ifdef LOSCFG_COMPILER_CLANG_LLVM
VOID
*
requestAddr
=
(
VOID
*
)
__builtin_return_address
(
1
);
#else
VOID
*
requestAddr
=
(
VOID
*
)
__builtin_return_address
(
0
);
VOID
*
requestAddr
=
(
VOID
*
)
__builtin_return_address
(
0
);
#endif
LosTaskCB
*
current
=
OsCurrTaskGet
();
LosTaskCB
*
current
=
OsCurrTaskGet
();
LosTaskCB
*
owner
=
NULL
;
LosTaskCB
*
owner
=
NULL
;
LockDep
*
lockDep
=
NULL
;
LockDep
*
lockDep
=
NULL
;
...
@@ -260,7 +292,9 @@ VOID OsLockDepCheckOut(SPIN_LOCK_S *lock)
...
@@ -260,7 +292,9 @@ VOID OsLockDepCheckOut(SPIN_LOCK_S *lock)
if
(
owner
==
SPINLOCK_OWNER_INIT
)
{
if
(
owner
==
SPINLOCK_OWNER_INIT
)
{
checkResult
=
LOCKDEP_ERR_UNLOCK_WITOUT_LOCK
;
checkResult
=
LOCKDEP_ERR_UNLOCK_WITOUT_LOCK
;
OsLockDepDumpLock
(
current
,
lock
,
requestAddr
,
checkResult
);
OsLockDepDumpLock
(
current
,
lock
,
requestAddr
,
checkResult
);
goto
OUT
;
OsLockDepRelease
(
intSave
);
OsLockDepPanic
(
checkResult
);
return
;
}
}
lockDep
=
&
owner
->
lockDep
;
lockDep
=
&
owner
->
lockDep
;
...
@@ -289,7 +323,6 @@ VOID OsLockDepCheckOut(SPIN_LOCK_S *lock)
...
@@ -289,7 +323,6 @@ VOID OsLockDepCheckOut(SPIN_LOCK_S *lock)
lock
->
cpuid
=
(
UINT32
)(
-
1
);
lock
->
cpuid
=
(
UINT32
)(
-
1
);
lock
->
owner
=
SPINLOCK_OWNER_INIT
;
lock
->
owner
=
SPINLOCK_OWNER_INIT
;
OUT:
OsLockDepRelease
(
intSave
);
OsLockDepRelease
(
intSave
);
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录