| summaryrefslogtreecommitdiff |
| author | Thomas Gleixner <tglx@linutronix.de> | 2010-04-02 08:51:09 (GMT) |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2010-04-02 09:15:06 (GMT) |
| commit | 35b5256e0c4f29f334cc85aaf501ecbc8159c51f (patch) (unidiff) | |
| tree | ce0264b81e64ba0d24ff521aedd0b79d31943fd2 | |
| parent | 6e331ac4aa62c2d8a27898b9bf8976f0554b9e52 (diff) | |
x86: Fix irq off tracing for 32 bit
John reported a irq off tracing splat with the following debug info:
irq event stamp: 5988
hardirqs last enabled at (5987): [<c13e4696>]
_raw_spin_unlock_irqrestore+0x49/0x8f
hardirqs last disabled at (5988): [<c13e4ce3>] call_function_interrupt+0x2f/0x3c
softirqs last enabled at (0): [<c10470a6>] copy_process+0x3b6/0x15ad
softirqs last disabled at (0): [<(null)>] (null)
8139too Fast Ethernet driver 0.9.28
irq event stamp: 10638
hardirqs last enabled at (10637): [<c13e4696>]
_raw_spin_unlock_irqrestore+0x49/0x8f
hardirqs last disabled at (10638): [<c13e4feb>] apic_timer_interrupt+0x2f/0x3c
softirqs last enabled at (0): [<c10470a6>] copy_process+0x3b6/0x15ad
softirqs last disabled at (0): [<(null)>] (null)
irq event stamp: 2914
hardirqs last enabled at (2913): [<c13e4696>]
_raw_spin_unlock_irqrestore+0x49/0x8f
hardirqs last disabled at (2914): [<c13e4feb>] apic_timer_interrupt+0x2f/0x3c
softirqs last enabled at (0): [<c10470a6>] copy_process+0x3b6/0x15ad
softirqs last disabled at (0): [<(null)>] (null)
There is a TRACE_IRQ_IRET annotation missing in the preempt code path.
Reported-by: John Kacur <jkacur@redhat.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
| -rw-r--r-- | arch/x86/kernel/entry_32.S | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 57d3849..3dc8593 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
| @@ -375,15 +375,18 @@ END(ret_from_exception) | |||
| 375 | ENTRY(resume_kernel) | 375 | ENTRY(resume_kernel) |
| 376 | DISABLE_INTERRUPTS(CLBR_ANY) | 376 | DISABLE_INTERRUPTS(CLBR_ANY) |
| 377 | cmpl $0,TI_preempt_count(%ebp)# non-zero preempt_count ? | 377 | cmpl $0,TI_preempt_count(%ebp)# non-zero preempt_count ? |
| 378 | jnz restore_nocheck | 378 | jnz restore_nocheck_trace |
| 379 | need_resched: | 379 | need_resched: |
| 380 | movl TI_flags(%ebp), %ecx# need_resched set ? | 380 | movl TI_flags(%ebp), %ecx# need_resched set ? |
| 381 | testb $_TIF_NEED_RESCHED, %cl | 381 | testb $_TIF_NEED_RESCHED, %cl |
| 382 | jz restore_nocheck | 382 | jz restore_nocheck_trace |
| 383 | testl $X86_EFLAGS_IF,PT_EFLAGS(%esp)# interrupts off (exception path) ? | 383 | testl $X86_EFLAGS_IF,PT_EFLAGS(%esp)# interrupts off (exception path) ? |
| 384 | jz restore_nocheck | 384 | jz restore_nocheck_trace |
| 385 | call preempt_schedule_irq | 385 | call preempt_schedule_irq |
| 386 | jmp need_resched | 386 | jmp need_resched |
| 387 | restore_nocheck_trace: | ||
| 388 | TRACE_IRQS_IRET | ||
| 389 | jmp restore_nocheck | ||
| 387 | END(resume_kernel) | 390 | END(resume_kernel) |
| 388 | #endif | 391 | #endif |
| 389 | CFI_ENDPROC | 392 | CFI_ENDPROC |