Linux死锁检测-Lockdep( 三 )


BUG: spinlock lockup suspected on CPU#0, insmod/658------------------------------------------------------------错误类型是spinlock,下面的backtrace和上面基本一致 。
lock: hack_spinB+0x0/0xfffffedc [lock], .magic: dead4ead, .owner: insmod/658, .owner_cpu: 0-----------发生死锁的是hack_spinB
CPU: 0 PID: 658 Comm: insmod Tainted: G O 4.0.0+ #87
Hardware name: ARM-Versatile Express
[<c00171b4>] (unwind_backtrace) from [<c0012e7c>] (show_stack+0x20/0x24)
[<c0012e7c>] (show_stack) from [<c05ade10>] (dump_stack+0x8c/0xb4)
[<c05ade10>] (dump_stack) from [<c0070b2c>] (spin_dump+0x8c/0xd0)
[<c0070b2c>] (spin_dump) from [<c0070cd0>] (do_raw_spin_lock+0x10c/0x1e0)
[<c0070cd0>] (do_raw_spin_lock) from [<c05b4eec>] (_raw_spin_lock+0x84/0x98)
[<c05b4eec>] (_raw_spin_lock) from [<bf002030>] (lockdep_test_init+0x30/0x3c [lock])
[<bf002030>] (lockdep_test_init [lock]) from [<c0008a28>] (do_one_initcall+0x9c/0x1e8)
[<c0008a28>] (do_one_initcall) from [<c05abf30>] (do_init_module+0x70/0x1c0)
[<c05abf30>] (do_init_module) from [<c00a4ddc>] (load_module+0x18b0/0x1f90)
[<c00a4ddc>] (load_module) from [<c00a55fc>] (SyS_init_module+0x140/0x150)
[<c00a55fc>] (SyS_init_module) from [<c000ec80>] (ret_fast_syscall+0x0/0x4c)
 
3.2 mutex测试执行insmod /data/mutexlock.ko,稍后结果如下 。
首先是死锁类型介绍 。
然后是产生死锁的两个点的调用者,再详细给出了两个点的栈回溯 。
最后是死锁点的详细栈回溯 。
======================================================[ INFO:possible circular locking dependency detected]4.0.0+ #92 Tainted: G O-------------------------------------------------------kworker/1:1/343 is trying to acquire lock:(mutex_a){+.+...}, at: [<bf000080>] lockdep_test_worker+0x24/0x58 [mutexlock]but task is already holding lock:((&(&delay_task)->work)){+.+...}, at: [<c0041078>] process_one_work+0x130/0x60cwhich lock already depends on the new lock.the existing dependency chain (in reverse order) is:-> #1 ((&(&delay_task)->work)){+.+...}:[<c00406f4>] flush_work+0x4c/0x2bc[<c0041cc4>] __cancel_work_timer+0xa8/0x1d0[<c0041e28>] cancel_delayed_work_sync+0x1c/0x20[<bf000138>] lockdep_thread+0x84/0xa4 [mutexlock][<c0046ee0>] kthread+0x100/0x118[<c000ed50>] ret_from_fork+0x14/0x24-> #0 (mutex_a){+.+...}:[<c006c55c>] lock_acquire+0xf4/0x190[<c05b09e4>] mutex_lock_nested+0x90/0x480[<bf000080>] lockdep_test_worker+0x24/0x58 [mutexlock][<c0041138>] process_one_work+0x1f0/0x60c[<c0041fd0>] worker_thread+0x54/0x530[<c0046ee0>] kthread+0x100/0x118[<c000ed50>] ret_from_fork+0x14/0x24other info that might help us debug this:Possible unsafe locking scenario:CPU0 CPU1---- ----lock((&(&delay_task)->work));lock(mutex_a);lock((&(&delay_task)->work));lock(mutex_a);*** DEADLOCK ***2 locks held by kworker/1:1/343:#0: ("events"){.+.+.+}, at: [<c0041078>] process_one_work+0x130/0x60c#1: ((&(&delay_task)->work)){+.+...}, at: [<c0041078>] process_one_work+0x130/0x60cstack backtrace:CPU: 1 PID: 343 Comm: kworker/1:1 Tainted: G O 4.0.0+ #92Hardware name: ARM-Versatile ExpressWorkqueue: events lockdep_test_worker [mutexlock][<c00171b4>] (unwind_backtrace) from [<c0012e7c>] (show_stack+0x20/0x24)[<c0012e7c>] (show_stack) from [<c05ade10>] (dump_stack+0x8c/0xb4)[<c05ade10>] (dump_stack) from [<c0065e80>] (print_circular_bug+0x21c/0x344)[<c0065e80>] (print_circular_bug) from [<c006be44>] (__lock_acquire+0x1f60/0x1f64)[<c006be44>] (__lock_acquire) from [<c006c55c>] (lock_acquire+0xf4/0x190)[<c006c55c>] (lock_acquire) from [<c05b09e4>] (mutex_lock_nested+0x90/0x480)[<c05b09e4>] (mutex_lock_nested) from [<bf000080>] (lockdep_test_worker+0x24/0x58 [mutexlock])[<bf000080>] (lockdep_test_worker [mutexlock]) from [<c0041138>] (process_one_work+0x1f0/0x60c)[<c0041138>] (process_one_work) from [<c0041fd0>] (worker_thread+0x54/0x530)[<c0041fd0>] (worker_thread) from [<c0046ee0>] (kthread+0x100/0x118)[<c0046ee0>] (kthread) from [<c000ed50>] (ret_from_fork+0x14/0x24)上面的backtrace,和下面的代码流程对照,只有在打开CONFIG_PROVE_LOCKING才会打印相关信息 。
lockdep_test_worker->mutex_lock(&mutex_a)->mutex_lock_nested->__mutex_lock_common->mutex_acquire_nest->lock_acquire_exclusive->lock_acquire->__lock_acquire-----------------------------------------下面的validate_chain在打开CONFIG_PROVE_LOCKING才会进行检查 。->validate_chain->...->print_circular_bug


推荐阅读