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:32 -0400
committerIngo Molnar <mingo@elte.hu>2009-11-02 09:56:35 -0500
commit84e21493a3b28c9fefe99fe827fc0c0c101a813d (patch)
tree5e879cd8a6ed1e927eccc60a515b6006c8b915c3 /arch/x86/kernel/irq.c
parent7a7732bc0f7c46f217dbec723f25366b6285cc42 (diff)
x86, intr-remap: Avoid irq_chip mask/unmask in fixup_irqs() for intr-remapping
In the presence of interrupt-remapping, irqs will be migrated in the process context and we don't do (and there is no need to) irq_chip mask/unmask while migrating the interrupt. Similarly fix the fixup_irqs() that get called during cpu offline and avoid calling irq_chip mask/unmask for irqs that are ok to be migrated in the process context. While we didn't observe any race condition with the existing code, this change takes complete advantage of interrupt-remapping in the newer generation platforms and avoids any potential HW lockup's (that often worry Eric :) Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Acked-by: Eric W. Biederman <ebiederm@xmission.com> Cc: garyhade@us.ibm.com LKML-Reference: <20091026230001.661423939@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.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
index 3ea66556e5e1..342bcbca19b4 100644
--- a/arch/x86/kernel/irq.c
+++ b/arch/x86/kernel/irq.c
@@ -310,7 +310,7 @@ void fixup_irqs(void)
310 affinity = cpu_all_mask; 310 affinity = cpu_all_mask;
311 } 311 }
312 312
313 if (desc->chip->mask) 313 if (!(desc->status & IRQ_MOVE_PCNTXT) && desc->chip->mask)
314 desc->chip->mask(irq); 314 desc->chip->mask(irq);
315 315
316 if (desc->chip->set_affinity) 316 if (desc->chip->set_affinity)
@@ -318,7 +318,7 @@ void fixup_irqs(void)
318 else if (!(warned++)) 318 else if (!(warned++))
319 set_affinity = 0; 319 set_affinity = 0;
320 320
321 if (desc->chip->unmask) 321 if (!(desc->status & IRQ_MOVE_PCNTXT) && desc->chip->unmask)
322 desc->chip->unmask(irq); 322 desc->chip->unmask(irq);
323 323
324 spin_unlock(&desc->lock); 324 spin_unlock(&desc->lock);