powerpc: hard_irq_disable(): Call trace_hardirqs_off after disabling
authorScott Wood <scottwood@freescale.com>
Fri, 10 May 2013 03:09:41 +0000 (22:09 -0500)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Fri, 10 May 2013 07:01:09 +0000 (17:01 +1000)
lockdep.c has this:
        /*
         * So we're supposed to get called after you mask local IRQs,
         * but for some reason the hardware doesn't quite think you did
         * a proper job.
         */
if (DEBUG_LOCKS_WARN_ON(!irqs_disabled()))
return;

Since irqs_disabled() is based on soft_enabled(), that (not just the
hard EE bit) needs to be 0 before we call trace_hardirqs_off.

Signed-off-by: Scott Wood <scottwood@freescale.com>
arch/powerpc/include/asm/hw_irq.h

index d615b28..ba713f1 100644 (file)
@@ -96,11 +96,12 @@ static inline bool arch_irqs_disabled(void)
 #endif
 
 #define hard_irq_disable()     do {                    \
+       u8 _was_enabled = get_paca()->soft_enabled;     \
        __hard_irq_disable();                           \
-       if (local_paca->soft_enabled)                   \
-               trace_hardirqs_off();                   \
        get_paca()->soft_enabled = 0;                   \
        get_paca()->irq_happened |= PACA_IRQ_HARD_DIS;  \
+       if (_was_enabled)                               \
+               trace_hardirqs_off();                   \
 } while(0)
 
 static inline bool lazy_irq_pending(void)