lockdep: annotate kprobes irq fiddling
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] [<c0107f01>] show_trace_log_lvl+0x19/0x2e [ 423.670348] [<c0107ffa>] show_trace+0x12/0x14 [ 423.670350] [<c0108010>] dump_stack+0x14/0x16 [ 423.670353] [<c015249d>] check_flags+0x95/0x142 [ 423.670357] [<c0155576>] lock_acquire+0x52/0xb8 [ 423.670360] [<c1313c90>] _spin_lock+0x2e/0x58 [ 423.670365] [<c11b72f9>] jtcp_rcv_established+0x6e/0x189 [ 423.670369] [<c11810da>] tcp_v4_do_rcv+0x30b/0x620 [ 423.670373] [<c1181c8c>] tcp_v4_rcv+0x89d/0x8fa [ 423.670376] [<c1167dba>] ip_local_deliver+0x17d/0x225 [ 423.670380] [<c11682f5>] ip_rcv+0x493/0x4ce [ 423.670383] [<c11177ef>] netif_receive_skb+0x347/0x365 [ 423.670388] [<c07b6e7b>] nv_napi_poll+0x501/0x6c3 [ 423.670393] [<c1115b1a>] net_rx_action+0xa3/0x1b6 [ 423.670396] [<c013bdee>] __do_softirq+0x76/0xfb [ 423.670400] [<c0109189>] do_softirq+0x75/0xf3 [ akpm: checkpatch.pl cleanups ] Cc: Prasanna S Panchamukhi <prasanna@in.ibm.com> Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com> Cc: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> Cc: David S. Miller <davem@davemloft.net> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
851a67b825
commit
58dfe883d3
2 changed files with 14 additions and 0 deletions
|
@ -557,6 +557,12 @@ static int __kprobes post_kprobe_handler(struct pt_regs *regs)
|
|||
|
||||
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) {
|
||||
|
@ -694,6 +700,7 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
|
|||
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;
|
||||
}
|
||||
|
|
|
@ -544,6 +544,12 @@ int __kprobes post_kprobe_handler(struct pt_regs *regs)
|
|||
|
||||
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) {
|
||||
|
@ -684,6 +690,7 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
|
|||
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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue