]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - kernel/irq/migration.c
Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
[linux-2.6-omap-h63xx.git] / kernel / irq / migration.c
index 9b234df810d008d6f44f22448fbeee44e86975d1..77b7acc875c5df6755954161736b72918fff49ad 100644 (file)
@@ -12,7 +12,7 @@ void set_pending_irq(unsigned int irq, cpumask_t mask)
        spin_unlock_irqrestore(&desc->lock, flags);
 }
 
-void move_native_irq(int irq)
+void move_masked_irq(int irq)
 {
        struct irq_desc *desc = irq_desc + irq;
        cpumask_t tmp;
@@ -48,15 +48,28 @@ void move_native_irq(int irq)
         * when an active trigger is comming in. This could
         * cause some ioapics to mal-function.
         * Being paranoid i guess!
+        *
+        * For correct operation this depends on the caller
+        * masking the irqs.
         */
        if (likely(!cpus_empty(tmp))) {
-               if (likely(!(desc->status & IRQ_DISABLED)))
-                       desc->chip->disable(irq);
-
                desc->chip->set_affinity(irq,tmp);
-
-               if (likely(!(desc->status & IRQ_DISABLED)))
-                       desc->chip->enable(irq);
        }
        cpus_clear(irq_desc[irq].pending_mask);
 }
+
+void move_native_irq(int irq)
+{
+       struct irq_desc *desc = irq_desc + irq;
+
+       if (likely(!(desc->status & IRQ_MOVE_PENDING)))
+               return;
+
+       if (unlikely(desc->status & IRQ_DISABLED))
+               return;
+
+       desc->chip->mask(irq);
+       move_masked_irq(irq);
+       desc->chip->unmask(irq);
+}
+