aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86_64
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2006-10-04 05:16:30 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-10-04 10:55:26 -0400
commit0be6652f1e61b647f738eb25af057bf9551a9841 (patch)
tree369f9cda9b30edc9bc170d19e928f00888d15518 /arch/x86_64
parente7b946e98a456077dd6897f726f3d6197bd7e3b9 (diff)
[PATCH] genirq: x86_64 irq: Reenable migrating irqs to other cpus
In the latest changes the code for migrating x86_64 irqs was dropped. This reads it in a fashion that will work even if we change the vector on level triggered irqs when we migrate them. [akpm@osdl.org: build fix] Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Rajesh Shah <rajesh.shah@intel.com> Cc: Andi Kleen <ak@muc.de> Cc: "Protasevich, Natalie" <Natalie.Protasevich@UNISYS.com> Cc: "Luck, Tony" <tony.luck@intel.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/x86_64')
-rw-r--r--arch/x86_64/kernel/io_apic.c36
1 files changed, 33 insertions, 3 deletions
diff --git a/arch/x86_64/kernel/io_apic.c b/arch/x86_64/kernel/io_apic.c
index e1d1b4217cb2..12dd938f5d54 100644
--- a/arch/x86_64/kernel/io_apic.c
+++ b/arch/x86_64/kernel/io_apic.c
@@ -1254,18 +1254,48 @@ static int ioapic_retrigger_vector(unsigned int vector)
1254 * races. 1254 * races.
1255 */ 1255 */
1256 1256
1257static void ack_apic(unsigned int vector) 1257static void ack_apic(unsigned int irq)
1258{ 1258{
1259 ack_APIC_irq(); 1259 ack_APIC_irq();
1260} 1260}
1261 1261
1262static void ack_apic_edge(unsigned int irq)
1263{
1264 move_native_irq(irq);
1265 ack_APIC_irq();
1266}
1267
1268static void ack_apic_level(unsigned int irq)
1269{
1270 int do_unmask_irq = 0;
1271
1272#if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE)
1273 /* If we are moving the irq we need to mask it */
1274 if (unlikely(irq_desc[irq].status & IRQ_MOVE_PENDING)) {
1275 do_unmask_irq = 1;
1276 mask_IO_APIC_irq(irq);
1277 }
1278#endif
1279
1280 /*
1281 * We must acknowledge the irq before we move it or the acknowledge will
1282 * not propogate properly.
1283 */
1284 ack_APIC_irq();
1285
1286 /* Now we can move and renable the irq */
1287 move_masked_irq(irq);
1288 if (unlikely(do_unmask_irq))
1289 unmask_IO_APIC_irq(irq);
1290}
1291
1262static struct irq_chip ioapic_chip __read_mostly = { 1292static struct irq_chip ioapic_chip __read_mostly = {
1263 .name = "IO-APIC", 1293 .name = "IO-APIC",
1264 .startup = startup_ioapic_vector, 1294 .startup = startup_ioapic_vector,
1265 .mask = mask_ioapic_vector, 1295 .mask = mask_ioapic_vector,
1266 .unmask = unmask_ioapic_vector, 1296 .unmask = unmask_ioapic_vector,
1267 .ack = ack_apic, 1297 .ack = ack_apic_edge,
1268 .eoi = ack_apic, 1298 .eoi = ack_apic_level,
1269#ifdef CONFIG_SMP 1299#ifdef CONFIG_SMP
1270 .set_affinity = set_ioapic_affinity_vector, 1300 .set_affinity = set_ioapic_affinity_vector,
1271#endif 1301#endif