在 linux 内核中查找锁定统计信息
lookup the lock statistic in linux kernel
最近在研究Linux锁机制,想看看锁的持有和等待时间
所以我通过 make menuconfig
在 .config
文件中打开 CONFIG_LOCK_STAT
标志,并在重新编译内核后 运行 命令:
# less /proc/lock_stat
我收到以下消息:
*WARNING* lock debugging disabled!! - possibly due to a lockdep warning.
只是不知道为什么,因为我已经打开了内核 hack->lock
会话中的所有标志。
P.S。我使用的环境:kernel 3.12.6 (by uname -a
).
更新:__debug_locks_off()
和 dump_stack()
在
上的 dmesg
[ 0.000000] [<ffffffff817516a2>] _raw_write_lock+0x72/0x80
[ 0.000000] [<ffffffff81392718>] ? irqsafe4_soft_wlock_213+0x98/0xf0
[ 0.000000] [<ffffffff81392718>] irqsafe4_soft_wlock_213+0x98/0xf0
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399cd6>] locking_selftest+0x1286/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ok | ok |
[ 0.000000] hard-safe-A + unsafe-B #2/231:### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] 0000000000000002 ffffffff81c01c38 ffffffff81747f7c ffffffff81c15c98
[ 0.000000] ffffffff81c01c48 ffffffff81383d27 ffffffff81c01d60 ffffffff810d9d1e
[ 0.000000] ffffffff81c01ff8 ffffffff81c00000 ffffffff81c01fe8 ffffffff824d2d58
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810d9d1e>] check_usage+0x10e/0x550
[ 0.000000] [<ffffffff810170f4>] ? dump_trace+0x194/0x2f0
[ 0.000000] [<ffffffff810d6a54>] ? __bfs+0x24/0x240
[ 0.000000] [<ffffffff810da1af>] check_irq_usage+0x4f/0xc0
[ 0.000000] [<ffffffff810dd1ae>] __lock_acquire+0x1bce/0x2190
[ 0.000000] [<ffffffff817511e7>] ? _raw_spin_unlock_irqrestore+0x67/0x70
[ 0.000000] [<ffffffff810c13b6>] ? vprintk_emit+0x1d6/0x630
[ 0.000000] [<ffffffff810de882>] lock_acquire+0xb2/0x160
[ 0.000000] [<ffffffff8138b936>] ? irqsafe4_hard_spin_231+0xc6/0x110
[ 0.000000] [<ffffffff8138b870>] ? irqsafe4_hard_rlock_231+0x110/0x110
[ 0.000000] [<ffffffff81750e96>] _raw_spin_lock+0x46/0x80
[ 0.000000] [<ffffffff8138b936>] ? irqsafe4_hard_spin_231+0xc6/0x110
[ 0.000000] [<ffffffff8138b936>] irqsafe4_hard_spin_231+0xc6/0x110
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399d22>] locking_selftest+0x12d2/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] ffffffff81c15580 ffffffff81c01e78 ffffffff81747f7c ffffffff81cab258
[ 0.000000] ffffffff81c01e88 ffffffff81383d27 ffffffff81c01ed8 ffffffff810df539
[ 0.000000] 0000000000000082 ffffffff8138b936 0000000000000092 ffffffff81cab258
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810df539>] lock_acquired+0x2f9/0x4d0
[ 0.000000] [<ffffffff8138b936>] ? irqsafe4_hard_spin_231+0xc6/0x110
[ 0.000000] [<ffffffff8138b870>] ? irqsafe4_hard_rlock_231+0x110/0x110
[ 0.000000] [<ffffffff81750ec2>] _raw_spin_lock+0x72/0x80
[ 0.000000] [<ffffffff8138b936>] ? irqsafe4_hard_spin_231+0xc6/0x110
[ 0.000000] [<ffffffff8138b936>] irqsafe4_hard_spin_231+0xc6/0x110
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399d22>] locking_selftest+0x12d2/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ok |### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] 0000000000000002 ffffffff81c01c38 ffffffff81747f7c ffffffff81c15c98
[ 0.000000] ffffffff81c01c48 ffffffff81383d27 ffffffff81c01d60 ffffffff810d9d1e
[ 0.000000] ffffffff81c01ff8 ffffffff81c00000 ffffffff81c01fe8 ffffffff824d3138
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810d9d1e>] check_usage+0x10e/0x550
[ 0.000000] [<ffffffff810170f4>] ? dump_trace+0x194/0x2f0
[ 0.000000] [<ffffffff810d6a54>] ? __bfs+0x24/0x240
[ 0.000000] [<ffffffff810da1af>] check_irq_usage+0x4f/0xc0
[ 0.000000] [<ffffffff810dd1ae>] __lock_acquire+0x1bce/0x2190
[ 0.000000] [<ffffffff810d80e8>] ? lockdep_init_map+0x68/0x6d0
[ 0.000000] [<ffffffff810de882>] lock_acquire+0xb2/0x160
[ 0.000000] [<ffffffff81392636>] ? irqsafe4_hard_wlock_231+0xc6/0x110
[ 0.000000] [<ffffffff81392570>] ? irqsafe4_soft_wlock_231+0xf0/0xf0
[ 0.000000] [<ffffffff81751676>] _raw_write_lock+0x46/0x80
[ 0.000000] [<ffffffff81392636>] ? irqsafe4_hard_wlock_231+0xc6/0x110
[ 0.000000] [<ffffffff81392636>] irqsafe4_hard_wlock_231+0xc6/0x110
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399d35>] locking_selftest+0x12e5/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] ffffffff81c15580 ffffffff81c01e78 ffffffff81747f7c ffffffff81cab058
[ 0.000000] ffffffff81c01e88 ffffffff81383d27 ffffffff81c01ed8 ffffffff810df539
[ 0.000000] 0000000000000082 ffffffff81392636 0000000000000092 ffffffff81cab058
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810df539>] lock_acquired+0x2f9/0x4d0
[ 0.000000] [<ffffffff81392636>] ? irqsafe4_hard_wlock_231+0xc6/0x110
[ 0.000000] [<ffffffff81392570>] ? irqsafe4_soft_wlock_231+0xf0/0xf0
[ 0.000000] [<ffffffff817516a2>] _raw_write_lock+0x72/0x80
[ 0.000000] [<ffffffff81392636>] ? irqsafe4_hard_wlock_231+0xc6/0x110
[ 0.000000] [<ffffffff81392636>] irqsafe4_hard_wlock_231+0xc6/0x110
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399d35>] locking_selftest+0x12e5/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ok | ok |
[ 0.000000] soft-safe-A + unsafe-B #2/231:### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] 0000000000000006 ffffffff81c01c38 ffffffff81747f7c ffffffff81c15c98
[ 0.000000] ffffffff81c01c48 ffffffff81383d27 ffffffff81c01d60 ffffffff810d9d1e
[ 0.000000] ffffffff81c01cd8 0000000081c00000 ffffffff81c01fe8 0000000000000001
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810d9d1e>] check_usage+0x10e/0x550
[ 0.000000] [<ffffffff810d9ac2>] ? check_usage_backwards+0x72/0x1c0
[ 0.000000] [<ffffffff810d6a54>] ? __bfs+0x24/0x240
[ 0.000000] [<ffffffff810da1af>] check_irq_usage+0x4f/0xc0
[ 0.000000] [<ffffffff810dd1cd>] __lock_acquire+0x1bed/0x2190
[ 0.000000] [<ffffffff817511e7>] ? _raw_spin_unlock_irqrestore+0x67/0x70
[ 0.000000] [<ffffffff810c13b6>] ? vprintk_emit+0x1d6/0x630
[ 0.000000] [<ffffffff810de882>] lock_acquire+0xb2/0x160
[ 0.000000] [<ffffffff8138d6f8>] ? irqsafe4_soft_spin_231+0xa8/0xf0
[ 0.000000] [<ffffffff8138d650>] ? irqsafe4_soft_rlock_231+0xf0/0xf0
[ 0.000000] [<ffffffff81750e96>] _raw_spin_lock+0x46/0x80
[ 0.000000] [<ffffffff8138d6f8>] ? irqsafe4_soft_spin_231+0xa8/0xf0
[ 0.000000] [<ffffffff8138d6f8>] irqsafe4_soft_spin_231+0xa8/0xf0
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399d81>] locking_selftest+0x1331/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] ffffffff81c15580 ffffffff81c01e78 ffffffff81747f7c ffffffff81cab258
[ 0.000000] ffffffff81c01e88 ffffffff81383d27 ffffffff81c01ed8 ffffffff810df539
[ 0.000000] 0000000000000282 ffffffff8138d6f8 0000000000000292 ffffffff81cab258
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810df539>] lock_acquired+0x2f9/0x4d0
[ 0.000000] [<ffffffff8138d6f8>] ? irqsafe4_soft_spin_231+0xa8/0xf0
[ 0.000000] [<ffffffff8138d650>] ? irqsafe4_soft_rlock_231+0xf0/0xf0
[ 0.000000] [<ffffffff81750ec2>] _raw_spin_lock+0x72/0x80
[ 0.000000] [<ffffffff8138d6f8>] ? irqsafe4_soft_spin_231+0xa8/0xf0
[ 0.000000] [<ffffffff8138d6f8>] irqsafe4_soft_spin_231+0xa8/0xf0
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399d81>] locking_selftest+0x1331/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ok |### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] 0000000000000006 ffffffff81c01c38 ffffffff81747f7c ffffffff81c15c98
[ 0.000000] ffffffff81c01c48 ffffffff81383d27 ffffffff81c01d60 ffffffff810d9d1e
[ 0.000000] ffffffff81c01cd8 0000000081c00000 ffffffff81c01fe8 0000000000000001
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810d9d1e>] check_usage+0x10e/0x550
[ 0.000000] [<ffffffff810d9ac2>] ? check_usage_backwards+0x72/0x1c0
[ 0.000000] [<ffffffff810d6a54>] ? __bfs+0x24/0x240
[ 0.000000] [<ffffffff810da1af>] check_irq_usage+0x4f/0xc0
[ 0.000000] [<ffffffff810dd1cd>] __lock_acquire+0x1bed/0x2190
[ 0.000000] [<ffffffff810d80e8>] ? lockdep_init_map+0x68/0x6d0
[ 0.000000] [<ffffffff810de882>] lock_acquire+0xb2/0x160
[ 0.000000] [<ffffffff81392528>] ? irqsafe4_soft_wlock_231+0xa8/0xf0
[ 0.000000] [<ffffffff81392480>] ? irqsafe4_hard_wlock_312+0x110/0x110
[ 0.000000] [<ffffffff81751676>] _raw_write_lock+0x46/0x80
[ 0.000000] [<ffffffff81392528>] ? irqsafe4_soft_wlock_231+0xa8/0xf0
[ 0.000000] [<ffffffff81392528>] irqsafe4_soft_wlock_231+0xa8/0xf0
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399d94>] locking_selftest+0x1344/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] ffffffff81c15580 ffffffff81c01e78 ffffffff81747f7c ffffffff81cab058
[ 0.000000] ffffffff81c01e88 ffffffff81383d27 ffffffff81c01ed8 ffffffff810df539
[ 0.000000] 0000000000000282 ffffffff81392528 0000000000000292 ffffffff81cab058
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810df539>] lock_acquired+0x2f9/0x4d0
[ 0.000000] [<ffffffff81392528>] ? irqsafe4_soft_wlock_231+0xa8/0xf0
[ 0.000000] [<ffffffff81392480>] ? irqsafe4_hard_wlock_312+0x110/0x110
[ 0.000000] [<ffffffff817516a2>] _raw_write_lock+0x72/0x80
[ 0.000000] [<ffffffff81392528>] ? irqsafe4_soft_wlock_231+0xa8/0xf0
[ 0.000000] [<ffffffff81392528>] irqsafe4_soft_wlock_231+0xa8/0xf0
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399d94>] locking_selftest+0x1344/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ok | ok |
[ 0.000000] hard-safe-A + unsafe-B #2/312:### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] 0000000000000000 ffffffff81c01cb0 ffffffff81747f7c ffffffff81c15c98
[ 0.000000] ffffffff81c01cc0 ffffffff81383d27 ffffffff81c01d50 ffffffff810d9adf
[ 0.000000] 0000000000000000 ffffffff8288dec0 ffffffff824d43a8 0000000081c01d60
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810d9adf>] check_usage_backwards+0x8f/0x1c0
[ 0.000000] [<ffffffff810da9c2>] mark_lock+0x412/0x820
[ 0.000000] [<ffffffff810d9a50>] ? check_usage_forwards+0x1c0/0x1c0
[ 0.000000] [<ffffffff810dbf68>] __lock_acquire+0x988/0x2190
[ 0.000000] [<ffffffff817511e7>] ? _raw_spin_unlock_irqrestore+0x67/0x70
[ 0.000000] [<ffffffff810c13b6>] ? vprintk_emit+0x1d6/0x630
[ 0.000000] [<ffffffff810de882>] lock_acquire+0xb2/0x160
[ 0.000000] [<ffffffff8138b72e>] ? irqsafe4_hard_spin_312+0xde/0x110
[ 0.000000] [<ffffffff8138b650>] ? irqsafe4_hard_rlock_312+0x110/0x110
[ 0.000000] [<ffffffff81750e96>] _raw_spin_lock+0x46/0x80
[ 0.000000] [<ffffffff8138b72e>] ? irqsafe4_hard_spin_312+0xde/0x110
[ 0.000000] [<ffffffff8138b72e>] irqsafe4_hard_spin_312+0xde/0x110
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399de0>] locking_selftest+0x1390/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] ffffffff81c15580 ffffffff81c01e78 ffffffff81747f7c ffffffff81cab258
[ 0.000000] ffffffff81c01e88 ffffffff81383d27 ffffffff81c01ed8 ffffffff810df595
[ 0.000000] 0000000000000282 ffffffff8138b72e 0000000000000292 ffffffff81cab258
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810df595>] lock_acquired+0x355/0x4d0
[ 0.000000] [<ffffffff8138b72e>] ? irqsafe4_hard_spin_312+0xde/0x110
[ 0.000000] [<ffffffff8138b650>] ? irqsafe4_hard_rlock_312+0x110/0x110
[ 0.000000] [<ffffffff81750ec2>] _raw_spin_lock+0x72/0x80
[ 0.000000] [<ffffffff8138b72e>] ? irqsafe4_hard_spin_312+0xde/0x110
[ 0.000000] [<ffffffff8138b72e>] irqsafe4_hard_spin_312+0xde/0x110
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399de0>] locking_selftest+0x1390/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>]
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ok |
[ 0.000000] -------------------------------------------------------
[ 0.000000] Good, all 253 testcases passed! |
[ 0.000000] ---------------------------------
[ 0.000000] hpet clockevent registered
启用锁定统计
首先一定要开启锁统计功能。来自 Documentation/locking/lockstat.txt:
- CONFIGURATION
Lock statistics are enabled via CONFIG_LOCK_STAT
.
- USAGE
Enable collection of statistics:
# echo 1 >/proc/sys/kernel/lock_stat
Disable collection of statistics:
# echo 0 >/proc/sys/kernel/lock_stat
Look at the current lock statistics:
( line numbers not part of actual output, done for clarity in the explanation
below )
# less /proc/lock_stat
因此,请务必先启用锁统计信息的收集。
检查内核日志中的 lockdep 警告
现在,让我们看一下打印警告消息的代码:
kernel/locking/lockdep_proc.c : seq_header():
if (unlikely(!debug_locks))
seq_printf(m, "*WARNING* lock debugging disabled!! - possibly due to a lockdep warning\n");
这个 debug_locks
变量被 debug_locks_off()
函数设置为 0(禁用),而该函数又可以从 lot 个地方调用.我们看一下这个变量定义的地方:
/*
* We want to turn all lock-debugging facilities on/off at once,
* via a global flag. The reason is that once a single bug has been
* detected and reported, there might be cascade of followup bugs
* that would just muddy the log. So we report the first one and
* shut up after that.
*/
int debug_locks = 1;
EXPORT_SYMBOL_GPL(debug_locks);
对该变量的注释解释了您看到该警告的原因。
因此,请检查您的内核日志(通过 dmesg
命令)以查找通过 lockdep
机制实际发现的错误。您可能会找到一个,这将解释为什么禁用锁定调试。
更新
关于这条消息:
[ 0.084000] SMP alternatives: lockdep: fixing up alternatives
看来这与您的实际问题无关。此消息由下一个代码打印:
arch/x86/kernel/alternative.c : alternatives_enable_smp():
#ifdef CONFIG_LOCKDEP
/*
* Older binutils section handling bug prevented
* alternatives-replacement from working reliably.
*
* If this still occurs then you should see a hang
* or crash shortly after this line:
*/
pr_info("lockdep: fixing up alternatives\n");
#endif
此代码已过时且已过时,此提交已将其删除到较新的内核版本中:
lockdep, x86/alternatives: Drop ancient lockdep fixup message
所以我认为是其他原因导致无法收集锁统计信息。很难说到底是什么。我唯一能想到的就是修改内核,这样你就可以看到是什么导致了锁定调试的禁用,重建内核并查看内核日志以找出从哪里调用了锁定调试禁用。
所以,如果你能做到这一点,请按如下方式修改 __debug_locks_off() 函数:
static inline int __debug_locks_off(void)
{
/* ---- Add this code ---- */
pr_err("### __debug_locks_off() called!\n");
dump_stack();
/* ----------------------- */
return xchg(&debug_locks, 0);
}
此外,在该文件的顶部添加 #include <linux/printk.h>
行,以防万一。
然后重建您的内核,运行 它并提供整个 dmesg
输出。它应该足以告诉它在哪里被禁用了。
更新 2
正如我从你提供的回溯中看到的那样,所有 dump_stack()
调用(你添加到 __debug_locks_off()
函数)——它们从 locking_selftest()
函数调用,这又是只是一些单元测试例程。我们来看看:locking_selftest()。这里需要注意的是这段代码:
} else {
printk("-------------------------------------------------------\n");
printk("Good, all %3d testcases passed! |\n",
testcase_successes);
printk("---------------------------------\n");
debug_locks = 1;
}
因此您可以看到,在您的情况下,您在 locking_selftest()
的末尾启用了 debug_locks
变量 ("on")。考虑到您提供的所有消息实际上都是从 locking_selftest()
触发的,我可以说这些消息不会导致您的问题(已禁用 debug_locks
变量)。
因此,您仍然需要弄清楚 debug_locks
变量在何处以及为何(在您的情况下)被禁用。让我们从这个开始:请与我们分享完整的 dmesg
输出(您可以使用一些 pastebin 服务,只需将 link 添加到您的问题或作为新评论)。您可能在 dmesg
输出中忽略了一些 __debug_locks_off()
调用,这些调用实际上是相关的(不是从该自测试例程中调用的)。
你可以设置CONFIG_PROVE_RCU_REPEATEDLY=y
这意味着"don't disable PROVE_RCU
on first splat"
最近在研究Linux锁机制,想看看锁的持有和等待时间
所以我通过 make menuconfig
在 .config
文件中打开 CONFIG_LOCK_STAT
标志,并在重新编译内核后 运行 命令:
# less /proc/lock_stat
我收到以下消息:
*WARNING* lock debugging disabled!! - possibly due to a lockdep warning.
只是不知道为什么,因为我已经打开了内核 hack->lock
会话中的所有标志。
P.S。我使用的环境:kernel 3.12.6 (by uname -a
).
更新:__debug_locks_off()
和 dump_stack()
在
[ 0.000000] [<ffffffff817516a2>] _raw_write_lock+0x72/0x80
[ 0.000000] [<ffffffff81392718>] ? irqsafe4_soft_wlock_213+0x98/0xf0
[ 0.000000] [<ffffffff81392718>] irqsafe4_soft_wlock_213+0x98/0xf0
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399cd6>] locking_selftest+0x1286/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ok | ok |
[ 0.000000] hard-safe-A + unsafe-B #2/231:### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] 0000000000000002 ffffffff81c01c38 ffffffff81747f7c ffffffff81c15c98
[ 0.000000] ffffffff81c01c48 ffffffff81383d27 ffffffff81c01d60 ffffffff810d9d1e
[ 0.000000] ffffffff81c01ff8 ffffffff81c00000 ffffffff81c01fe8 ffffffff824d2d58
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810d9d1e>] check_usage+0x10e/0x550
[ 0.000000] [<ffffffff810170f4>] ? dump_trace+0x194/0x2f0
[ 0.000000] [<ffffffff810d6a54>] ? __bfs+0x24/0x240
[ 0.000000] [<ffffffff810da1af>] check_irq_usage+0x4f/0xc0
[ 0.000000] [<ffffffff810dd1ae>] __lock_acquire+0x1bce/0x2190
[ 0.000000] [<ffffffff817511e7>] ? _raw_spin_unlock_irqrestore+0x67/0x70
[ 0.000000] [<ffffffff810c13b6>] ? vprintk_emit+0x1d6/0x630
[ 0.000000] [<ffffffff810de882>] lock_acquire+0xb2/0x160
[ 0.000000] [<ffffffff8138b936>] ? irqsafe4_hard_spin_231+0xc6/0x110
[ 0.000000] [<ffffffff8138b870>] ? irqsafe4_hard_rlock_231+0x110/0x110
[ 0.000000] [<ffffffff81750e96>] _raw_spin_lock+0x46/0x80
[ 0.000000] [<ffffffff8138b936>] ? irqsafe4_hard_spin_231+0xc6/0x110
[ 0.000000] [<ffffffff8138b936>] irqsafe4_hard_spin_231+0xc6/0x110
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399d22>] locking_selftest+0x12d2/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] ffffffff81c15580 ffffffff81c01e78 ffffffff81747f7c ffffffff81cab258
[ 0.000000] ffffffff81c01e88 ffffffff81383d27 ffffffff81c01ed8 ffffffff810df539
[ 0.000000] 0000000000000082 ffffffff8138b936 0000000000000092 ffffffff81cab258
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810df539>] lock_acquired+0x2f9/0x4d0
[ 0.000000] [<ffffffff8138b936>] ? irqsafe4_hard_spin_231+0xc6/0x110
[ 0.000000] [<ffffffff8138b870>] ? irqsafe4_hard_rlock_231+0x110/0x110
[ 0.000000] [<ffffffff81750ec2>] _raw_spin_lock+0x72/0x80
[ 0.000000] [<ffffffff8138b936>] ? irqsafe4_hard_spin_231+0xc6/0x110
[ 0.000000] [<ffffffff8138b936>] irqsafe4_hard_spin_231+0xc6/0x110
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399d22>] locking_selftest+0x12d2/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ok |### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] 0000000000000002 ffffffff81c01c38 ffffffff81747f7c ffffffff81c15c98
[ 0.000000] ffffffff81c01c48 ffffffff81383d27 ffffffff81c01d60 ffffffff810d9d1e
[ 0.000000] ffffffff81c01ff8 ffffffff81c00000 ffffffff81c01fe8 ffffffff824d3138
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810d9d1e>] check_usage+0x10e/0x550
[ 0.000000] [<ffffffff810170f4>] ? dump_trace+0x194/0x2f0
[ 0.000000] [<ffffffff810d6a54>] ? __bfs+0x24/0x240
[ 0.000000] [<ffffffff810da1af>] check_irq_usage+0x4f/0xc0
[ 0.000000] [<ffffffff810dd1ae>] __lock_acquire+0x1bce/0x2190
[ 0.000000] [<ffffffff810d80e8>] ? lockdep_init_map+0x68/0x6d0
[ 0.000000] [<ffffffff810de882>] lock_acquire+0xb2/0x160
[ 0.000000] [<ffffffff81392636>] ? irqsafe4_hard_wlock_231+0xc6/0x110
[ 0.000000] [<ffffffff81392570>] ? irqsafe4_soft_wlock_231+0xf0/0xf0
[ 0.000000] [<ffffffff81751676>] _raw_write_lock+0x46/0x80
[ 0.000000] [<ffffffff81392636>] ? irqsafe4_hard_wlock_231+0xc6/0x110
[ 0.000000] [<ffffffff81392636>] irqsafe4_hard_wlock_231+0xc6/0x110
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399d35>] locking_selftest+0x12e5/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] ffffffff81c15580 ffffffff81c01e78 ffffffff81747f7c ffffffff81cab058
[ 0.000000] ffffffff81c01e88 ffffffff81383d27 ffffffff81c01ed8 ffffffff810df539
[ 0.000000] 0000000000000082 ffffffff81392636 0000000000000092 ffffffff81cab058
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810df539>] lock_acquired+0x2f9/0x4d0
[ 0.000000] [<ffffffff81392636>] ? irqsafe4_hard_wlock_231+0xc6/0x110
[ 0.000000] [<ffffffff81392570>] ? irqsafe4_soft_wlock_231+0xf0/0xf0
[ 0.000000] [<ffffffff817516a2>] _raw_write_lock+0x72/0x80
[ 0.000000] [<ffffffff81392636>] ? irqsafe4_hard_wlock_231+0xc6/0x110
[ 0.000000] [<ffffffff81392636>] irqsafe4_hard_wlock_231+0xc6/0x110
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399d35>] locking_selftest+0x12e5/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ok | ok |
[ 0.000000] soft-safe-A + unsafe-B #2/231:### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] 0000000000000006 ffffffff81c01c38 ffffffff81747f7c ffffffff81c15c98
[ 0.000000] ffffffff81c01c48 ffffffff81383d27 ffffffff81c01d60 ffffffff810d9d1e
[ 0.000000] ffffffff81c01cd8 0000000081c00000 ffffffff81c01fe8 0000000000000001
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810d9d1e>] check_usage+0x10e/0x550
[ 0.000000] [<ffffffff810d9ac2>] ? check_usage_backwards+0x72/0x1c0
[ 0.000000] [<ffffffff810d6a54>] ? __bfs+0x24/0x240
[ 0.000000] [<ffffffff810da1af>] check_irq_usage+0x4f/0xc0
[ 0.000000] [<ffffffff810dd1cd>] __lock_acquire+0x1bed/0x2190
[ 0.000000] [<ffffffff817511e7>] ? _raw_spin_unlock_irqrestore+0x67/0x70
[ 0.000000] [<ffffffff810c13b6>] ? vprintk_emit+0x1d6/0x630
[ 0.000000] [<ffffffff810de882>] lock_acquire+0xb2/0x160
[ 0.000000] [<ffffffff8138d6f8>] ? irqsafe4_soft_spin_231+0xa8/0xf0
[ 0.000000] [<ffffffff8138d650>] ? irqsafe4_soft_rlock_231+0xf0/0xf0
[ 0.000000] [<ffffffff81750e96>] _raw_spin_lock+0x46/0x80
[ 0.000000] [<ffffffff8138d6f8>] ? irqsafe4_soft_spin_231+0xa8/0xf0
[ 0.000000] [<ffffffff8138d6f8>] irqsafe4_soft_spin_231+0xa8/0xf0
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399d81>] locking_selftest+0x1331/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] ffffffff81c15580 ffffffff81c01e78 ffffffff81747f7c ffffffff81cab258
[ 0.000000] ffffffff81c01e88 ffffffff81383d27 ffffffff81c01ed8 ffffffff810df539
[ 0.000000] 0000000000000282 ffffffff8138d6f8 0000000000000292 ffffffff81cab258
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810df539>] lock_acquired+0x2f9/0x4d0
[ 0.000000] [<ffffffff8138d6f8>] ? irqsafe4_soft_spin_231+0xa8/0xf0
[ 0.000000] [<ffffffff8138d650>] ? irqsafe4_soft_rlock_231+0xf0/0xf0
[ 0.000000] [<ffffffff81750ec2>] _raw_spin_lock+0x72/0x80
[ 0.000000] [<ffffffff8138d6f8>] ? irqsafe4_soft_spin_231+0xa8/0xf0
[ 0.000000] [<ffffffff8138d6f8>] irqsafe4_soft_spin_231+0xa8/0xf0
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399d81>] locking_selftest+0x1331/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ok |### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] 0000000000000006 ffffffff81c01c38 ffffffff81747f7c ffffffff81c15c98
[ 0.000000] ffffffff81c01c48 ffffffff81383d27 ffffffff81c01d60 ffffffff810d9d1e
[ 0.000000] ffffffff81c01cd8 0000000081c00000 ffffffff81c01fe8 0000000000000001
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810d9d1e>] check_usage+0x10e/0x550
[ 0.000000] [<ffffffff810d9ac2>] ? check_usage_backwards+0x72/0x1c0
[ 0.000000] [<ffffffff810d6a54>] ? __bfs+0x24/0x240
[ 0.000000] [<ffffffff810da1af>] check_irq_usage+0x4f/0xc0
[ 0.000000] [<ffffffff810dd1cd>] __lock_acquire+0x1bed/0x2190
[ 0.000000] [<ffffffff810d80e8>] ? lockdep_init_map+0x68/0x6d0
[ 0.000000] [<ffffffff810de882>] lock_acquire+0xb2/0x160
[ 0.000000] [<ffffffff81392528>] ? irqsafe4_soft_wlock_231+0xa8/0xf0
[ 0.000000] [<ffffffff81392480>] ? irqsafe4_hard_wlock_312+0x110/0x110
[ 0.000000] [<ffffffff81751676>] _raw_write_lock+0x46/0x80
[ 0.000000] [<ffffffff81392528>] ? irqsafe4_soft_wlock_231+0xa8/0xf0
[ 0.000000] [<ffffffff81392528>] irqsafe4_soft_wlock_231+0xa8/0xf0
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399d94>] locking_selftest+0x1344/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] ffffffff81c15580 ffffffff81c01e78 ffffffff81747f7c ffffffff81cab058
[ 0.000000] ffffffff81c01e88 ffffffff81383d27 ffffffff81c01ed8 ffffffff810df539
[ 0.000000] 0000000000000282 ffffffff81392528 0000000000000292 ffffffff81cab058
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810df539>] lock_acquired+0x2f9/0x4d0
[ 0.000000] [<ffffffff81392528>] ? irqsafe4_soft_wlock_231+0xa8/0xf0
[ 0.000000] [<ffffffff81392480>] ? irqsafe4_hard_wlock_312+0x110/0x110
[ 0.000000] [<ffffffff817516a2>] _raw_write_lock+0x72/0x80
[ 0.000000] [<ffffffff81392528>] ? irqsafe4_soft_wlock_231+0xa8/0xf0
[ 0.000000] [<ffffffff81392528>] irqsafe4_soft_wlock_231+0xa8/0xf0
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399d94>] locking_selftest+0x1344/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ok | ok |
[ 0.000000] hard-safe-A + unsafe-B #2/312:### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] 0000000000000000 ffffffff81c01cb0 ffffffff81747f7c ffffffff81c15c98
[ 0.000000] ffffffff81c01cc0 ffffffff81383d27 ffffffff81c01d50 ffffffff810d9adf
[ 0.000000] 0000000000000000 ffffffff8288dec0 ffffffff824d43a8 0000000081c01d60
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810d9adf>] check_usage_backwards+0x8f/0x1c0
[ 0.000000] [<ffffffff810da9c2>] mark_lock+0x412/0x820
[ 0.000000] [<ffffffff810d9a50>] ? check_usage_forwards+0x1c0/0x1c0
[ 0.000000] [<ffffffff810dbf68>] __lock_acquire+0x988/0x2190
[ 0.000000] [<ffffffff817511e7>] ? _raw_spin_unlock_irqrestore+0x67/0x70
[ 0.000000] [<ffffffff810c13b6>] ? vprintk_emit+0x1d6/0x630
[ 0.000000] [<ffffffff810de882>] lock_acquire+0xb2/0x160
[ 0.000000] [<ffffffff8138b72e>] ? irqsafe4_hard_spin_312+0xde/0x110
[ 0.000000] [<ffffffff8138b650>] ? irqsafe4_hard_rlock_312+0x110/0x110
[ 0.000000] [<ffffffff81750e96>] _raw_spin_lock+0x46/0x80
[ 0.000000] [<ffffffff8138b72e>] ? irqsafe4_hard_spin_312+0xde/0x110
[ 0.000000] [<ffffffff8138b72e>] irqsafe4_hard_spin_312+0xde/0x110
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399de0>] locking_selftest+0x1390/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ### __debug_locks_off called!
[ 0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.6 #13
[ 0.000000] Hardware name: Sony Corporation VGN-Z25TN_B/VAIO, BIOS R2140M3 08/26/2008
[ 0.000000] ffffffff81c15580 ffffffff81c01e78 ffffffff81747f7c ffffffff81cab258
[ 0.000000] ffffffff81c01e88 ffffffff81383d27 ffffffff81c01ed8 ffffffff810df595
[ 0.000000] 0000000000000282 ffffffff8138b72e 0000000000000292 ffffffff81cab258
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff81747f7c>] dump_stack+0x54/0x74
[ 0.000000] [<ffffffff81383d27>] debug_locks_off+0x17/0x50
[ 0.000000] [<ffffffff810df595>] lock_acquired+0x355/0x4d0
[ 0.000000] [<ffffffff8138b72e>] ? irqsafe4_hard_spin_312+0xde/0x110
[ 0.000000] [<ffffffff8138b650>] ? irqsafe4_hard_rlock_312+0x110/0x110
[ 0.000000] [<ffffffff81750ec2>] _raw_spin_lock+0x72/0x80
[ 0.000000] [<ffffffff8138b72e>] ? irqsafe4_hard_spin_312+0xde/0x110
[ 0.000000] [<ffffffff8138b72e>] irqsafe4_hard_spin_312+0xde/0x110
[ 0.000000] [<ffffffff817481f5>] dotest+0x43/0x5a7
[ 0.000000] [<ffffffff81399de0>] locking_selftest+0x1390/0x2100
[ 0.000000] [<ffffffff81f1aca9>] start_kernel+0x2d2/0x427
[ 0.000000] [<ffffffff81f1a120>] ? early_idt_handlers+0x120/0x120
[ 0.000000] [<ffffffff81f1a4c7>]
[ 0.000000] [<ffffffff81f1a5d6>] x86_64_start_kernel+0x10d/0x11c
[ 0.000000] ok |
[ 0.000000] -------------------------------------------------------
[ 0.000000] Good, all 253 testcases passed! |
[ 0.000000] ---------------------------------
[ 0.000000] hpet clockevent registered
启用锁定统计
首先一定要开启锁统计功能。来自 Documentation/locking/lockstat.txt:
- CONFIGURATION
Lock statistics are enabled via
CONFIG_LOCK_STAT
.
- USAGE
Enable collection of statistics:
# echo 1 >/proc/sys/kernel/lock_stat
Disable collection of statistics:
# echo 0 >/proc/sys/kernel/lock_stat
Look at the current lock statistics:
( line numbers not part of actual output, done for clarity in the explanation below )
# less /proc/lock_stat
因此,请务必先启用锁统计信息的收集。
检查内核日志中的 lockdep 警告
现在,让我们看一下打印警告消息的代码:
kernel/locking/lockdep_proc.c : seq_header():
if (unlikely(!debug_locks))
seq_printf(m, "*WARNING* lock debugging disabled!! - possibly due to a lockdep warning\n");
这个 debug_locks
变量被 debug_locks_off()
函数设置为 0(禁用),而该函数又可以从 lot 个地方调用.我们看一下这个变量定义的地方:
/*
* We want to turn all lock-debugging facilities on/off at once,
* via a global flag. The reason is that once a single bug has been
* detected and reported, there might be cascade of followup bugs
* that would just muddy the log. So we report the first one and
* shut up after that.
*/
int debug_locks = 1;
EXPORT_SYMBOL_GPL(debug_locks);
对该变量的注释解释了您看到该警告的原因。
因此,请检查您的内核日志(通过 dmesg
命令)以查找通过 lockdep
机制实际发现的错误。您可能会找到一个,这将解释为什么禁用锁定调试。
更新
关于这条消息:
[ 0.084000] SMP alternatives: lockdep: fixing up alternatives
看来这与您的实际问题无关。此消息由下一个代码打印:
arch/x86/kernel/alternative.c : alternatives_enable_smp():
#ifdef CONFIG_LOCKDEP
/*
* Older binutils section handling bug prevented
* alternatives-replacement from working reliably.
*
* If this still occurs then you should see a hang
* or crash shortly after this line:
*/
pr_info("lockdep: fixing up alternatives\n");
#endif
此代码已过时且已过时,此提交已将其删除到较新的内核版本中:
lockdep, x86/alternatives: Drop ancient lockdep fixup message
所以我认为是其他原因导致无法收集锁统计信息。很难说到底是什么。我唯一能想到的就是修改内核,这样你就可以看到是什么导致了锁定调试的禁用,重建内核并查看内核日志以找出从哪里调用了锁定调试禁用。
所以,如果你能做到这一点,请按如下方式修改 __debug_locks_off() 函数:
static inline int __debug_locks_off(void)
{
/* ---- Add this code ---- */
pr_err("### __debug_locks_off() called!\n");
dump_stack();
/* ----------------------- */
return xchg(&debug_locks, 0);
}
此外,在该文件的顶部添加 #include <linux/printk.h>
行,以防万一。
然后重建您的内核,运行 它并提供整个 dmesg
输出。它应该足以告诉它在哪里被禁用了。
更新 2
正如我从你提供的回溯中看到的那样,所有 dump_stack()
调用(你添加到 __debug_locks_off()
函数)——它们从 locking_selftest()
函数调用,这又是只是一些单元测试例程。我们来看看:locking_selftest()。这里需要注意的是这段代码:
} else {
printk("-------------------------------------------------------\n");
printk("Good, all %3d testcases passed! |\n",
testcase_successes);
printk("---------------------------------\n");
debug_locks = 1;
}
因此您可以看到,在您的情况下,您在 locking_selftest()
的末尾启用了 debug_locks
变量 ("on")。考虑到您提供的所有消息实际上都是从 locking_selftest()
触发的,我可以说这些消息不会导致您的问题(已禁用 debug_locks
变量)。
因此,您仍然需要弄清楚 debug_locks
变量在何处以及为何(在您的情况下)被禁用。让我们从这个开始:请与我们分享完整的 dmesg
输出(您可以使用一些 pastebin 服务,只需将 link 添加到您的问题或作为新评论)。您可能在 dmesg
输出中忽略了一些 __debug_locks_off()
调用,这些调用实际上是相关的(不是从该自测试例程中调用的)。
你可以设置CONFIG_PROVE_RCU_REPEATEDLY=y
这意味着"don't disable PROVE_RCU
on first splat"