cpumask: fixes and updates for kernel/irq/manage.c

Make irq_default_affinity a cpumask_var_t.

Also, fix the use in arch/alpha.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Mike Travis <travis@sgi.com>
---
 arch/alpha/kernel/irq.c   |    3 ++-
 include/linux/interrupt.h |    2 +-
 kernel/irq/manage.c       |   11 ++++++++---
 kernel/irq/proc.c         |    2 +-
 4 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c
--- a/arch/alpha/kernel/irq.c
+++ b/arch/alpha/kernel/irq.c
@@ -51,7 +51,8 @@ int irq_select_affinity(unsigned int irq
 		return 1;
 
 	/* FIXME: This has an out-by-one error: inc then test! */
-	while (!cpu_possible(cpu) || !cpu_isset(cpu, irq_default_affinity))
+	while (!cpu_possible(cpu) ||
+	       !cpumask_test_cpu(cpu, irq_default_affinity))
 		cpu = (cpu < (nr_cpu_ids-1) ? cpu + 1 : 0);
 	last_cpu = cpu;
 
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -107,7 +107,7 @@ extern void enable_irq(unsigned int irq)
 
 #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_HARDIRQS)
 
-extern const struct cpumask *irq_default_affinity;
+extern cpumask_var_t irq_default_affinity;
 
 extern int irq_set_affinity(unsigned int irq, const struct cpumask *cpumask);
 extern int irq_can_set_affinity(unsigned int irq);
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -16,10 +16,15 @@
 #include "internals.h"
 
 #ifdef CONFIG_SMP
+cpumask_var_t irq_default_affinity;
 
-/* FIXME: Make this a cpumask_var_t. */
-static DECLARE_BITMAP(irq_def_affinity_bits, NR_CPUS) = CPU_BITS_ALL;
-const struct cpumask *irq_default_affinity = to_cpumask(irq_def_affinity_bits);
+static int init_irq_default_affinity(void)
+{
+	alloc_cpumask_var(&irq_default_affinity, GFP_KERNEL);
+	cpumask_setall(irq_default_affinity);
+	return 0;
+}
+core_initcall(init_irq_default_affinity);
 
 /**
  *	synchronize_irq - wait for pending IRQ handlers (on other CPUs)
diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c
--- a/kernel/irq/proc.c
+++ b/kernel/irq/proc.c
@@ -126,7 +126,7 @@ static ssize_t default_affinity_write(st
 		goto out;
 	}
 
-	cpumask_copy(to_cpumask(cpumask_bits(irq_default_affinity)), new_value);
+	cpumask_copy(irq_default_affinity, new_value);
 	err = count;
 
 out:
