From 599808d6a87caa19b21f48a0dd8f4e576d17ee6c Mon Sep 17 00:00:00 2001 From: "Eric W. Biederman" Date: Wed, 4 Oct 2006 02:16:30 -0700 Subject: [PATCH] --- yaml --- r: 38413 b: refs/heads/master c: 0be6652f1e61b647f738eb25af057bf9551a9841 h: refs/heads/master i: 38411: e93e3614397b16bbce51a108221998f8eb55c8d6 v: v3 --- [refs] | 2 +- trunk/arch/x86_64/kernel/io_apic.c | 36 +++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 8f09841c0dee..2ba977da9115 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e7b946e98a456077dd6897f726f3d6197bd7e3b9 +refs/heads/master: 0be6652f1e61b647f738eb25af057bf9551a9841 diff --git a/trunk/arch/x86_64/kernel/io_apic.c b/trunk/arch/x86_64/kernel/io_apic.c index e1d1b4217cb2..12dd938f5d54 100644 --- a/trunk/arch/x86_64/kernel/io_apic.c +++ b/trunk/arch/x86_64/kernel/io_apic.c @@ -1254,18 +1254,48 @@ static int ioapic_retrigger_vector(unsigned int vector) * races. */ -static void ack_apic(unsigned int vector) +static void ack_apic(unsigned int irq) { ack_APIC_irq(); } +static void ack_apic_edge(unsigned int irq) +{ + move_native_irq(irq); + ack_APIC_irq(); +} + +static void ack_apic_level(unsigned int irq) +{ + int do_unmask_irq = 0; + +#if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE) + /* If we are moving the irq we need to mask it */ + if (unlikely(irq_desc[irq].status & IRQ_MOVE_PENDING)) { + do_unmask_irq = 1; + mask_IO_APIC_irq(irq); + } +#endif + + /* + * We must acknowledge the irq before we move it or the acknowledge will + * not propogate properly. + */ + ack_APIC_irq(); + + /* Now we can move and renable the irq */ + move_masked_irq(irq); + if (unlikely(do_unmask_irq)) + unmask_IO_APIC_irq(irq); +} + static struct irq_chip ioapic_chip __read_mostly = { .name = "IO-APIC", .startup = startup_ioapic_vector, .mask = mask_ioapic_vector, .unmask = unmask_ioapic_vector, - .ack = ack_apic, - .eoi = ack_apic, + .ack = ack_apic_edge, + .eoi = ack_apic_level, #ifdef CONFIG_SMP .set_affinity = set_ioapic_affinity_vector, #endif