Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 143a5d32 authored by Peter Zijlstra's avatar Peter Zijlstra
Browse files

lockdep: fixup irq tracing



Ensure we fixup the IRQ state before we hit any locking code.

Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent c9927c2b
Loading
Loading
Loading
Loading
+1 −6
Original line number Diff line number Diff line
@@ -564,12 +564,7 @@ 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
	trace_hardirqs_fixup_flags(regs->eflags);

	/*Restore back the original saved kprobes variables and continue. */
	if (kcb->kprobe_status == KPROBE_REENTER) {
+1 −6
Original line number Diff line number Diff line
@@ -551,12 +551,7 @@ 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
	trace_hardirqs_fixup_flags(regs->eflags);

	/* Restore the original saved kprobes variables and continue. */
	if (kcb->kprobe_status == KPROBE_REENTER) {
+2 −0
Original line number Diff line number Diff line
@@ -789,6 +789,8 @@ void restart_nmi(void)
#ifdef CONFIG_KPROBES
fastcall void __kprobes do_int3(struct pt_regs *regs, long error_code)
{
	trace_hardirqs_fixup();

	if (notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP)
			== NOTIFY_STOP)
		return;
+2 −0
Original line number Diff line number Diff line
@@ -807,6 +807,8 @@ asmlinkage __kprobes void default_do_nmi(struct pt_regs *regs)
/* runs on IST stack. */
asmlinkage void __kprobes do_int3(struct pt_regs * regs, long error_code)
{
	trace_hardirqs_fixup();

	if (notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP) == NOTIFY_STOP) {
		return;
	}
+5 −0
Original line number Diff line number Diff line
@@ -303,6 +303,11 @@ fastcall void __kprobes do_page_fault(struct pt_regs *regs,
	int write, si_code;
	int fault;

	/*
	 * We can fault from pretty much anywhere, with unknown IRQ state.
	 */
	trace_hardirqs_fixup();

	/* get the address */
        address = read_cr2();

Loading