diff options
Diffstat (limited to 'arch/x86/kernel/apic/io_apic.c')
| -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)  	 */  	ack_APIC_irq(); +	/* Tail end of version 0x11 I/O APIC bug workaround */ +	if (!(v & (1 << (i & 0x1f)))) { +		atomic_inc(&irq_mis_count); + +		if (use_eoi_reg) +			eoi_ioapic_irq(desc); +		else { +			spin_lock(&ioapic_lock); +			__mask_and_edge_IO_APIC_irq(cfg); +			__unmask_and_level_IO_APIC_irq(cfg); +			spin_unlock(&ioapic_lock); +		} +	} +  	/* Now we can move and renable the irq */  	if (unlikely(do_unmask_irq)) {  		/* Only migrate the irq if the ack has been received. @@ -2616,20 +2630,6 @@ static void ack_apic_level(unsigned int irq)  			move_masked_irq(irq);  		unmask_IO_APIC_irq_desc(desc);  	} - -	/* Tail end of version 0x11 I/O APIC bug workaround */ -	if (!(v & (1 << (i & 0x1f)))) { -		atomic_inc(&irq_mis_count); - -		if (use_eoi_reg) -			eoi_ioapic_irq(desc); -		else { -			spin_lock(&ioapic_lock); -			__mask_and_edge_IO_APIC_irq(cfg); -			__unmask_and_level_IO_APIC_irq(cfg); -			spin_unlock(&ioapic_lock); -		} -	}  }  #ifdef CONFIG_INTR_REMAP | 
