genirq: Always apply cpu online mask
authorThomas Gleixner <tglx@linutronix.de>
Mon, 7 Feb 2011 16:05:08 +0000 (17:05 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Sat, 19 Feb 2011 11:58:07 +0000 (12:58 +0100)
If the affinity had been set by the user, then a later request_irq()
will honour that setting. But online cpus can have changed. So apply
the online mask and for this case as well.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
kernel/irq/manage.c

index 591c927b135cd3648bda90f3b47bd497c78d54a2..ade65bfb466d20cee486117e599f118fdc8f289e 100644 (file)
@@ -256,6 +256,8 @@ EXPORT_SYMBOL_GPL(irq_set_affinity_notifier);
  */
 static int setup_affinity(unsigned int irq, struct irq_desc *desc)
 {
+       struct cpumask *set = irq_default_affinity;
+
        /* Excludes PER_CPU and NO_BALANCE interrupts */
        if (!irq_can_set_affinity(irq))
                return 0;
@@ -265,15 +267,13 @@ static int setup_affinity(unsigned int irq, struct irq_desc *desc)
         * one of the targets is online.
         */
        if (desc->status & (IRQ_AFFINITY_SET)) {
-               if (cpumask_any_and(desc->irq_data.affinity, cpu_online_mask)
-                   < nr_cpu_ids)
-                       goto set_affinity;
+               if (cpumask_intersects(desc->irq_data.affinity,
+                                      cpu_online_mask))
+                       set = desc->irq_data.affinity;
                else
                        desc->status &= ~IRQ_AFFINITY_SET;
        }
-
-       cpumask_and(desc->irq_data.affinity, cpu_online_mask, irq_default_affinity);
-set_affinity:
+       cpumask_and(desc->irq_data.affinity, cpu_online_mask, set);
        desc->irq_data.chip->irq_set_affinity(&desc->irq_data, desc->irq_data.affinity, false);
 
        return 0;