Re: [PATCH] CHECK_IRQ_PER_CPU() to avoid dead code in __do_IRQ()
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()
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()
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()
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()
> > 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()
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()
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()
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()
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()
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/