|
@@ -83,16 +83,17 @@ asmlinkage unsigned int do_IRQ(struct pt_regs *regs)
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
-void fixup_irqs(cpumask_t map)
|
|
|
|
|
|
+/* A cpu has been removed from cpu_online_mask. Reset irq affinities. */
|
|
|
|
+void fixup_irqs(void)
|
|
{
|
|
{
|
|
unsigned int irq;
|
|
unsigned int irq;
|
|
static int warned;
|
|
static int warned;
|
|
struct irq_desc *desc;
|
|
struct irq_desc *desc;
|
|
|
|
|
|
for_each_irq_desc(irq, desc) {
|
|
for_each_irq_desc(irq, desc) {
|
|
- cpumask_t mask;
|
|
|
|
int break_affinity = 0;
|
|
int break_affinity = 0;
|
|
int set_affinity = 1;
|
|
int set_affinity = 1;
|
|
|
|
+ const struct cpumask *affinity;
|
|
|
|
|
|
if (!desc)
|
|
if (!desc)
|
|
continue;
|
|
continue;
|
|
@@ -102,23 +103,23 @@ void fixup_irqs(cpumask_t map)
|
|
/* interrupt's are disabled at this point */
|
|
/* interrupt's are disabled at this point */
|
|
spin_lock(&desc->lock);
|
|
spin_lock(&desc->lock);
|
|
|
|
|
|
|
|
+ affinity = &desc->affinity;
|
|
if (!irq_has_action(irq) ||
|
|
if (!irq_has_action(irq) ||
|
|
- cpus_equal(desc->affinity, map)) {
|
|
|
|
|
|
+ cpumask_equal(affinity, cpu_online_mask)) {
|
|
spin_unlock(&desc->lock);
|
|
spin_unlock(&desc->lock);
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
- cpus_and(mask, desc->affinity, map);
|
|
|
|
- if (cpus_empty(mask)) {
|
|
|
|
|
|
+ if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) {
|
|
break_affinity = 1;
|
|
break_affinity = 1;
|
|
- mask = map;
|
|
|
|
|
|
+ affinity = cpu_all_mask;
|
|
}
|
|
}
|
|
|
|
|
|
if (desc->chip->mask)
|
|
if (desc->chip->mask)
|
|
desc->chip->mask(irq);
|
|
desc->chip->mask(irq);
|
|
|
|
|
|
if (desc->chip->set_affinity)
|
|
if (desc->chip->set_affinity)
|
|
- desc->chip->set_affinity(irq, &mask);
|
|
|
|
|
|
+ desc->chip->set_affinity(irq, affinity);
|
|
else if (!(warned++))
|
|
else if (!(warned++))
|
|
set_affinity = 0;
|
|
set_affinity = 0;
|
|
|
|
|