aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/irq.c
diff options
context:
space:
mode:
authorSuresh Siddha <suresh.b.siddha@intel.com>2009-10-26 18:24:34 -0400
committerIngo Molnar <mingo@elte.hu>2009-11-02 09:56:36 -0500
commita5e74b841930bec78a4684ab9f208b2ddfe7c736 (patch)
tree46af59815263c8f16269a80ffb511788aee1ee74 /arch/x86/kernel/irq.c
parent23359a88e7eca3c4f402562b102f23014db3c2aa (diff)
x86: Force irq complete move during cpu offline
When a cpu goes offline, fixup_irqs() try to move irq's currently destined to the offline cpu to a new cpu. But this attempt will fail if the irq is recently moved to this cpu and the irq still hasn't arrived at this cpu (for non intr-remapping platforms this is when we free the vector allocation at the previous destination) that is about to go offline. This will endup with the interrupt subsystem still pointing the irq to the offline cpu, causing that irq to not work any more. Fix this by forcing the irq to complete its move (its been a long time we moved the irq to this cpu which we are offlining now) and then move this irq to a new cpu before this cpu goes offline. Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Acked-by: Gary Hade <garyhade@us.ibm.com> Cc: Eric W. Biederman <ebiederm@xmission.com> LKML-Reference: <20091026230001.848830905@sbs-t61.sc.intel.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/irq.c')
-rw-r--r--arch/x86/kernel/irq.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
index 342bcbca19b4..b10a5e1da06c 100644
--- a/arch/x86/kernel/irq.c
+++ b/arch/x86/kernel/irq.c
@@ -305,6 +305,13 @@ void fixup_irqs(void)
305 continue; 305 continue;
306 } 306 }
307 307
308 /*
309 * Complete the irq move. This cpu is going down and for
310 * non intr-remapping case, we can't wait till this interrupt
311 * arrives at this cpu before completing the irq move.
312 */
313 irq_force_complete_move(irq);
314
308 if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) { 315 if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) {
309 break_affinity = 1; 316 break_affinity = 1;
310 affinity = cpu_all_mask; 317 affinity = cpu_all_mask;