]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - kernel/irq/migration.c
[PATCH] IRQ: prevent enabling of previously disabled interrupt
[linux-2.6-omap-h63xx.git] / kernel / irq / migration.c
index 6bdd03c524c763108dc7e956b2dd95f743c1b3a5..52a8655fa080047a64cf3dc39635d28c2183abb7 100644 (file)
@@ -18,9 +18,17 @@ void move_native_irq(int irq)
        cpumask_t tmp;
        irq_desc_t *desc = irq_descp(irq);
 
-       if (likely (!desc->move_irq))
+       if (likely(!desc->move_irq))
                return;
 
+       /*
+        * Paranoia: cpu-local interrupts shouldn't be calling in here anyway.
+        */
+       if (CHECK_IRQ_PER_CPU(desc->status)) {
+               WARN_ON(1);
+               return;
+       }
+
        desc->move_irq = 0;
 
        if (likely(cpus_empty(pending_irq_cpumask[irq])))
@@ -29,7 +37,8 @@ void move_native_irq(int irq)
        if (!desc->handler->set_affinity)
                return;
 
-       /* note - we hold the desc->lock */
+       assert_spin_locked(&desc->lock);
+
        cpus_and(tmp, pending_irq_cpumask[irq], cpu_online_map);
 
        /*
@@ -42,9 +51,13 @@ void move_native_irq(int irq)
         * Being paranoid i guess!
         */
        if (unlikely(!cpus_empty(tmp))) {
-               desc->handler->disable(irq);
+               if (likely(!(desc->status & IRQ_DISABLED)))
+                       desc->handler->disable(irq);
+
                desc->handler->set_affinity(irq,tmp);
-               desc->handler->enable(irq);
+
+               if (likely(!(desc->status & IRQ_DISABLED)))
+                       desc->handler->enable(irq);
        }
        cpus_clear(pending_irq_cpumask[irq]);
 }