diff options
author | Daniel Mentz <danielmentz@google.com> | 2016-08-04 20:56:53 -0400 |
---|---|---|
committer | Vineet Gupta <vgupta@synopsys.com> | 2016-08-10 13:14:07 -0400 |
commit | 18b43e89d295cc65151c505c643c98fb2c320e59 (patch) | |
tree | 6a4b3936ca2d3fbfdb577f6525d18b468f19879c | |
parent | 29b4817d4018df78086157ea3a55c1d9424a7cfc (diff) |
ARC: Call trace_hardirqs_on() before enabling irqs
trace_hardirqs_on_caller() in lockdep.c expects to be called before, not
after interrupts are actually enabled.
The following comment in kernel/locking/lockdep.c substantiates this
claim:
"
/*
* We're enabling irqs and according to our state above irqs weren't
* already enabled, yet we find the hardware thinks they are in fact
* enabled.. someone messed up their IRQ state tracing.
*/
"
An example can be found in include/linux/irqflags.h:
do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0)
Without this change, we hit the following DEBUG_LOCKS_WARN_ON.
[ 7.760000] ------------[ cut here ]------------
[ 7.760000] WARNING: CPU: 0 PID: 1 at kernel/locking/lockdep.c:2711 resume_user_mode_begin+0x48/0xf0
[ 7.770000] DEBUG_LOCKS_WARN_ON(!irqs_disabled())
[ 7.780000] Modules linked in:
[ 7.780000] CPU: 0 PID: 1 Comm: init Not tainted 4.7.0-00003-gc668bb9-dirty #366
[ 7.790000]
[ 7.790000] Stack Trace:
[ 7.790000] arc_unwind_core.constprop.1+0xa4/0x118
[ 7.800000] warn_slowpath_fmt+0x72/0x158
[ 7.800000] resume_user_mode_begin+0x48/0xf0
[ 7.810000] ---[ end trace 6f6a7a8fae20d2f0 ]---
Signed-off-by: Daniel Mentz <danielmentz@google.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
-rw-r--r-- | arch/arc/include/asm/irqflags-compact.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/arc/include/asm/irqflags-compact.h b/arch/arc/include/asm/irqflags-compact.h index c1d36458bfb7..4c6eed80cd8b 100644 --- a/arch/arc/include/asm/irqflags-compact.h +++ b/arch/arc/include/asm/irqflags-compact.h | |||
@@ -188,10 +188,10 @@ static inline int arch_irqs_disabled(void) | |||
188 | .endm | 188 | .endm |
189 | 189 | ||
190 | .macro IRQ_ENABLE scratch | 190 | .macro IRQ_ENABLE scratch |
191 | TRACE_ASM_IRQ_ENABLE | ||
191 | lr \scratch, [status32] | 192 | lr \scratch, [status32] |
192 | or \scratch, \scratch, (STATUS_E1_MASK | STATUS_E2_MASK) | 193 | or \scratch, \scratch, (STATUS_E1_MASK | STATUS_E2_MASK) |
193 | flag \scratch | 194 | flag \scratch |
194 | TRACE_ASM_IRQ_ENABLE | ||
195 | .endm | 195 | .endm |
196 | 196 | ||
197 | #endif /* __ASSEMBLY__ */ | 197 | #endif /* __ASSEMBLY__ */ |