From 143a5d325d35efb1b29dcb8d6031cf27107e183a Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Thu, 25 Oct 2007 14:01:10 +0200 Subject: lockdep: fixup irq tracing Ensure we fixup the IRQ state before we hit any locking code. Signed-off-by: Peter Zijlstra Signed-off-by: Ingo Molnar --- include/asm-x86/irqflags_32.h | 21 +++++++++++++++++++++ include/asm-x86/irqflags_64.h | 20 ++++++++++++++++++++ 2 files changed, 41 insertions(+) (limited to 'include/asm-x86') diff --git a/include/asm-x86/irqflags_32.h b/include/asm-x86/irqflags_32.h index d058b04e008..4c7720089cb 100644 --- a/include/asm-x86/irqflags_32.h +++ b/include/asm-x86/irqflags_32.h @@ -129,6 +129,27 @@ static inline int raw_irqs_disabled(void) return raw_irqs_disabled_flags(flags); } + +/* + * makes the traced hardirq state match with the machine state + * + * should be a rarely used function, only in places where its + * otherwise impossible to know the irq state, like in traps. + */ +static inline void trace_hardirqs_fixup_flags(unsigned long flags) +{ + if (raw_irqs_disabled_flags(flags)) + trace_hardirqs_off(); + else + trace_hardirqs_on(); +} + +static inline void trace_hardirqs_fixup(void) +{ + unsigned long flags = __raw_local_save_flags(); + + trace_hardirqs_fixup_flags(flags); +} #endif /* __ASSEMBLY__ */ /* diff --git a/include/asm-x86/irqflags_64.h b/include/asm-x86/irqflags_64.h index 5341ea1f815..bb9163bb29d 100644 --- a/include/asm-x86/irqflags_64.h +++ b/include/asm-x86/irqflags_64.h @@ -111,6 +111,26 @@ static inline int raw_irqs_disabled(void) return raw_irqs_disabled_flags(flags); } +/* + * makes the traced hardirq state match with the machine state + * + * should be a rarely used function, only in places where its + * otherwise impossible to know the irq state, like in traps. + */ +static inline void trace_hardirqs_fixup_flags(unsigned long flags) +{ + if (raw_irqs_disabled_flags(flags)) + trace_hardirqs_off(); + else + trace_hardirqs_on(); +} + +static inline void trace_hardirqs_fixup(void) +{ + unsigned long flags = __raw_local_save_flags(); + + trace_hardirqs_fixup_flags(flags); +} /* * Used in the idle loop; sti takes one instruction cycle * to complete: -- cgit v1.2.3