Patchwork [1/7] powerpc: Reduce footprint of irq_stat

login
register
mail settings
Submitter Anton Blanchard
Date Feb. 1, 2010, 6:30 a.m.
Message ID <20100201063023.GT2996@kryten>
Download mbox | patch
Permalink /patch/44159/
State Accepted
Delegated to: Benjamin Herrenschmidt
Headers show

Comments

Anton Blanchard - Feb. 1, 2010, 6:30 a.m.
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>
---
Christoph Hellwig - Feb. 1, 2010, 9:55 p.m.
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.
Benjamin Herrenschmidt - Feb. 1, 2010, 11:07 p.m.
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.
Christoph Hellwig - Feb. 2, 2010, 8:19 a.m.
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.

Patch

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;