diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2006-10-04 05:16:30 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-04 10:55:26 -0400 |
commit | 0be6652f1e61b647f738eb25af057bf9551a9841 (patch) | |
tree | 369f9cda9b30edc9bc170d19e928f00888d15518 /arch/x86_64 | |
parent | e7b946e98a456077dd6897f726f3d6197bd7e3b9 (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.c | 36 |
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 | ||
1257 | static void ack_apic(unsigned int vector) | 1257 | static void ack_apic(unsigned int irq) |
1258 | { | 1258 | { |
1259 | ack_APIC_irq(); | 1259 | ack_APIC_irq(); |
1260 | } | 1260 | } |
1261 | 1261 | ||
1262 | static void ack_apic_edge(unsigned int irq) | ||
1263 | { | ||
1264 | move_native_irq(irq); | ||
1265 | ack_APIC_irq(); | ||
1266 | } | ||
1267 | |||
1268 | static 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 | |||
1262 | static struct irq_chip ioapic_chip __read_mostly = { | 1292 | static 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 |