|
@@ -290,30 +290,33 @@ u64 arch_irq_stat_cpu(unsigned int cpu)
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
|
-void fixup_irqs(cpumask_t map)
|
|
|
+void fixup_irqs(const struct cpumask *map)
|
|
|
{
|
|
|
struct irq_desc *desc;
|
|
|
unsigned int irq;
|
|
|
static int warned;
|
|
|
+ cpumask_var_t mask;
|
|
|
|
|
|
- for_each_irq(irq) {
|
|
|
- cpumask_t mask;
|
|
|
+ alloc_cpumask_var(&mask, GFP_KERNEL);
|
|
|
|
|
|
+ for_each_irq(irq) {
|
|
|
desc = irq_to_desc(irq);
|
|
|
if (desc && desc->status & IRQ_PER_CPU)
|
|
|
continue;
|
|
|
|
|
|
- cpumask_and(&mask, desc->affinity, &map);
|
|
|
- if (any_online_cpu(mask) == NR_CPUS) {
|
|
|
+ cpumask_and(mask, desc->affinity, map);
|
|
|
+ if (cpumask_any(mask) >= nr_cpu_ids) {
|
|
|
printk("Breaking affinity for irq %i\n", irq);
|
|
|
- mask = map;
|
|
|
+ cpumask_copy(mask, map);
|
|
|
}
|
|
|
if (desc->chip->set_affinity)
|
|
|
- desc->chip->set_affinity(irq, &mask);
|
|
|
+ desc->chip->set_affinity(irq, mask);
|
|
|
else if (desc->action && !(warned++))
|
|
|
printk("Cannot set affinity for irq %i\n", irq);
|
|
|
}
|
|
|
|
|
|
+ free_cpumask_var(mask);
|
|
|
+
|
|
|
local_irq_enable();
|
|
|
mdelay(1);
|
|
|
local_irq_disable();
|