Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / kernel / irq / proc.c
index 33fe32e..d03b5ee 100644 (file)
@@ -10,6 +10,8 @@
 #include <linux/proc_fs.h>
 #include <linux/interrupt.h>
 
+#include "internals.h"
+
 static struct proc_dir_entry *root_irq_dir, *irq_dir[NR_IRQS];
 
 #ifdef CONFIG_SMP
@@ -19,6 +21,23 @@ static struct proc_dir_entry *root_irq_dir, *irq_dir[NR_IRQS];
  */
 static struct proc_dir_entry *smp_affinity_entry[NR_IRQS];
 
+#ifdef CONFIG_GENERIC_PENDING_IRQ
+void proc_set_irq_affinity(unsigned int irq, cpumask_t mask_val)
+{
+       /*
+        * Save these away for later use. Re-progam when the
+        * interrupt is pending
+        */
+       set_pending_irq(irq, mask_val);
+}
+#else
+void proc_set_irq_affinity(unsigned int irq, cpumask_t mask_val)
+{
+       irq_affinity[irq] = mask_val;
+       irq_desc[irq].handler->set_affinity(irq, mask_val);
+}
+#endif
+
 static int irq_affinity_read_proc(char *page, char **start, off_t off,
                                  int count, int *eof, void *data)
 {
@@ -51,10 +70,11 @@ static int irq_affinity_write_proc(struct file *file, const char __user *buffer,
         */
        cpus_and(tmp, new_value, cpu_online_map);
        if (cpus_empty(tmp))
-               return -EINVAL;
+               /* Special case for empty set - allow the architecture
+                  code to set default SMP affinity. */
+               return select_smp_affinity(irq) ? -EINVAL : full_count;
 
-       irq_affinity[irq] = new_value;
-       irq_desc[irq].handler->set_affinity(irq, new_value);
+       proc_set_irq_affinity(irq, new_value);
 
        return full_count;
 }