diff options
-rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 085e60e303cf..b377b973899e 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -2583,6 +2583,20 @@ static void ack_apic_level(unsigned int irq) | |||
2583 | */ | 2583 | */ |
2584 | ack_APIC_irq(); | 2584 | ack_APIC_irq(); |
2585 | 2585 | ||
2586 | /* Tail end of version 0x11 I/O APIC bug workaround */ | ||
2587 | if (!(v & (1 << (i & 0x1f)))) { | ||
2588 | atomic_inc(&irq_mis_count); | ||
2589 | |||
2590 | if (use_eoi_reg) | ||
2591 | eoi_ioapic_irq(desc); | ||
2592 | else { | ||
2593 | spin_lock(&ioapic_lock); | ||
2594 | __mask_and_edge_IO_APIC_irq(cfg); | ||
2595 | __unmask_and_level_IO_APIC_irq(cfg); | ||
2596 | spin_unlock(&ioapic_lock); | ||
2597 | } | ||
2598 | } | ||
2599 | |||
2586 | /* Now we can move and renable the irq */ | 2600 | /* Now we can move and renable the irq */ |
2587 | if (unlikely(do_unmask_irq)) { | 2601 | if (unlikely(do_unmask_irq)) { |
2588 | /* Only migrate the irq if the ack has been received. | 2602 | /* Only migrate the irq if the ack has been received. |
@@ -2616,20 +2630,6 @@ static void ack_apic_level(unsigned int irq) | |||
2616 | move_masked_irq(irq); | 2630 | move_masked_irq(irq); |
2617 | unmask_IO_APIC_irq_desc(desc); | 2631 | unmask_IO_APIC_irq_desc(desc); |
2618 | } | 2632 | } |
2619 | |||
2620 | /* Tail end of version 0x11 I/O APIC bug workaround */ | ||
2621 | if (!(v & (1 << (i & 0x1f)))) { | ||
2622 | atomic_inc(&irq_mis_count); | ||
2623 | |||
2624 | if (use_eoi_reg) | ||
2625 | eoi_ioapic_irq(desc); | ||
2626 | else { | ||
2627 | spin_lock(&ioapic_lock); | ||
2628 | __mask_and_edge_IO_APIC_irq(cfg); | ||
2629 | __unmask_and_level_IO_APIC_irq(cfg); | ||
2630 | spin_unlock(&ioapic_lock); | ||
2631 | } | ||
2632 | } | ||
2633 | } | 2633 | } |
2634 | 2634 | ||
2635 | #ifdef CONFIG_INTR_REMAP | 2635 | #ifdef CONFIG_INTR_REMAP |