[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86: fix IRQ migration when using directed EOI (broken with c/s 20465)
# HG changeset patch # User Keir Fraser <keir@xxxxxxx> # Date 1291234227 0 # Node ID 62bf12040b0f4d802dc7e1cd61294776c8a41a89 # Parent 8420b82c22c2cad54860ffdbe8bcec21c65c86be x86: fix IRQ migration when using directed EOI (broken with c/s 20465) In directed-EOI mode, there is no chance to do the migration in mask_and_ack_level_ioapic_irq(), as the remote IRR bit can't possibly be clear after issuing the EOI to the LAPIC. Consequently, there's no point to even try. Instead, migration must be done in end_level_ioapic_irq(), and it requires masking the interrupt source prior to issuing the EOI to the IO-APIC. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx> --- xen/arch/x86/io_apic.c | 27 ++++++++++++++++++++------- 1 files changed, 20 insertions(+), 7 deletions(-) diff -r 8420b82c22c2 -r 62bf12040b0f xen/arch/x86/io_apic.c --- a/xen/arch/x86/io_apic.c Tue Nov 30 11:34:08 2010 +0000 +++ b/xen/arch/x86/io_apic.c Wed Dec 01 20:10:27 2010 +0000 @@ -1634,11 +1634,14 @@ static void mask_and_ack_level_ioapic_ir ack_APIC_irq(); + if ( directed_eoi_enabled ) + return; + if ((irq_desc[irq].status & IRQ_MOVE_PENDING) && !io_apic_level_ack_pending(irq)) - move_native_irq(irq); - - if (!directed_eoi_enabled && !(v & (1 << (i & 0x1f)))) { + move_masked_irq(irq); + + if ( !(v & (1 << (i & 0x1f))) ) { atomic_inc(&irq_mis_count); spin_lock(&ioapic_lock); __edge_IO_APIC_irq(irq); @@ -1654,12 +1657,22 @@ static void end_level_ioapic_irq (unsign if ( !ioapic_ack_new ) { - if ( irq_desc[irq].status & IRQ_DISABLED ) - return; - if ( directed_eoi_enabled ) + { + if ( !(irq_desc[irq].status & (IRQ_DISABLED|IRQ_MOVE_PENDING)) ) + { + eoi_IO_APIC_irq(irq); + return; + } + + mask_IO_APIC_irq(irq); eoi_IO_APIC_irq(irq); - else + if ( (irq_desc[irq].status & IRQ_MOVE_PENDING) && + !io_apic_level_ack_pending(irq) ) + move_masked_irq(irq); + } + + if ( !(irq_desc[irq].status & IRQ_DISABLED) ) unmask_IO_APIC_irq(irq); return; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |