Commit 18b98872 authored by Andi Kleen's avatar Andi Kleen Committed by Linus Torvalds

[PATCH] x86_64: Fix lost edge triggered irqs on UP kernel

Patch from Petr Vandrovec <vandrove@vc.cvut.cz>

Recently I've observed problems with IDE disks while running UP kernel on
x86-64 - it complained a lot about lost irq from hda/hdc.  I tracked
problem down to the problem that at enable_irq() code calls
hw_resend_irq(), but on x86-64 hw_resend_irq() does something useful only
when CONFIG_SMP is defined, on UP systems it does nothing.

Due to this IRQ is lost - and when IDE retries command, it can again happen
that IRQ is delivered before IDE code does enable_irq(), and again and
again, unless due to drive being lazy finally once kernel does enable_irq()
before drive prepares its answer, and things move forward ...  to next lost
IRQ.
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent d7408126
...@@ -130,7 +130,7 @@ __asm__( \ ...@@ -130,7 +130,7 @@ __asm__( \
"push $" #nr "-256 ; " \ "push $" #nr "-256 ; " \
"jmp common_interrupt"); "jmp common_interrupt");
#if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_SMP) #if defined(CONFIG_X86_IO_APIC)
static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) { static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {
if (IO_APIC_IRQ(i)) if (IO_APIC_IRQ(i))
send_IPI_self(IO_APIC_VECTOR(i)); send_IPI_self(IO_APIC_VECTOR(i));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment