lkml.org 
[lkml]   [2009]   [Jan]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH] x86: arch_probe_nr_irqs
    Yinghai Lu wrote:
    > Impact: save RAM with large NR_CPUS, get smaller nr_irqs
    >
    > Signed-off-by: Yinghai Lu <yinghai@kernel.org>

    Built and tested on an 8-core intel system. Great reduction
    in NR_IRQS:

    [ 0.000000] NR_IRQS:33024 nr_irqs:320

    Thanks Yinghai!

    Ingo - shall I push this one as well? (If not, then you
    can add my:

    Acked-by: Mike Travis <travis@sgi.com>

    Thanks,
    Mike

    >
    > ---
    > arch/x86/include/asm/irq_vectors.h | 7 ++-----
    > arch/x86/kernel/io_apic.c | 16 ++++++++++++++++
    > include/linux/interrupt.h | 1 +
    > kernel/irq/handle.c | 9 ++-------
    > kernel/softirq.c | 5 +++++
    > 5 files changed, 26 insertions(+), 12 deletions(-)
    >
    > Index: linux-2.6/arch/x86/include/asm/irq_vectors.h
    > ===================================================================
    > --- linux-2.6.orig/arch/x86/include/asm/irq_vectors.h
    > +++ linux-2.6/arch/x86/include/asm/irq_vectors.h
    > @@ -120,14 +120,11 @@
    > # 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: linux-2.6/arch/x86/kernel/io_apic.c
    > ===================================================================
    > --- linux-2.6.orig/arch/x86/kernel/io_apic.c
    > +++ linux-2.6/arch/x86/kernel/io_apic.c
    > @@ -3851,6 +3851,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: linux-2.6/include/linux/interrupt.h
    > ===================================================================
    > --- linux-2.6.orig/include/linux/interrupt.h
    > +++ linux-2.6/include/linux/interrupt.h
    > @@ -481,6 +481,7 @@ int show_interrupts(struct seq_file *p,
    > 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: linux-2.6/kernel/irq/handle.c
    > ===================================================================
    > --- linux-2.6.orig/kernel/irq/handle.c
    > +++ linux-2.6/kernel/irq/handle.c
    > @@ -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: linux-2.6/kernel/softirq.c
    > ===================================================================
    > --- linux-2.6.orig/kernel/softirq.c
    > +++ linux-2.6/kernel/softirq.c
    > @@ -806,6 +806,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;



    \
     
     \ /
      Last update: 2009-01-13 00:09    [W:0.050 / U:0.676 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site