Message ID | 20100201063023.GT2996@kryten (mailing list archive) |
---|---|
State | Accepted, archived |
Delegated to: | Benjamin Herrenschmidt |
Headers | show |
On Mon, Feb 01, 2010 at 05:30:23PM +1100, Anton Blanchard wrote: > > PowerPC is currently using asm-generic/hardirq.h which statically allocates an > NR_CPUS irq_stat array. Switch to an arch specific implementation which uses > per cpu data: > > On a kernel with NR_CPUS=1024, this saves quite a lot of memory: > > text data bss dec hex filename > 8767938 2944132 1636796 13348866 cbb002 vmlinux.baseline > 8767779 2944260 1505724 13217763 c9afe3 vmlinux.irq_cpustat > > A saving of around 128kB. > > Signed-off-by: Anton Blanchard <anton@samba.org> > --- > > Index: linux-cpumask/arch/powerpc/include/asm/hardirq.h > =================================================================== > --- linux-cpumask.orig/arch/powerpc/include/asm/hardirq.h 2010-01-31 22:07:21.037211728 +1100 > +++ linux-cpumask/arch/powerpc/include/asm/hardirq.h 2010-02-01 17:28:56.990963256 +1100 > @@ -1 +1,22 @@ > -#include <asm-generic/hardirq.h> > +#ifndef _ASM_POWERPC_HARDIRQ_H > +#define _ASM_POWERPC_HARDIRQ_H > + > +#include <linux/threads.h> > +#include <linux/irq.h> > + > +typedef struct { > + unsigned int __softirq_pending; > +} ____cacheline_aligned irq_cpustat_t; No need to bother with an irq_cpustat_t type at all in this case, just declare a softirq_pending per-cpu variable.
On Mon, 2010-02-01 at 22:55 +0100, Christoph Hellwig wrote: > > +typedef struct { > > + unsigned int __softirq_pending; > > +} ____cacheline_aligned irq_cpustat_t; > > No need to bother with an irq_cpustat_t type at all in this case, just > declare a softirq_pending per-cpu variable. I think his subsequent patches add members to that struct for CE, MCE etc... stats. Cheers, Ben.
On Tue, Feb 02, 2010 at 10:07:10AM +1100, Benjamin Herrenschmidt wrote: > On Mon, 2010-02-01 at 22:55 +0100, Christoph Hellwig wrote: > > > > +typedef struct { > > > + unsigned int __softirq_pending; > > > +} ____cacheline_aligned irq_cpustat_t; > > > > No need to bother with an irq_cpustat_t type at all in this case, just > > declare a softirq_pending per-cpu variable. > > I think his subsequent patches add members to that struct for > CE, MCE etc... stats. Well, if you want those in a structure for arch-local reasons please give them an arch-local name. I really want to get rid of the current concept of a generic irq_cpustat_t - it doens't make much sense in it's current form. Instead the API will be the local_softirq_pending() function/macro with arch specific or a generic implementation.
Index: linux-cpumask/arch/powerpc/include/asm/hardirq.h =================================================================== --- linux-cpumask.orig/arch/powerpc/include/asm/hardirq.h 2010-01-31 22:07:21.037211728 +1100 +++ linux-cpumask/arch/powerpc/include/asm/hardirq.h 2010-02-01 17:28:56.990963256 +1100 @@ -1 +1,22 @@ -#include <asm-generic/hardirq.h> +#ifndef _ASM_POWERPC_HARDIRQ_H +#define _ASM_POWERPC_HARDIRQ_H + +#include <linux/threads.h> +#include <linux/irq.h> + +typedef struct { + unsigned int __softirq_pending; +} ____cacheline_aligned irq_cpustat_t; + +DECLARE_PER_CPU_SHARED_ALIGNED(irq_cpustat_t, irq_stat); + +#define __ARCH_IRQ_STAT + +#define local_softirq_pending() __get_cpu_var(irq_stat).__softirq_pending + +static inline void ack_bad_irq(unsigned int irq) +{ + printk(KERN_CRIT "unexpected IRQ trap at vector %02x\n", irq); +} + +#endif /* _ASM_POWERPC_HARDIRQ_H */ Index: linux-cpumask/arch/powerpc/kernel/irq.c =================================================================== --- linux-cpumask.orig/arch/powerpc/kernel/irq.c 2010-01-31 22:07:21.027213106 +1100 +++ linux-cpumask/arch/powerpc/kernel/irq.c 2010-02-01 17:28:56.880963661 +1100 @@ -73,6 +73,9 @@ #define CREATE_TRACE_POINTS #include <asm/trace.h> +DEFINE_PER_CPU_SHARED_ALIGNED(irq_cpustat_t, irq_stat); +EXPORT_PER_CPU_SYMBOL(irq_stat); + int __irq_offset_value; static int ppc_spurious_interrupts;
PowerPC is currently using asm-generic/hardirq.h which statically allocates an NR_CPUS irq_stat array. Switch to an arch specific implementation which uses per cpu data: On a kernel with NR_CPUS=1024, this saves quite a lot of memory: text data bss dec hex filename 8767938 2944132 1636796 13348866 cbb002 vmlinux.baseline 8767779 2944260 1505724 13217763 c9afe3 vmlinux.irq_cpustat A saving of around 128kB. Signed-off-by: Anton Blanchard <anton@samba.org> ---