aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/apic/io_apic.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel/apic/io_apic.c')
-rw-r--r--arch/x86/kernel/apic/io_apic.c18
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
2453static void irq_complete_move(struct irq_desc **descp) 2453static 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
2468static void irq_complete_move(struct irq_desc **descp)
2469{
2470 __irq_complete_move(descp, ~get_irq_regs()->orig_ax);
2471}
2472
2473void 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
2469static inline void irq_complete_move(struct irq_desc **descp) {} 2481static inline void irq_complete_move(struct irq_desc **descp) {}
2470#endif 2482#endif