From: Peter Zijlstra kprobes disables irqs for jprobes, but does not tell lockdep about it. This resolves this warning during an allyesconfig bzImage bootup test: [ 423.670337] WARNING: at kernel/lockdep.c:2658 check_flags() [ 423.670341] [] show_trace_log_lvl+0x19/0x2e [ 423.670348] [] show_trace+0x12/0x14 [ 423.670350] [] dump_stack+0x14/0x16 [ 423.670353] [] check_flags+0x95/0x142 [ 423.670357] [] lock_acquire+0x52/0xb8 [ 423.670360] [] _spin_lock+0x2e/0x58 [ 423.670365] [] jtcp_rcv_established+0x6e/0x189 [ 423.670369] [] tcp_v4_do_rcv+0x30b/0x620 [ 423.670373] [] tcp_v4_rcv+0x89d/0x8fa [ 423.670376] [] ip_local_deliver+0x17d/0x225 [ 423.670380] [] ip_rcv+0x493/0x4ce [ 423.670383] [] netif_receive_skb+0x347/0x365 [ 423.670388] [] nv_napi_poll+0x501/0x6c3 [ 423.670393] [] net_rx_action+0xa3/0x1b6 [ 423.670396] [] __do_softirq+0x76/0xfb [ 423.670400] [] do_softirq+0x75/0xf3 Cc: Prasanna S Panchamukhi Cc: Ananth N Mavinakayanahalli Cc: Anil S Keshavamurthy Cc: David S. Miller Signed-off-by: Peter Zijlstra Signed-off-by: Ingo Molnar Cc: Signed-off-by: Andrew Morton --- diff -puN arch/i386/kernel/kprobes.c~lockdep-annotate-kprobes-irq-fiddling arch/i386/kernel/kprobes.c --- a/arch/i386/kernel/kprobes.c~lockdep-annotate-kprobes-irq-fiddling +++ a/arch/i386/kernel/kprobes.c @@ -565,6 +565,13 @@ static int __kprobes post_kprobe_handler resume_execution(cur, regs, kcb); regs->eflags |= kcb->kprobe_saved_eflags; +#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT + if (raw_irqs_disabled_flags(regs->eflags)) { + trace_hardirqs_off(); + } else { + trace_hardirqs_on(); + } +#endif /*Restore back the original saved kprobes variables and continue. */ if (kcb->kprobe_status == KPROBE_REENTER) { @@ -701,6 +708,7 @@ int __kprobes setjmp_pre_handler(struct memcpy(kcb->jprobes_stack, (kprobe_opcode_t *)addr, MIN_STACK_SIZE(addr)); regs->eflags &= ~IF_MASK; + trace_hardirqs_off(); regs->eip = (unsigned long)(jp->entry); return 1; } diff -puN arch/x86_64/kernel/kprobes.c~lockdep-annotate-kprobes-irq-fiddling arch/x86_64/kernel/kprobes.c --- a/arch/x86_64/kernel/kprobes.c~lockdep-annotate-kprobes-irq-fiddling +++ a/arch/x86_64/kernel/kprobes.c @@ -552,6 +552,13 @@ int __kprobes post_kprobe_handler(struct resume_execution(cur, regs, kcb); regs->eflags |= kcb->kprobe_saved_rflags; +#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT + if (raw_irqs_disabled_flags(regs->eflags)) { + trace_hardirqs_off(); + } else { + trace_hardirqs_on(); + } +#endif /* Restore the original saved kprobes variables and continue. */ if (kcb->kprobe_status == KPROBE_REENTER) { @@ -691,6 +698,7 @@ int __kprobes setjmp_pre_handler(struct memcpy(kcb->jprobes_stack, (kprobe_opcode_t *)addr, MIN_STACK_SIZE(addr)); regs->eflags &= ~IF_MASK; + trace_hardirqs_off(); regs->rip = (unsigned long)(jp->entry); return 1; } _