genirq: Query arch for number of early descriptors
authorThomas Gleixner <tglx@linutronix.de>
Mon, 27 Sep 2010 18:55:03 +0000 (20:55 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 12 Oct 2010 14:39:08 +0000 (16:39 +0200)
sparse irq sets up NR_IRQS_LEGACY irq descriptors and archs then go
ahead and allocate more.

Use the unused return value of arch_probe_nr_irqs() to let the
architecture return the number of early allocations. Fix up all users.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Ingo Molnar <mingo@elte.hu>
arch/arm/kernel/irq.c
arch/sh/kernel/irq.c
arch/x86/kernel/apic/io_apic.c
include/linux/irq.h
kernel/irq/irqdesc.c
kernel/softirq.c

index c0d5c3b..5456d11 100644 (file)
@@ -157,10 +157,8 @@ void __init init_IRQ(void)
        struct irq_desc *desc;
        int irq;
 
-       for (irq = 0; irq < nr_irqs; irq++) {
-               desc = irq_to_desc_alloc_node(irq, 0);
+       for (irq = 0; irq < nr_irqs; irq++)
                desc->status |= IRQ_NOREQUEST | IRQ_NOPROBE;
-       }
 
        init_arch_irq();
 }
@@ -169,7 +167,7 @@ void __init init_IRQ(void)
 int __init arch_probe_nr_irqs(void)
 {
        nr_irqs = arch_nr_irqs ? arch_nr_irqs : NR_IRQS;
-       return 0;
+       return nr_irqs;
 }
 #endif
 
index 257de1f..ae5bac3 100644 (file)
@@ -290,7 +290,7 @@ void __init init_IRQ(void)
 int __init arch_probe_nr_irqs(void)
 {
        nr_irqs = sh_mv.mv_nr_irqs;
-       return 0;
+       return NR_IRQS_LEGACY;
 }
 #endif
 
index f1efeba..5aee1d1 100644 (file)
@@ -3880,7 +3880,7 @@ int __init arch_probe_nr_irqs(void)
        if (nr < nr_irqs)
                nr_irqs = nr;
 
-       return 0;
+       return NR_IRQS_LEGACY;
 }
 #endif
 
index 096b74d..ef87882 100644 (file)
@@ -214,6 +214,10 @@ struct irq_chip {
  */
 #include <asm/hw_irq.h>
 
+#ifndef NR_IRQS_LEGACY
+# define NR_IRQS_LEGACY 0
+#endif
+
 #ifndef ARCH_IRQ_INIT_FLAGS
 # define ARCH_IRQ_INIT_FLAGS   0
 #endif
index 7cbe4f9..a1fbd1d 100644 (file)
@@ -226,16 +226,16 @@ struct irq_desc * __ref irq_to_desc_alloc_node(unsigned int irq, int node)
 
 int __init early_irq_init(void)
 {
-       int i, node = first_online_node;
+       int i, initcnt, node = first_online_node;
        struct irq_desc *desc;
 
        init_irq_default_affinity();
 
-        /* initialize nr_irqs based on nr_cpu_ids */
-       arch_probe_nr_irqs();
-       printk(KERN_INFO "NR_IRQS:%d nr_irqs:%d\n", NR_IRQS, nr_irqs);
+       /* Let arch update nr_irqs and return the nr of preallocated irqs */
+       initcnt = arch_probe_nr_irqs();
+       printk(KERN_INFO "NR_IRQS:%d nr_irqs:%d %d\n", NR_IRQS, nr_irqs, initcnt);
 
-       for (i = 0; i < NR_IRQS_LEGACY; i++) {
+       for (i = 0; i < initcnt; i++) {
                desc = alloc_desc(i, node);
                set_bit(i, allocated_irqs);
                irq_insert_desc(i, desc);
index 07b4f1b..14a7b80 100644 (file)
@@ -886,9 +886,10 @@ int __init __weak early_irq_init(void)
        return 0;
 }
 
+#ifdef CONFIG_GENERIC_HARDIRQS
 int __init __weak arch_probe_nr_irqs(void)
 {
-       return 0;
+       return NR_IRQS_LEGACY;
 }
 
 int __init __weak arch_early_irq_init(void)
@@ -900,3 +901,4 @@ int __weak arch_init_chip_data(struct irq_desc *desc, int node)
 {
        return 0;
 }
+#endif