diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2007-11-26 14:42:19 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2007-11-26 14:42:19 -0500 |
commit | 000f4a9e718a665fd706500199a3f0c11fea30c1 (patch) | |
tree | 9a13c95d87a74c362df42d6e0aa94ae37bc56fb3 | |
parent | bc84cf17b50ca5b49bec0a5fef63c58c1526d46b (diff) |
lockdep: annotate do_debug() trap handler
Ensure the hardirq state is consistent before using locks. Use the rare
trace_hardirqs_fixup() because the trap can happen in any context.
resolves this rare lockdep warning:
WARNING: at kernel/lockdep.c:2658 check_flags()
[<c013571e>] check_flags+0x90/0x140
[<c0138a69>] lock_release+0x4b/0x1d0
[<c0507fea>] notifier_call_chain+0x2a/0x47
[<c050806b>] __atomic_notifier_call_chain+0x64/0x6d
[<c0508007>] __atomic_notifier_call_chain+0x0/0x6d
[<c050808b>] atomic_notifier_call_chain+0x17/0x1a
[<c0131802>] notify_die+0x30/0x34
[<c0506b09>] do_debug+0x3e/0xd4
[<c050658f>] debug_stack_correct+0x27/0x2c
[<c04be389>] tcp_rcv_established+0x1/0x620
[<c04c38c2>] tcp_v4_do_rcv+0x2b/0x313
[<c04c56b6>] tcp_v4_rcv+0x467/0x85d
[<c0505ff2>] _spin_lock_nested+0x27/0x32
[<c04c5a4d>] tcp_v4_rcv+0x7fe/0x85d
[<c04c560e>] tcp_v4_rcv+0x3bf/0x85d
[<c04adbb5>] ip_local_deliver_finish+0x11b/0x1b0
[<c04adac8>] ip_local_deliver_finish+0x2e/0x1b0
[<c04ada7b>] ip_rcv_finish+0x27b/0x29a
[<c04961e5>] netif_receive_skb+0xfb/0x2a6
[<c04add0f>] ip_rcv+0x0/0x1fb
[<c0496354>] netif_receive_skb+0x26a/0x2a6
[<c04961e5>] netif_receive_skb+0xfb/0x2a6
[<c049872e>] process_backlog+0x7f/0xc6
[<c04983ba>] net_rx_action+0xb9/0x1ac
[<c0498348>] net_rx_action+0x47/0x1ac
[<c01376cb>] trace_hardirqs_on+0x118/0x16b
[<c01225e2>] __do_softirq+0x49/0xa2
[<c010595f>] do_softirq+0x60/0xdd
[<c0506300>] _spin_unlock_irq+0x20/0x2c
[<c0103e4f>] restore_nocheck+0x12/0x15
[<c01440e1>] handle_fasteoi_irq+0x0/0x9b
[<c0105a70>] do_IRQ+0x94/0xaa
[<c0506300>] _spin_unlock_irq+0x20/0x2c
[<c0104832>] common_interrupt+0x2e/0x34
[<c0114703>] native_safe_halt+0x2/0x3
[<c0102c01>] default_idle+0x44/0x65
[<c010257f>] cpu_idle+0x42/0x50
[<c076ea09>] start_kernel+0x26b/0x270
[<c076e317>] unknown_bootoption+0x0/0x196
=======================
irq event stamp: 559190
hardirqs last enabled at (559190): [<c0507316>] kprobe_exceptions_notify+0x299/0x305
hardirqs last disabled at (559189): [<c05067bf>] do_int3+0x1d/0x95
softirqs last enabled at (559172): [<c010595f>] do_softirq+0x60/0xdd
softirqs last disabled at (559181): [<c010595f>] do_softirq+0x60/0xdd
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | arch/x86/kernel/traps_32.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/traps_64.c | 2 |
2 files changed, 4 insertions, 0 deletions
diff --git a/arch/x86/kernel/traps_32.c b/arch/x86/kernel/traps_32.c index 0a4c89382479..ef6010262597 100644 --- a/arch/x86/kernel/traps_32.c +++ b/arch/x86/kernel/traps_32.c | |||
@@ -833,6 +833,8 @@ fastcall void __kprobes do_debug(struct pt_regs * regs, long error_code) | |||
833 | unsigned int condition; | 833 | unsigned int condition; |
834 | struct task_struct *tsk = current; | 834 | struct task_struct *tsk = current; |
835 | 835 | ||
836 | trace_hardirqs_fixup(); | ||
837 | |||
836 | get_debugreg(condition, 6); | 838 | get_debugreg(condition, 6); |
837 | 839 | ||
838 | if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code, | 840 | if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code, |
diff --git a/arch/x86/kernel/traps_64.c b/arch/x86/kernel/traps_64.c index 1384e34a65a7..d11525ad81b4 100644 --- a/arch/x86/kernel/traps_64.c +++ b/arch/x86/kernel/traps_64.c | |||
@@ -853,6 +853,8 @@ asmlinkage void __kprobes do_debug(struct pt_regs * regs, | |||
853 | struct task_struct *tsk = current; | 853 | struct task_struct *tsk = current; |
854 | siginfo_t info; | 854 | siginfo_t info; |
855 | 855 | ||
856 | trace_hardirqs_fixup(); | ||
857 | |||
856 | get_debugreg(condition, 6); | 858 | get_debugreg(condition, 6); |
857 | 859 | ||
858 | if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code, | 860 | if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code, |