diff options
Diffstat (limited to 'arch/x86/kernel/apic/io_apic.c')
-rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index e9e5b02c3af2..4e886efd9a15 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -2450,21 +2450,33 @@ unlock: | |||
2450 | irq_exit(); | 2450 | irq_exit(); |
2451 | } | 2451 | } |
2452 | 2452 | ||
2453 | static void irq_complete_move(struct irq_desc **descp) | 2453 | static void __irq_complete_move(struct irq_desc **descp, unsigned vector) |
2454 | { | 2454 | { |
2455 | struct irq_desc *desc = *descp; | 2455 | struct irq_desc *desc = *descp; |
2456 | struct irq_cfg *cfg = desc->chip_data; | 2456 | struct irq_cfg *cfg = desc->chip_data; |
2457 | unsigned vector, me; | 2457 | unsigned me; |
2458 | 2458 | ||
2459 | if (likely(!cfg->move_in_progress)) | 2459 | if (likely(!cfg->move_in_progress)) |
2460 | return; | 2460 | return; |
2461 | 2461 | ||
2462 | vector = ~get_irq_regs()->orig_ax; | ||
2463 | me = smp_processor_id(); | 2462 | me = smp_processor_id(); |
2464 | 2463 | ||
2465 | if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain)) | 2464 | if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain)) |
2466 | send_cleanup_vector(cfg); | 2465 | send_cleanup_vector(cfg); |
2467 | } | 2466 | } |
2467 | |||
2468 | static void irq_complete_move(struct irq_desc **descp) | ||
2469 | { | ||
2470 | __irq_complete_move(descp, ~get_irq_regs()->orig_ax); | ||
2471 | } | ||
2472 | |||
2473 | void irq_force_complete_move(int irq) | ||
2474 | { | ||
2475 | struct irq_desc *desc = irq_to_desc(irq); | ||
2476 | struct irq_cfg *cfg = desc->chip_data; | ||
2477 | |||
2478 | __irq_complete_move(&desc, cfg->vector); | ||
2479 | } | ||
2468 | #else | 2480 | #else |
2469 | static inline void irq_complete_move(struct irq_desc **descp) {} | 2481 | static inline void irq_complete_move(struct irq_desc **descp) {} |
2470 | #endif | 2482 | #endif |