vserver 2.0 rc7
[linux-2.6.git] / arch / ppc64 / kernel / irq.c
index 3a0f67c..4fd7f20 100644 (file)
@@ -61,6 +61,7 @@ extern void iSeries_smp_message_recv( struct pt_regs * );
 #endif
 
 extern irq_desc_t irq_desc[NR_IRQS];
+EXPORT_SYMBOL(irq_desc);
 
 int distribute_irqs = 1;
 int __irq_offset_value;
@@ -115,6 +116,35 @@ skip:
        return 0;
 }
 
+#ifdef CONFIG_HOTPLUG_CPU
+void fixup_irqs(cpumask_t map)
+{
+       unsigned int irq;
+       static int warned;
+
+       for_each_irq(irq) {
+               cpumask_t mask;
+
+               if (irq_desc[irq].status & IRQ_PER_CPU)
+                       continue;
+
+               cpus_and(mask, irq_affinity[irq], map);
+               if (any_online_cpu(mask) == NR_CPUS) {
+                       printk("Breaking affinity for irq %i\n", irq);
+                       mask = map;
+               }
+               if (irq_desc[irq].handler->set_affinity)
+                       irq_desc[irq].handler->set_affinity(irq, mask);
+               else if (irq_desc[irq].action && !(warned++))
+                       printk("Cannot set affinity for irq %i\n", irq);
+       }
+
+       local_irq_enable();
+       mdelay(1);
+       local_irq_disable();
+}
+#endif
+
 extern int noirqdebug;
 
 /*