Re: [PATCH] CHECK_IRQ_PER_CPU() to avoid dead code in __do_IRQ()

2005-08-09 Thread Zwane Mwaikambo
On Mon, 8 Aug 2005, Alexander Nyberg wrote:

> > IRQ_PER_CPU is not used by all architectures.
> > This patch introduces the macros
> > ARCH_HAS_IRQ_PER_CPU and CHECK_IRQ_PER_CPU() to avoid the generation of
> > dead code in __do_IRQ().
> > 
> > ARCH_HAS_IRQ_PER_CPU is defined by architectures using
> > IRQ_PER_CPU in their
> > include/asm_ARCH/irq.h
> > file.
> > 
> > Through grepping the tree I found the following
> > architectures currently use IRQ_PER_CPU:
> > 
> > cris, ia64, ppc, ppc64 and parisc. 
> > 
> 
> There are many places where one could replace run-time tests with 
> #ifdef's but it makes reading more difficult (and in longer terms
> maintainence). Have you benchmarked any workload that benefits 
> from this?

I doubt you'd be able to collect convincing benchmark data, but skipping a 
branch (possibly mispredicted) is worth it IMO.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] CHECK_IRQ_PER_CPU() to avoid dead code in __do_IRQ()

2005-08-09 Thread Zwane Mwaikambo
On Mon, 8 Aug 2005, Alexander Nyberg wrote:

  IRQ_PER_CPU is not used by all architectures.
  This patch introduces the macros
  ARCH_HAS_IRQ_PER_CPU and CHECK_IRQ_PER_CPU() to avoid the generation of
  dead code in __do_IRQ().
  
  ARCH_HAS_IRQ_PER_CPU is defined by architectures using
  IRQ_PER_CPU in their
  include/asm_ARCH/irq.h
  file.
  
  Through grepping the tree I found the following
  architectures currently use IRQ_PER_CPU:
  
  cris, ia64, ppc, ppc64 and parisc. 
  
 
 There are many places where one could replace run-time tests with 
 #ifdef's but it makes reading more difficult (and in longer terms
 maintainence). Have you benchmarked any workload that benefits 
 from this?

I doubt you'd be able to collect convincing benchmark data, but skipping a 
branch (possibly mispredicted) is worth it IMO.
-
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] CHECK_IRQ_PER_CPU() to avoid dead code in __do_IRQ()

2005-08-08 Thread Zachary Amsden

Karsten Wiese wrote:


Am Montag, 8. August 2005 13:19 schrieb Alexander Nyberg:
 

There are many places where one could replace run-time tests with 
#ifdef's but it makes reading more difficult (and in longer terms
maintainence). Have you benchmarked any workload that benefits 
from this?
   



Performance gain is small, but measurable: 0,02%
Tested on an Atlon64 running at 1000MHz.
I took this value from 9 runs (each with/without the patch) of 
	$ time lame x.wav

where each took about 1 minute.
3000 Interrupts/s were generated at the time by running
$ jackd -R -dalsa -p64 -n2

0,02% really isn't that muchbut Athlon64 is better than P4
with branch predictions, I think.

Erm... ok, I won't insist on having this patch applied ;-) 


  Karsten
 



Removing dead code is always good - 0.02% is small, but if 100 kernel 
developers all did the same, that adds up to 2% rather quickly, and that 
is nothing to sneeze at.  I like your patch, but you should add some 
comments for maintainability about what CHECK_IRQ_PER_CPU does - see 
include/asm-generic/pgtable.h for similar styling.  If also probably 
doesn't hurt to leave IRQ_PER_CPU defined even when 
ARCH_HAS_CHECK_IRQ_PER_CPU is not, since it looks cleaner and prevents 
future collisions with bits defined inside of an #ifdef.


Zach
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] CHECK_IRQ_PER_CPU() to avoid dead code in __do_IRQ()

2005-08-08 Thread Karsten Wiese
Am Montag, 8. August 2005 13:19 schrieb Alexander Nyberg:
> 
> There are many places where one could replace run-time tests with 
> #ifdef's but it makes reading more difficult (and in longer terms
> maintainence). Have you benchmarked any workload that benefits 
> from this?

Performance gain is small, but measurable: 0,02%
Tested on an Atlon64 running at 1000MHz.
I took this value from 9 runs (each with/without the patch) of 
$ time lame x.wav
where each took about 1 minute.
3000 Interrupts/s were generated at the time by running
$ jackd -R -dalsa -p64 -n2

0,02% really isn't that muchbut Athlon64 is better than P4
with branch predictions, I think.

Erm... ok, I won't insist on having this patch applied ;-) 

   Karsten





___ 
Gesendet von Yahoo! Mail - Jetzt mit 1GB Speicher kostenlos - Hier anmelden: 
http://mail.yahoo.de

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] CHECK_IRQ_PER_CPU() to avoid dead code in __do_IRQ()

2005-08-08 Thread Alexander Nyberg
> 
> IRQ_PER_CPU is not used by all architectures.
> This patch introduces the macros
> ARCH_HAS_IRQ_PER_CPU and CHECK_IRQ_PER_CPU() to avoid the generation of
> dead code in __do_IRQ().
> 
> ARCH_HAS_IRQ_PER_CPU is defined by architectures using
> IRQ_PER_CPU in their
> include/asm_ARCH/irq.h
> file.
> 
> Through grepping the tree I found the following
> architectures currently use IRQ_PER_CPU:
> 
> cris, ia64, ppc, ppc64 and parisc. 
> 

There are many places where one could replace run-time tests with 
#ifdef's but it makes reading more difficult (and in longer terms
maintainence). Have you benchmarked any workload that benefits 
from this?

> 
> diff -upr linux-2.6.13-rc6/include/asm-cris/irq.h 
> linux-2.6.13/include/asm-cris/irq.h
> --- linux-2.6.13-rc6/include/asm-cris/irq.h   2005-08-08 11:46:10.0 
> +0200
> +++ linux-2.6.13/include/asm-cris/irq.h   2005-08-08 11:41:12.0 
> +0200
> @@ -1,6 +1,11 @@
>  #ifndef _ASM_IRQ_H
>  #define _ASM_IRQ_H
>  
> +/*
> + * IRQ line status macro IRQ_PER_CPU is used
> + */
> +#define ARCH_HAS_IRQ_PER_CPU
> +
>  #include 
>  
>  extern __inline__ int irq_canonicalize(int irq)
> diff -upr linux-2.6.13-rc6/include/asm-ia64/irq.h 
> linux-2.6.13/include/asm-ia64/irq.h
> --- linux-2.6.13-rc6/include/asm-ia64/irq.h   2005-03-02 08:38:33.0 
> +0100
> +++ linux-2.6.13/include/asm-ia64/irq.h   2005-08-06 18:06:53.0 
> +0200
> @@ -14,6 +14,11 @@
>  #define NR_IRQS  256
>  #define NR_IRQ_VECTORS   NR_IRQS
>  
> +/*
> + * IRQ line status macro IRQ_PER_CPU is used
> + */
> +#define ARCH_HAS_IRQ_PER_CPU
> +
>  static __inline__ int
>  irq_canonicalize (int irq)
>  {
> diff -upr linux-2.6.13-rc6/include/asm-parisc/irq.h 
> linux-2.6.13/include/asm-parisc/irq.h
> --- linux-2.6.13-rc6/include/asm-parisc/irq.h 2005-08-08 11:45:26.0 
> +0200
> +++ linux-2.6.13/include/asm-parisc/irq.h 2005-08-06 18:05:22.0 
> +0200
> @@ -26,6 +26,11 @@
>  
>  #define NR_IRQS  (CPU_IRQ_MAX + 1)
>  
> +/*
> + * IRQ line status macro IRQ_PER_CPU is used
> + */
> +#define ARCH_HAS_IRQ_PER_CPU
> +
>  static __inline__ int irq_canonicalize(int irq)
>  {
>   return (irq == 2) ? 9 : irq;
> diff -upr linux-2.6.13-rc6/include/asm-ppc/irq.h 
> linux-2.6.13/include/asm-ppc/irq.h
> --- linux-2.6.13-rc6/include/asm-ppc/irq.h2005-08-08 11:46:10.0 
> +0200
> +++ linux-2.6.13/include/asm-ppc/irq.h2005-08-08 11:41:14.0 
> +0200
> @@ -19,6 +19,11 @@
>  #define IRQ_POLARITY_POSITIVE0x2 /* high level or low->high edge 
> */
>  #define IRQ_POLARITY_NEGATIVE0x0 /* low level or high->low edge 
> */
>  
> +/*
> + * IRQ line status macro IRQ_PER_CPU is used
> + */
> +#define ARCH_HAS_IRQ_PER_CPU
> +
>  #if defined(CONFIG_40x)
>  #include 
>  
> diff -upr linux-2.6.13-rc6/include/asm-ppc64/irq.h 
> linux-2.6.13/include/asm-ppc64/irq.h
> --- linux-2.6.13-rc6/include/asm-ppc64/irq.h  2005-03-02 08:38:33.0 
> +0100
> +++ linux-2.6.13/include/asm-ppc64/irq.h  2005-08-06 18:06:58.0 
> +0200
> @@ -33,6 +33,11 @@
>  #define IRQ_POLARITY_POSITIVE0x2 /* high level or low->high edge 
> */
>  #define IRQ_POLARITY_NEGATIVE0x0 /* low level or high->low edge 
> */
>  
> +/*
> + * IRQ line status macro IRQ_PER_CPU is used
> + */
> +#define ARCH_HAS_IRQ_PER_CPU
> +
>  #define get_irq_desc(irq) (_desc[(irq)])
>  
>  /* Define a way to iterate across irqs. */
> diff -upr linux-2.6.13-rc6/include/linux/irq.h 
> linux-2.6.13/include/linux/irq.h
> --- linux-2.6.13-rc6/include/linux/irq.h  2005-08-08 11:46:10.0 
> +0200
> +++ linux-2.6.13/include/linux/irq.h  2005-08-08 11:55:11.0 +0200
> @@ -32,7 +32,12 @@
>  #define IRQ_WAITING  32  /* IRQ not yet seen - for autodetection */
>  #define IRQ_LEVEL64  /* IRQ level triggered */
>  #define IRQ_MASKED   128 /* IRQ masked - shouldn't be seen again */
> -#define IRQ_PER_CPU  256 /* IRQ is per CPU */
> +#if defined(ARCH_HAS_IRQ_PER_CPU)
> +# define IRQ_PER_CPU 256 /* IRQ is per CPU */
> +# define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU)
> +#else
> +# define CHECK_IRQ_PER_CPU(var) 0
> +#endif
>  
>  /*
>   * Interrupt controller descriptor. This is all we need
> diff -upr linux-2.6.13-rc6/kernel/irq/handle.c 
> linux-2.6.13/kernel/irq/handle.c
> --- linux-2.6.13-rc6/kernel/irq/handle.c  2005-08-08 11:46:11.0 
> +0200
> +++ linux-2.6.13/kernel/irq/handle.c  2005-08-08 11:53:00.0 +0200
> @@ -111,7 +111,7 @@ fastcall unsigned int __do_IRQ(unsigned 
>   unsigned int status;
>  
>   kstat_this_cpu.irqs[irq]++;
> - if (desc->status & IRQ_PER_CPU) {
> + if (CHECK_IRQ_PER_CPU(desc->status)) {
>   irqreturn_t action_ret;
>  
>   /*
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  

[PATCH] CHECK_IRQ_PER_CPU() to avoid dead code in __do_IRQ()

2005-08-08 Thread Karsten Wiese
Hi Ingo,

This version of the patch has better coding style
thanks to comments from Ingo Oeser.
Please comment or pass it on as appropriate.
Patch is for mainline 2.6.13-rc6.

   Thanks,
   Karsten 

--

From: Karsten Wiese <[EMAIL PROTECTED]>

IRQ_PER_CPU is not used by all architectures.
This patch introduces the macros
ARCH_HAS_IRQ_PER_CPU and CHECK_IRQ_PER_CPU() to avoid the generation of
dead code in __do_IRQ().

ARCH_HAS_IRQ_PER_CPU is defined by architectures using
IRQ_PER_CPU in their
include/asm_ARCH/irq.h
file.

Through grepping the tree I found the following
architectures currently use IRQ_PER_CPU:

cris, ia64, ppc, ppc64 and parisc. 

Signed-off-by: Karsten Wiese <[EMAIL PROTECTED]>



diff -upr linux-2.6.13-rc6/include/asm-cris/irq.h 
linux-2.6.13/include/asm-cris/irq.h
--- linux-2.6.13-rc6/include/asm-cris/irq.h 2005-08-08 11:46:10.0 
+0200
+++ linux-2.6.13/include/asm-cris/irq.h 2005-08-08 11:41:12.0 +0200
@@ -1,6 +1,11 @@
 #ifndef _ASM_IRQ_H
 #define _ASM_IRQ_H
 
+/*
+ * IRQ line status macro IRQ_PER_CPU is used
+ */
+#define ARCH_HAS_IRQ_PER_CPU
+
 #include 
 
 extern __inline__ int irq_canonicalize(int irq)
diff -upr linux-2.6.13-rc6/include/asm-ia64/irq.h 
linux-2.6.13/include/asm-ia64/irq.h
--- linux-2.6.13-rc6/include/asm-ia64/irq.h 2005-03-02 08:38:33.0 
+0100
+++ linux-2.6.13/include/asm-ia64/irq.h 2005-08-06 18:06:53.0 +0200
@@ -14,6 +14,11 @@
 #define NR_IRQS256
 #define NR_IRQ_VECTORS NR_IRQS
 
+/*
+ * IRQ line status macro IRQ_PER_CPU is used
+ */
+#define ARCH_HAS_IRQ_PER_CPU
+
 static __inline__ int
 irq_canonicalize (int irq)
 {
diff -upr linux-2.6.13-rc6/include/asm-parisc/irq.h 
linux-2.6.13/include/asm-parisc/irq.h
--- linux-2.6.13-rc6/include/asm-parisc/irq.h   2005-08-08 11:45:26.0 
+0200
+++ linux-2.6.13/include/asm-parisc/irq.h   2005-08-06 18:05:22.0 
+0200
@@ -26,6 +26,11 @@
 
 #define NR_IRQS(CPU_IRQ_MAX + 1)
 
+/*
+ * IRQ line status macro IRQ_PER_CPU is used
+ */
+#define ARCH_HAS_IRQ_PER_CPU
+
 static __inline__ int irq_canonicalize(int irq)
 {
return (irq == 2) ? 9 : irq;
diff -upr linux-2.6.13-rc6/include/asm-ppc/irq.h 
linux-2.6.13/include/asm-ppc/irq.h
--- linux-2.6.13-rc6/include/asm-ppc/irq.h  2005-08-08 11:46:10.0 
+0200
+++ linux-2.6.13/include/asm-ppc/irq.h  2005-08-08 11:41:14.0 +0200
@@ -19,6 +19,11 @@
 #define IRQ_POLARITY_POSITIVE  0x2 /* high level or low->high edge */
 #define IRQ_POLARITY_NEGATIVE  0x0 /* low level or high->low edge */
 
+/*
+ * IRQ line status macro IRQ_PER_CPU is used
+ */
+#define ARCH_HAS_IRQ_PER_CPU
+
 #if defined(CONFIG_40x)
 #include 
 
diff -upr linux-2.6.13-rc6/include/asm-ppc64/irq.h 
linux-2.6.13/include/asm-ppc64/irq.h
--- linux-2.6.13-rc6/include/asm-ppc64/irq.h2005-03-02 08:38:33.0 
+0100
+++ linux-2.6.13/include/asm-ppc64/irq.h2005-08-06 18:06:58.0 
+0200
@@ -33,6 +33,11 @@
 #define IRQ_POLARITY_POSITIVE  0x2 /* high level or low->high edge */
 #define IRQ_POLARITY_NEGATIVE  0x0 /* low level or high->low edge */
 
+/*
+ * IRQ line status macro IRQ_PER_CPU is used
+ */
+#define ARCH_HAS_IRQ_PER_CPU
+
 #define get_irq_desc(irq) (_desc[(irq)])
 
 /* Define a way to iterate across irqs. */
diff -upr linux-2.6.13-rc6/include/linux/irq.h linux-2.6.13/include/linux/irq.h
--- linux-2.6.13-rc6/include/linux/irq.h2005-08-08 11:46:10.0 
+0200
+++ linux-2.6.13/include/linux/irq.h2005-08-08 11:55:11.0 +0200
@@ -32,7 +32,12 @@
 #define IRQ_WAITING32  /* IRQ not yet seen - for autodetection */
 #define IRQ_LEVEL  64  /* IRQ level triggered */
 #define IRQ_MASKED 128 /* IRQ masked - shouldn't be seen again */
-#define IRQ_PER_CPU256 /* IRQ is per CPU */
+#if defined(ARCH_HAS_IRQ_PER_CPU)
+# define IRQ_PER_CPU   256 /* IRQ is per CPU */
+# define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU)
+#else
+# define CHECK_IRQ_PER_CPU(var) 0
+#endif
 
 /*
  * Interrupt controller descriptor. This is all we need
diff -upr linux-2.6.13-rc6/kernel/irq/handle.c linux-2.6.13/kernel/irq/handle.c
--- linux-2.6.13-rc6/kernel/irq/handle.c2005-08-08 11:46:11.0 
+0200
+++ linux-2.6.13/kernel/irq/handle.c2005-08-08 11:53:00.0 +0200
@@ -111,7 +111,7 @@ fastcall unsigned int __do_IRQ(unsigned 
unsigned int status;
 
kstat_this_cpu.irqs[irq]++;
-   if (desc->status & IRQ_PER_CPU) {
+   if (CHECK_IRQ_PER_CPU(desc->status)) {
irqreturn_t action_ret;
 
/*





___ 
Gesendet von Yahoo! Mail - Jetzt mit 1GB Speicher kostenlos - Hier anmelden: 
http://mail.yahoo.de

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[PATCH] CHECK_IRQ_PER_CPU() to avoid dead code in __do_IRQ()

2005-08-08 Thread Karsten Wiese
Hi Ingo,

This version of the patch has better coding style
thanks to comments from Ingo Oeser.
Please comment or pass it on as appropriate.
Patch is for mainline 2.6.13-rc6.

   Thanks,
   Karsten 

--

From: Karsten Wiese [EMAIL PROTECTED]

IRQ_PER_CPU is not used by all architectures.
This patch introduces the macros
ARCH_HAS_IRQ_PER_CPU and CHECK_IRQ_PER_CPU() to avoid the generation of
dead code in __do_IRQ().

ARCH_HAS_IRQ_PER_CPU is defined by architectures using
IRQ_PER_CPU in their
include/asm_ARCH/irq.h
file.

Through grepping the tree I found the following
architectures currently use IRQ_PER_CPU:

cris, ia64, ppc, ppc64 and parisc. 

Signed-off-by: Karsten Wiese [EMAIL PROTECTED]



diff -upr linux-2.6.13-rc6/include/asm-cris/irq.h 
linux-2.6.13/include/asm-cris/irq.h
--- linux-2.6.13-rc6/include/asm-cris/irq.h 2005-08-08 11:46:10.0 
+0200
+++ linux-2.6.13/include/asm-cris/irq.h 2005-08-08 11:41:12.0 +0200
@@ -1,6 +1,11 @@
 #ifndef _ASM_IRQ_H
 #define _ASM_IRQ_H
 
+/*
+ * IRQ line status macro IRQ_PER_CPU is used
+ */
+#define ARCH_HAS_IRQ_PER_CPU
+
 #include asm/arch/irq.h
 
 extern __inline__ int irq_canonicalize(int irq)
diff -upr linux-2.6.13-rc6/include/asm-ia64/irq.h 
linux-2.6.13/include/asm-ia64/irq.h
--- linux-2.6.13-rc6/include/asm-ia64/irq.h 2005-03-02 08:38:33.0 
+0100
+++ linux-2.6.13/include/asm-ia64/irq.h 2005-08-06 18:06:53.0 +0200
@@ -14,6 +14,11 @@
 #define NR_IRQS256
 #define NR_IRQ_VECTORS NR_IRQS
 
+/*
+ * IRQ line status macro IRQ_PER_CPU is used
+ */
+#define ARCH_HAS_IRQ_PER_CPU
+
 static __inline__ int
 irq_canonicalize (int irq)
 {
diff -upr linux-2.6.13-rc6/include/asm-parisc/irq.h 
linux-2.6.13/include/asm-parisc/irq.h
--- linux-2.6.13-rc6/include/asm-parisc/irq.h   2005-08-08 11:45:26.0 
+0200
+++ linux-2.6.13/include/asm-parisc/irq.h   2005-08-06 18:05:22.0 
+0200
@@ -26,6 +26,11 @@
 
 #define NR_IRQS(CPU_IRQ_MAX + 1)
 
+/*
+ * IRQ line status macro IRQ_PER_CPU is used
+ */
+#define ARCH_HAS_IRQ_PER_CPU
+
 static __inline__ int irq_canonicalize(int irq)
 {
return (irq == 2) ? 9 : irq;
diff -upr linux-2.6.13-rc6/include/asm-ppc/irq.h 
linux-2.6.13/include/asm-ppc/irq.h
--- linux-2.6.13-rc6/include/asm-ppc/irq.h  2005-08-08 11:46:10.0 
+0200
+++ linux-2.6.13/include/asm-ppc/irq.h  2005-08-08 11:41:14.0 +0200
@@ -19,6 +19,11 @@
 #define IRQ_POLARITY_POSITIVE  0x2 /* high level or low-high edge */
 #define IRQ_POLARITY_NEGATIVE  0x0 /* low level or high-low edge */
 
+/*
+ * IRQ line status macro IRQ_PER_CPU is used
+ */
+#define ARCH_HAS_IRQ_PER_CPU
+
 #if defined(CONFIG_40x)
 #include asm/ibm4xx.h
 
diff -upr linux-2.6.13-rc6/include/asm-ppc64/irq.h 
linux-2.6.13/include/asm-ppc64/irq.h
--- linux-2.6.13-rc6/include/asm-ppc64/irq.h2005-03-02 08:38:33.0 
+0100
+++ linux-2.6.13/include/asm-ppc64/irq.h2005-08-06 18:06:58.0 
+0200
@@ -33,6 +33,11 @@
 #define IRQ_POLARITY_POSITIVE  0x2 /* high level or low-high edge */
 #define IRQ_POLARITY_NEGATIVE  0x0 /* low level or high-low edge */
 
+/*
+ * IRQ line status macro IRQ_PER_CPU is used
+ */
+#define ARCH_HAS_IRQ_PER_CPU
+
 #define get_irq_desc(irq) (irq_desc[(irq)])
 
 /* Define a way to iterate across irqs. */
diff -upr linux-2.6.13-rc6/include/linux/irq.h linux-2.6.13/include/linux/irq.h
--- linux-2.6.13-rc6/include/linux/irq.h2005-08-08 11:46:10.0 
+0200
+++ linux-2.6.13/include/linux/irq.h2005-08-08 11:55:11.0 +0200
@@ -32,7 +32,12 @@
 #define IRQ_WAITING32  /* IRQ not yet seen - for autodetection */
 #define IRQ_LEVEL  64  /* IRQ level triggered */
 #define IRQ_MASKED 128 /* IRQ masked - shouldn't be seen again */
-#define IRQ_PER_CPU256 /* IRQ is per CPU */
+#if defined(ARCH_HAS_IRQ_PER_CPU)
+# define IRQ_PER_CPU   256 /* IRQ is per CPU */
+# define CHECK_IRQ_PER_CPU(var) ((var)  IRQ_PER_CPU)
+#else
+# define CHECK_IRQ_PER_CPU(var) 0
+#endif
 
 /*
  * Interrupt controller descriptor. This is all we need
diff -upr linux-2.6.13-rc6/kernel/irq/handle.c linux-2.6.13/kernel/irq/handle.c
--- linux-2.6.13-rc6/kernel/irq/handle.c2005-08-08 11:46:11.0 
+0200
+++ linux-2.6.13/kernel/irq/handle.c2005-08-08 11:53:00.0 +0200
@@ -111,7 +111,7 @@ fastcall unsigned int __do_IRQ(unsigned 
unsigned int status;
 
kstat_this_cpu.irqs[irq]++;
-   if (desc-status  IRQ_PER_CPU) {
+   if (CHECK_IRQ_PER_CPU(desc-status)) {
irqreturn_t action_ret;
 
/*





___ 
Gesendet von Yahoo! Mail - Jetzt mit 1GB Speicher kostenlos - Hier anmelden: 
http://mail.yahoo.de

-
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  

Re: [PATCH] CHECK_IRQ_PER_CPU() to avoid dead code in __do_IRQ()

2005-08-08 Thread Alexander Nyberg
 
 IRQ_PER_CPU is not used by all architectures.
 This patch introduces the macros
 ARCH_HAS_IRQ_PER_CPU and CHECK_IRQ_PER_CPU() to avoid the generation of
 dead code in __do_IRQ().
 
 ARCH_HAS_IRQ_PER_CPU is defined by architectures using
 IRQ_PER_CPU in their
 include/asm_ARCH/irq.h
 file.
 
 Through grepping the tree I found the following
 architectures currently use IRQ_PER_CPU:
 
 cris, ia64, ppc, ppc64 and parisc. 
 

There are many places where one could replace run-time tests with 
#ifdef's but it makes reading more difficult (and in longer terms
maintainence). Have you benchmarked any workload that benefits 
from this?

 
 diff -upr linux-2.6.13-rc6/include/asm-cris/irq.h 
 linux-2.6.13/include/asm-cris/irq.h
 --- linux-2.6.13-rc6/include/asm-cris/irq.h   2005-08-08 11:46:10.0 
 +0200
 +++ linux-2.6.13/include/asm-cris/irq.h   2005-08-08 11:41:12.0 
 +0200
 @@ -1,6 +1,11 @@
  #ifndef _ASM_IRQ_H
  #define _ASM_IRQ_H
  
 +/*
 + * IRQ line status macro IRQ_PER_CPU is used
 + */
 +#define ARCH_HAS_IRQ_PER_CPU
 +
  #include asm/arch/irq.h
  
  extern __inline__ int irq_canonicalize(int irq)
 diff -upr linux-2.6.13-rc6/include/asm-ia64/irq.h 
 linux-2.6.13/include/asm-ia64/irq.h
 --- linux-2.6.13-rc6/include/asm-ia64/irq.h   2005-03-02 08:38:33.0 
 +0100
 +++ linux-2.6.13/include/asm-ia64/irq.h   2005-08-06 18:06:53.0 
 +0200
 @@ -14,6 +14,11 @@
  #define NR_IRQS  256
  #define NR_IRQ_VECTORS   NR_IRQS
  
 +/*
 + * IRQ line status macro IRQ_PER_CPU is used
 + */
 +#define ARCH_HAS_IRQ_PER_CPU
 +
  static __inline__ int
  irq_canonicalize (int irq)
  {
 diff -upr linux-2.6.13-rc6/include/asm-parisc/irq.h 
 linux-2.6.13/include/asm-parisc/irq.h
 --- linux-2.6.13-rc6/include/asm-parisc/irq.h 2005-08-08 11:45:26.0 
 +0200
 +++ linux-2.6.13/include/asm-parisc/irq.h 2005-08-06 18:05:22.0 
 +0200
 @@ -26,6 +26,11 @@
  
  #define NR_IRQS  (CPU_IRQ_MAX + 1)
  
 +/*
 + * IRQ line status macro IRQ_PER_CPU is used
 + */
 +#define ARCH_HAS_IRQ_PER_CPU
 +
  static __inline__ int irq_canonicalize(int irq)
  {
   return (irq == 2) ? 9 : irq;
 diff -upr linux-2.6.13-rc6/include/asm-ppc/irq.h 
 linux-2.6.13/include/asm-ppc/irq.h
 --- linux-2.6.13-rc6/include/asm-ppc/irq.h2005-08-08 11:46:10.0 
 +0200
 +++ linux-2.6.13/include/asm-ppc/irq.h2005-08-08 11:41:14.0 
 +0200
 @@ -19,6 +19,11 @@
  #define IRQ_POLARITY_POSITIVE0x2 /* high level or low-high edge 
 */
  #define IRQ_POLARITY_NEGATIVE0x0 /* low level or high-low edge 
 */
  
 +/*
 + * IRQ line status macro IRQ_PER_CPU is used
 + */
 +#define ARCH_HAS_IRQ_PER_CPU
 +
  #if defined(CONFIG_40x)
  #include asm/ibm4xx.h
  
 diff -upr linux-2.6.13-rc6/include/asm-ppc64/irq.h 
 linux-2.6.13/include/asm-ppc64/irq.h
 --- linux-2.6.13-rc6/include/asm-ppc64/irq.h  2005-03-02 08:38:33.0 
 +0100
 +++ linux-2.6.13/include/asm-ppc64/irq.h  2005-08-06 18:06:58.0 
 +0200
 @@ -33,6 +33,11 @@
  #define IRQ_POLARITY_POSITIVE0x2 /* high level or low-high edge 
 */
  #define IRQ_POLARITY_NEGATIVE0x0 /* low level or high-low edge 
 */
  
 +/*
 + * IRQ line status macro IRQ_PER_CPU is used
 + */
 +#define ARCH_HAS_IRQ_PER_CPU
 +
  #define get_irq_desc(irq) (irq_desc[(irq)])
  
  /* Define a way to iterate across irqs. */
 diff -upr linux-2.6.13-rc6/include/linux/irq.h 
 linux-2.6.13/include/linux/irq.h
 --- linux-2.6.13-rc6/include/linux/irq.h  2005-08-08 11:46:10.0 
 +0200
 +++ linux-2.6.13/include/linux/irq.h  2005-08-08 11:55:11.0 +0200
 @@ -32,7 +32,12 @@
  #define IRQ_WAITING  32  /* IRQ not yet seen - for autodetection */
  #define IRQ_LEVEL64  /* IRQ level triggered */
  #define IRQ_MASKED   128 /* IRQ masked - shouldn't be seen again */
 -#define IRQ_PER_CPU  256 /* IRQ is per CPU */
 +#if defined(ARCH_HAS_IRQ_PER_CPU)
 +# define IRQ_PER_CPU 256 /* IRQ is per CPU */
 +# define CHECK_IRQ_PER_CPU(var) ((var)  IRQ_PER_CPU)
 +#else
 +# define CHECK_IRQ_PER_CPU(var) 0
 +#endif
  
  /*
   * Interrupt controller descriptor. This is all we need
 diff -upr linux-2.6.13-rc6/kernel/irq/handle.c 
 linux-2.6.13/kernel/irq/handle.c
 --- linux-2.6.13-rc6/kernel/irq/handle.c  2005-08-08 11:46:11.0 
 +0200
 +++ linux-2.6.13/kernel/irq/handle.c  2005-08-08 11:53:00.0 +0200
 @@ -111,7 +111,7 @@ fastcall unsigned int __do_IRQ(unsigned 
   unsigned int status;
  
   kstat_this_cpu.irqs[irq]++;
 - if (desc-status  IRQ_PER_CPU) {
 + if (CHECK_IRQ_PER_CPU(desc-status)) {
   irqreturn_t action_ret;
  
   /*
-
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] CHECK_IRQ_PER_CPU() to avoid dead code in __do_IRQ()

2005-08-08 Thread Karsten Wiese
Am Montag, 8. August 2005 13:19 schrieb Alexander Nyberg:
 
 There are many places where one could replace run-time tests with 
 #ifdef's but it makes reading more difficult (and in longer terms
 maintainence). Have you benchmarked any workload that benefits 
 from this?

Performance gain is small, but measurable: 0,02%
Tested on an Atlon64 running at 1000MHz.
I took this value from 9 runs (each with/without the patch) of 
$ time lame x.wav
where each took about 1 minute.
3000 Interrupts/s were generated at the time by running
$ jackd -R -dalsa -p64 -n2

0,02% really isn't that muchbut Athlon64 is better than P4
with branch predictions, I think.

Erm... ok, I won't insist on having this patch applied ;-) 

   Karsten





___ 
Gesendet von Yahoo! Mail - Jetzt mit 1GB Speicher kostenlos - Hier anmelden: 
http://mail.yahoo.de

-
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] CHECK_IRQ_PER_CPU() to avoid dead code in __do_IRQ()

2005-08-08 Thread Zachary Amsden

Karsten Wiese wrote:


Am Montag, 8. August 2005 13:19 schrieb Alexander Nyberg:
 

There are many places where one could replace run-time tests with 
#ifdef's but it makes reading more difficult (and in longer terms
maintainence). Have you benchmarked any workload that benefits 
from this?
   



Performance gain is small, but measurable: 0,02%
Tested on an Atlon64 running at 1000MHz.
I took this value from 9 runs (each with/without the patch) of 
	$ time lame x.wav

where each took about 1 minute.
3000 Interrupts/s were generated at the time by running
$ jackd -R -dalsa -p64 -n2

0,02% really isn't that muchbut Athlon64 is better than P4
with branch predictions, I think.

Erm... ok, I won't insist on having this patch applied ;-) 


  Karsten
 



Removing dead code is always good - 0.02% is small, but if 100 kernel 
developers all did the same, that adds up to 2% rather quickly, and that 
is nothing to sneeze at.  I like your patch, but you should add some 
comments for maintainability about what CHECK_IRQ_PER_CPU does - see 
include/asm-generic/pgtable.h for similar styling.  If also probably 
doesn't hurt to leave IRQ_PER_CPU defined even when 
ARCH_HAS_CHECK_IRQ_PER_CPU is not, since it looks cleaner and prevents 
future collisions with bits defined inside of an #ifdef.


Zach
-
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/