x86: arch_probe_nr_irqs
authorYinghai Lu <yinghai@kernel.org>
Tue, 13 Jan 2009 01:39:24 +0000 (17:39 -0800)
committerMike Travis <travis@sgi.com>
Tue, 13 Jan 2009 01:39:24 +0000 (17:39 -0800)
Impact: save RAM with large NR_CPUS, get smaller nr_irqs

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Mike Travis <travis@sgi.com>
arch/x86/include/asm/irq_vectors.h
arch/x86/kernel/io_apic.c
include/linux/interrupt.h
kernel/irq/handle.c
kernel/softirq.c

index 602361ad0e746a5c8dadd8975a6c5b1b16a571a9..a16a2ab2b42998a964d20c990ba88365d07bdfe4 100644 (file)
 # endif
 #else
 
-/* defined as a macro so nr_irqs = max_nr_irqs(nr_cpu_ids) can be used */
-# define max_nr_irqs(nr_cpus)                          \
-       ((8 * nr_cpus) > (32 * MAX_IO_APICS) ?          \
+# define NR_IRQS                                       \
+       ((8 * NR_CPUS) > (32 * MAX_IO_APICS) ?          \
                (NR_VECTORS + (8 * NR_CPUS)) :          \
                (NR_VECTORS + (32 * MAX_IO_APICS)))     \
 
-# define NR_IRQS max_nr_irqs(NR_CPUS)
-
 #endif
 
 #elif defined(CONFIG_X86_VOYAGER)
index ae80638012dec8c93bf33c908b90dcbbbe8f509c..157986916cd1f88a60fcd119f40ce1bdc0fcf2f8 100644 (file)
@@ -3850,6 +3850,22 @@ void __init probe_nr_irqs_gsi(void)
                nr_irqs_gsi = nr;
 }
 
+#ifdef CONFIG_SPARSE_IRQ
+int __init arch_probe_nr_irqs(void)
+{
+       int nr;
+
+       nr = ((8 * nr_cpu_ids) > (32 * nr_ioapics) ?
+               (NR_VECTORS + (8 * nr_cpu_ids)) :
+               (NR_VECTORS + (32 * nr_ioapics)));
+
+       if (nr < nr_irqs && nr > nr_irqs_gsi)
+               nr_irqs = nr;
+
+       return 0;
+}
+#endif
+
 /* --------------------------------------------------------------------------
                           ACPI-based IOAPIC Configuration
    -------------------------------------------------------------------------- */
index 9127f6b51a39a0fac962030a1cedde2cdadd13b7..472f11765f608318093ed82919f5c7fdf4f00a7d 100644 (file)
@@ -467,6 +467,7 @@ int show_interrupts(struct seq_file *p, void *v);
 struct irq_desc;
 
 extern int early_irq_init(void);
+extern int arch_probe_nr_irqs(void);
 extern int arch_early_irq_init(void);
 extern int arch_init_chip_data(struct irq_desc *desc, int cpu);
 
index 04d3e46031e51f71ca62ccc0015a6f9b3ac8c660..375d68cd5bf0dd298d90d8d2c3ccb7764c5506b8 100644 (file)
@@ -59,10 +59,6 @@ EXPORT_SYMBOL_GPL(nr_irqs);
 
 #ifdef CONFIG_SPARSE_IRQ
 
-#ifndef max_nr_irqs
-#define max_nr_irqs(nr_cpus)   NR_IRQS
-#endif
-
 static struct irq_desc irq_desc_init = {
        .irq        = -1,
        .status     = IRQ_DISABLED,
@@ -137,9 +133,8 @@ int __init early_irq_init(void)
        int legacy_count;
        int i;
 
-       /* initialize nr_irqs based on nr_cpu_ids */
-       nr_irqs = max_nr_irqs(nr_cpu_ids);
-
+        /* 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);
 
        desc = irq_desc_legacy;
index bdbe9de9cd8d7091771201f232747bf30a83e467..0365b4899a3d37e17c9f7fe4042e7ed3b4d0617b 100644 (file)
@@ -795,6 +795,11 @@ int __init __weak early_irq_init(void)
        return 0;
 }
 
+int __init __weak arch_probe_nr_irqs(void)
+{
+       return 0;
+}
+
 int __init __weak arch_early_irq_init(void)
 {
        return 0;