* [PATCH] genirq: ARM dyntick cleanup
@ 2006-07-03 0:18 Thomas Gleixner
2006-07-03 0:35 ` Andrew Morton
0 siblings, 1 reply; 21+ messages in thread
From: Thomas Gleixner @ 2006-07-03 0:18 UTC (permalink / raw)
To: Linus Torvalds; +Cc: Andrew Morton, Ingo Molnar, Russell King, LKML
Linus: "The hacks in kernel/irq/handle.c are really horrid. REALLY
horrid."
They are indeed. Move the dyntick quirks to ARM where they belong.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Index: linux-2.6.git/include/asm-arm/hw_irq.h
===================================================================
--- linux-2.6.git.orig/include/asm-arm/hw_irq.h 2006-07-03 00:13:24.000000000 +0200
+++ linux-2.6.git/include/asm-arm/hw_irq.h 2006-07-03 00:52:04.000000000 +0200
@@ -6,4 +6,15 @@
#include <asm/mach/irq.h>
+#if defined(CONFIG_NO_IDLE_HZ)
+# include <asm/dyntick.h>
+# define handle_dynamic_tick(action) \
+ if (!(action->flags & SA_TIMER) && system_timer->dyn_tick) { \
+ write_seqlock(&xtime_lock); \
+ if (system_timer->dyn_tick->state & DYN_TICK_ENABLED) \
+ system_timer->dyn_tick->handler(irq, 0, regs); \
+ write_sequnlock(&xtime_lock); \
+ }
+#endif
+
#endif
Index: linux-2.6.git/include/linux/irq.h
===================================================================
--- linux-2.6.git.orig/include/linux/irq.h 2006-07-03 00:13:24.000000000 +0200
+++ linux-2.6.git/include/linux/irq.h 2006-07-03 00:49:01.000000000 +0200
@@ -182,6 +182,10 @@ extern int setup_irq(unsigned int irq, s
#ifdef CONFIG_GENERIC_HARDIRQS
+#ifndef handle_dynamic_tick
+# define handle_dynamic_tick(a) do { } while (0)
+#endif
+
#ifdef CONFIG_SMP
static inline void set_native_irq_info(int irq, cpumask_t mask)
{
Index: linux-2.6.git/kernel/irq/handle.c
===================================================================
--- linux-2.6.git.orig/kernel/irq/handle.c 2006-07-03 00:13:24.000000000 +0200
+++ linux-2.6.git/kernel/irq/handle.c 2006-07-03 00:47:47.000000000 +0200
@@ -16,10 +16,6 @@
#include <linux/interrupt.h>
#include <linux/kernel_stat.h>
-#if defined(CONFIG_NO_IDLE_HZ) && defined(CONFIG_ARM)
-#include <asm/dyntick.h>
-#endif
-
#include "internals.h"
/**
@@ -133,14 +129,7 @@ irqreturn_t handle_IRQ_event(unsigned in
irqreturn_t ret, retval = IRQ_NONE;
unsigned int status = 0;
-#if defined(CONFIG_NO_IDLE_HZ) && defined(CONFIG_ARM)
- if (!(action->flags & SA_TIMER) && system_timer->dyn_tick != NULL) {
- write_seqlock(&xtime_lock);
- if (system_timer->dyn_tick->state & DYN_TICK_ENABLED)
- system_timer->dyn_tick->handler(irq, 0, regs);
- write_sequnlock(&xtime_lock);
- }
-#endif
+ handle_dynamic_tick(action);
if (!(action->flags & IRQF_DISABLED))
local_irq_enable();
Index: linux-2.6.git/include/asm-arm/mach/time.h
===================================================================
--- linux-2.6.git.orig/include/asm-arm/mach/time.h 2006-06-21 08:32:46.000000000 +0200
+++ linux-2.6.git/include/asm-arm/mach/time.h 2006-07-03 00:54:07.000000000 +0200
@@ -69,6 +69,7 @@ extern void timer_tick(struct pt_regs *)
/*
* Kernel time keeping support.
*/
+struct timespec;
extern int (*set_rtc)(void);
extern void save_time_delta(struct timespec *delta, struct timespec *rtc);
extern void restore_time_delta(struct timespec *delta, struct timespec *rtc);
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-03 0:18 [PATCH] genirq: ARM dyntick cleanup Thomas Gleixner @ 2006-07-03 0:35 ` Andrew Morton 2006-07-03 6:29 ` Thomas Gleixner ` (2 more replies) 0 siblings, 3 replies; 21+ messages in thread From: Andrew Morton @ 2006-07-03 0:35 UTC (permalink / raw) To: tglx; +Cc: torvalds, mingo, rmk+lkml, linux-kernel On Mon, 03 Jul 2006 02:18:48 +0200 Thomas Gleixner <tglx@linutronix.de> wrote: > Linus: "The hacks in kernel/irq/handle.c are really horrid. REALLY > horrid." > > They are indeed. Move the dyntick quirks to ARM where they belong. > > Signed-off-by: Thomas Gleixner <tglx@linutronix.de> > > Index: linux-2.6.git/include/asm-arm/hw_irq.h > =================================================================== > --- linux-2.6.git.orig/include/asm-arm/hw_irq.h 2006-07-03 00:13:24.000000000 +0200 > +++ linux-2.6.git/include/asm-arm/hw_irq.h 2006-07-03 00:52:04.000000000 +0200 > @@ -6,4 +6,15 @@ > > #include <asm/mach/irq.h> > > +#if defined(CONFIG_NO_IDLE_HZ) > +# include <asm/dyntick.h> > +# define handle_dynamic_tick(action) \ > + if (!(action->flags & SA_TIMER) && system_timer->dyn_tick) { \ > + write_seqlock(&xtime_lock); \ > + if (system_timer->dyn_tick->state & DYN_TICK_ENABLED) \ > + system_timer->dyn_tick->handler(irq, 0, regs); \ > + write_sequnlock(&xtime_lock); \ > + } > +#endif > + > #endif > Index: linux-2.6.git/include/linux/irq.h > =================================================================== > --- linux-2.6.git.orig/include/linux/irq.h 2006-07-03 00:13:24.000000000 +0200 > +++ linux-2.6.git/include/linux/irq.h 2006-07-03 00:49:01.000000000 +0200 > @@ -182,6 +182,10 @@ extern int setup_irq(unsigned int irq, s > > #ifdef CONFIG_GENERIC_HARDIRQS > > +#ifndef handle_dynamic_tick > +# define handle_dynamic_tick(a) do { } while (0) > +#endif > + > #ifdef CONFIG_SMP > static inline void set_native_irq_info(int irq, cpumask_t mask) > { This is not exactly a thing of beauty either. It's much cleaner to use __attribute__((weak)), but that will add an empty call-return to everyone's interrupts. The requirement "if you implement this then you must do so as a macro" is a bit regrettable. The ARCH_HAS_HANDLE_DYNAMIC_TICK approach would eliminate that requirement. btw, is this, from include/linux/irq.h: /* * Please do not include this file in generic code. There is currently * no requirement for any architecture to implement anything held * within this file. * * Thanks. --rmk */ still true? ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-03 0:35 ` Andrew Morton @ 2006-07-03 6:29 ` Thomas Gleixner 2006-07-03 6:57 ` Ingo Molnar 2006-07-03 7:41 ` Russell King 2006-07-03 17:13 ` Linus Torvalds 2 siblings, 1 reply; 21+ messages in thread From: Thomas Gleixner @ 2006-07-03 6:29 UTC (permalink / raw) To: Andrew Morton; +Cc: torvalds, mingo, rmk+lkml, linux-kernel On Sun, 2006-07-02 at 17:35 -0700, Andrew Morton wrote: > > > > #ifdef CONFIG_GENERIC_HARDIRQS > > > > +#ifndef handle_dynamic_tick > > +# define handle_dynamic_tick(a) do { } while (0) > > +#endif > > + > > #ifdef CONFIG_SMP > > static inline void set_native_irq_info(int irq, cpumask_t mask) > > { > > This is not exactly a thing of beauty either. It's much cleaner to use > __attribute__((weak)), but that will add an empty call-return to everyone's > interrupts. > > The requirement "if you implement this then you must do so as a macro" is a > bit regrettable. The ARCH_HAS_HANDLE_DYNAMIC_TICK approach would eliminate > that requirement. This quirk should go away once we come around to generalize and consolidate the dyntick stuff. > btw, is this, from include/linux/irq.h: > > /* > * Please do not include this file in generic code. There is currently > * no requirement for any architecture to implement anything held > * within this file. > * > * Thanks. --rmk > */ > > still true? I think what it means is that linux/irq.h must not be included in drivers. drivers should include linux/interrupt.h instead. tglx ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-03 6:29 ` Thomas Gleixner @ 2006-07-03 6:57 ` Ingo Molnar 2006-07-04 11:54 ` Christoph Hellwig 0 siblings, 1 reply; 21+ messages in thread From: Ingo Molnar @ 2006-07-03 6:57 UTC (permalink / raw) To: Thomas Gleixner Cc: Andrew Morton, torvalds, rmk+lkml, linux-kernel, Christoph Hellwig * Thomas Gleixner <tglx@linutronix.de> wrote: > > btw, is this, from include/linux/irq.h: > > > > /* > > * Please do not include this file in generic code. There is currently > > * no requirement for any architecture to implement anything held > > * within this file. > > * > > * Thanks. --rmk > > */ > > > > still true? > > I think what it means is that linux/irq.h must not be included in > drivers. drivers should include linux/interrupt.h instead. Christoph has had ideas for cleanups in the irq-header-files area for a long time. My rough battleplan would be this: - linux/interrupt.h should remain the highlevel driver API [which can be used by both physical (genirq or non-genirq) or virtual platforms]. Only this file should be included by drivers. - rename linux/irq.h to linux/irqchips.h, to make it less likely for drivers to include it accidentally. - rename asm/irq.h to asm/irqchips.h - most of linux/hardirq.h should merge into interrupt.h [the rest into linux/irqchips.h] and hardirq.h should be eliminated. - merge asm/hardirq.h and asm/hw_irq.h into asm/irqchips.h. Christoph, agreed? Ingo ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-03 6:57 ` Ingo Molnar @ 2006-07-04 11:54 ` Christoph Hellwig 2006-07-04 12:22 ` Ingo Molnar 2006-07-08 18:53 ` Christoph Hellwig 0 siblings, 2 replies; 21+ messages in thread From: Christoph Hellwig @ 2006-07-04 11:54 UTC (permalink / raw) To: Ingo Molnar Cc: Thomas Gleixner, Andrew Morton, torvalds, rmk+lkml, linux-kernel, Christoph Hellwig On Mon, Jul 03, 2006 at 08:57:35AM +0200, Ingo Molnar wrote: > Christoph has had ideas for cleanups in the irq-header-files area for a > long time. My rough battleplan would be this: > > - linux/interrupt.h should remain the highlevel driver API [which can be > used by both physical (genirq or non-genirq) or virtual platforms]. > Only this file should be included by drivers. Yes. Note that it's not quite there yet. Non-genirq architectures currently have things like enable_irq/disable_irq in asm/irq.h We really need to have those prototypes only in linux/interrupt.h. Unfortunately at least m68k and sparc had those as macros so they'll need some tweaking first. > - rename linux/irq.h to linux/irqchips.h, to make it less likely for > drivers to include it accidentally. I find the name rather odd, how bout linux/genirq.h instead? > > - rename asm/irq.h to asm/irqchips.h Note that currently asm/irq.h is included all over. > - most of linux/hardirq.h should merge into interrupt.h [the rest into > linux/irqchips.h] and hardirq.h should be eliminated. Yes. > - merge asm/hardirq.h and asm/hw_irq.h into asm/irqchips.h. I'm not sure we can get away with just one asm/*irq.h. We need arch bits for genirq and we need arch bits for what was in linux/hardirq.h and I don't think we want to mix those up. The latter is just irq_cpustat_t which needs a big rework anyway to remove the arch independent use of a arch- defined struct and use DECLARE_PERCPU for each field in each architecture or a suitable per-arch meachnism. The only irq_cpustat_t field that the generic code uses is __softirq_pending and we should rather have a function abstraction for that. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-04 11:54 ` Christoph Hellwig @ 2006-07-04 12:22 ` Ingo Molnar 2006-07-05 8:35 ` Russell King 2006-07-08 18:53 ` Christoph Hellwig 1 sibling, 1 reply; 21+ messages in thread From: Ingo Molnar @ 2006-07-04 12:22 UTC (permalink / raw) To: Christoph Hellwig, Thomas Gleixner, Andrew Morton, torvalds, rmk+lkml, linux-kernel [-- Attachment #1: Type: text/plain, Size: 2210 bytes --] * Christoph Hellwig <hch@infradead.org> wrote: > On Mon, Jul 03, 2006 at 08:57:35AM +0200, Ingo Molnar wrote: > > Christoph has had ideas for cleanups in the irq-header-files area for a > > long time. My rough battleplan would be this: > > > > - linux/interrupt.h should remain the highlevel driver API [which can be > > used by both physical (genirq or non-genirq) or virtual platforms]. > > Only this file should be included by drivers. > > Yes. Note that it's not quite there yet. Non-genirq architectures currently > have things like enable_irq/disable_irq in asm/irq.h We really need to have > those prototypes only in linux/interrupt.h. Unfortunately at least m68k and > sparc had those as macros so they'll need some tweaking first. > > > - rename linux/irq.h to linux/irqchips.h, to make it less likely for > > drivers to include it accidentally. > > I find the name rather odd, how bout linux/genirq.h instead? yeah, that would be fine too. The "irq chips" name has the advantage that it points out that this stuff deals with actual hardware, but no strong feelings either way. > > - rename asm/irq.h to asm/irqchips.h > > Note that currently asm/irq.h is included all over. yeah, but only 335 times in drivers/*, so it's a 4 minute job to convert them over. (ok, i just did it to check - it results in a 144K patch and it took 50 seconds to do. I've attached the result.) > > - most of linux/hardirq.h should merge into interrupt.h [the rest into > > linux/irqchips.h] and hardirq.h should be eliminated. > > Yes. > > > - merge asm/hardirq.h and asm/hw_irq.h into asm/irqchips.h. > > I'm not sure we can get away with just one asm/*irq.h. We need arch > bits for genirq and we need arch bits for what was in linux/hardirq.h > and I don't think we want to mix those up. The latter is just > irq_cpustat_t which needs a big rework anyway to remove the arch > independent use of a arch- defined struct and use DECLARE_PERCPU for > each field in each architecture or a suitable per-arch meachnism. The > only irq_cpustat_t field that the generic code uses is > __softirq_pending and we should rather have a function abstraction for > that. ok, agreed. Ingo [-- Attachment #2: remove-asm-irq2.h.bz2 --] [-- Type: application/x-bzip2, Size: 12688 bytes --] ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-04 12:22 ` Ingo Molnar @ 2006-07-05 8:35 ` Russell King 0 siblings, 0 replies; 21+ messages in thread From: Russell King @ 2006-07-05 8:35 UTC (permalink / raw) To: Ingo Molnar Cc: Christoph Hellwig, Thomas Gleixner, Andrew Morton, torvalds, linux-kernel On Tue, Jul 04, 2006 at 02:22:31PM +0200, Ingo Molnar wrote: > > > - rename asm/irq.h to asm/irqchips.h > > > > Note that currently asm/irq.h is included all over. > > yeah, but only 335 times in drivers/*, so it's a 4 minute job to convert > them over. (ok, i just did it to check - it results in a 144K patch and > it took 50 seconds to do. I've attached the result.) Note that ARM drivers generally require asm/irq.h by way of it defining the IRQ numbers for the platform, so this patch moves the include of it to linux/genirq.h. Also note that including genirq.h (formerly irq.h) is broken for architectures which don't yet use this stuff - it'll probably cause compile failures because it wants asm/hw_irq.h. -- Russell King Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/ maintainer of: 2.6 Serial core ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-04 11:54 ` Christoph Hellwig 2006-07-04 12:22 ` Ingo Molnar @ 2006-07-08 18:53 ` Christoph Hellwig 1 sibling, 0 replies; 21+ messages in thread From: Christoph Hellwig @ 2006-07-08 18:53 UTC (permalink / raw) To: Christoph Hellwig, Ingo Molnar, Thomas Gleixner, Andrew Morton, torvalds, rmk+lkml, linux-kernel On Tue, Jul 04, 2006 at 12:54:25PM +0100, Christoph Hellwig wrote: > On Mon, Jul 03, 2006 at 08:57:35AM +0200, Ingo Molnar wrote: > > Christoph has had ideas for cleanups in the irq-header-files area for a > > long time. My rough battleplan would be this: > > > > - linux/interrupt.h should remain the highlevel driver API [which can be > > used by both physical (genirq or non-genirq) or virtual platforms]. > > Only this file should be included by drivers. > > Yes. Note that it's not quite there yet. Non-genirq architectures currently > have things like enable_irq/disable_irq in asm/irq.h We really need to have > those prototypes only in linux/interrupt.h. Unfortunately at least m68k and > sparc had those as macros so they'll need some tweaking first. Here's the patch I have lying around for a while. I rediffed it to current Linus' tree. It still needs someone to test it on sparc32 and m68knommu (compile at least). Signed-off-by: Christoph Hellwig <hch@lst.de> Index: linux-2.6/arch/arm26/kernel/irq.c =================================================================== --- linux-2.6.orig/arch/arm26/kernel/irq.c 2006-07-08 17:44:19.000000000 +0200 +++ linux-2.6/arch/arm26/kernel/irq.c 2006-07-08 20:29:25.000000000 +0200 @@ -86,7 +86,7 @@ * * This function may be called from IRQ context. */ -void disable_irq(unsigned int irq) +void disable_irq_nosync(unsigned int irq) { struct irqdesc *desc = irq_desc + irq; unsigned long flags; @@ -95,6 +95,12 @@ desc->enabled = 0; spin_unlock_irqrestore(&irq_controller_lock, flags); } +EXPORT_SYMBOL(disable_irq_nosync); + +void disable_irq(unsigned int irq) +{ + return disable_irq_nosync(irq); +} /** * enable_irq - enable interrupt handling on an irq Index: linux-2.6/arch/h8300/kernel/ints.c =================================================================== --- linux-2.6.orig/arch/h8300/kernel/ints.c 2006-07-08 17:44:19.000000000 +0200 +++ linux-2.6/arch/h8300/kernel/ints.c 2006-07-08 20:29:25.000000000 +0200 @@ -208,11 +208,17 @@ IER_REGS |= 1 << (irq - EXT_IRQ0); } -void disable_irq(unsigned int irq) +void disable_irq_nosync(unsigned int irq) { if (irq >= EXT_IRQ0 && irq <= (EXT_IRQ0 + EXT_IRQS)) IER_REGS &= ~(1 << (irq - EXT_IRQ0)); } +EXPORT_SYMBOL(disable_irq_nosync); + +void disable_irq(unsigned int irq) +{ + disable_irq_nosync(irq); +} asmlinkage void process_int(int irq, struct pt_regs *fp) { Index: linux-2.6/arch/m68knommu/kernel/Makefile =================================================================== --- linux-2.6.orig/arch/m68knommu/kernel/Makefile 2006-01-12 16:27:05.000000000 +0100 +++ linux-2.6/arch/m68knommu/kernel/Makefile 2006-07-08 20:29:25.000000000 +0200 @@ -5,7 +5,7 @@ extra-y := vmlinux.lds obj-y += dma.o entry.o init_task.o m68k_ksyms.o process.o ptrace.o semaphore.o \ - setup.o signal.o syscalltable.o sys_m68k.o time.o traps.o + setup.o signal.o syscalltable.o sys_m68k.o time.o traps.o irq.o obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_COMEMPCI) += comempci.o Index: linux-2.6/arch/m68knommu/kernel/irq.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.6/arch/m68knommu/kernel/irq.c 2006-07-08 20:29:25.000000000 +0200 @@ -0,0 +1,22 @@ + +#include <linux/interrupt.h> + +/* + * Stubs for IRQ handling helpers. + * Seems wrong to me that these are no-ops on m68knommu. --hch + */ + +void disable_irq_nosync(unsigned int irq) +{ +} +EXPORT_SYMBOL(disable_irq_nosync); + +void disable_irq(unsigned int irq) +{ +} +EXPORT_SYMBOL(disable_irq); + +void enable_irq(unsigned int irq) +{ +} +EXPORT_SYMBOL(enable_irq); Index: linux-2.6/include/asm-arm26/irq.h =================================================================== --- linux-2.6.orig/include/asm-arm26/irq.h 2006-07-08 17:44:35.000000000 +0200 +++ linux-2.6/include/asm-arm26/irq.h 2006-07-08 20:29:25.000000000 +0200 @@ -22,12 +22,6 @@ #define NO_IRQ ((unsigned int)(-1)) #endif -struct irqaction; - -#define disable_irq_nosync(i) disable_irq(i) - -extern void disable_irq(unsigned int); -extern void enable_irq(unsigned int); #define __IRQT_FALEDGE (1 << 0) #define __IRQT_RISEDGE (1 << 1) Index: linux-2.6/include/asm-frv/irq.h =================================================================== --- linux-2.6.orig/include/asm-frv/irq.h 2006-07-08 17:44:35.000000000 +0200 +++ linux-2.6/include/asm-frv/irq.h 2006-07-08 20:29:25.000000000 +0200 @@ -35,9 +35,4 @@ return irq; } -extern void disable_irq_nosync(unsigned int irq); -extern void disable_irq(unsigned int irq); -extern void enable_irq(unsigned int irq); - - #endif /* _ASM_IRQ_H_ */ Index: linux-2.6/include/asm-h8300/irq.h =================================================================== --- linux-2.6.orig/include/asm-h8300/irq.h 2006-07-08 17:44:35.000000000 +0200 +++ linux-2.6/include/asm-h8300/irq.h 2006-07-08 20:29:25.000000000 +0200 @@ -59,8 +59,4 @@ return irq; } -extern void enable_irq(unsigned int); -extern void disable_irq(unsigned int); -#define disable_irq_nosync(x) disable_irq(x) - #endif /* _H8300_IRQ_H_ */ Index: linux-2.6/include/asm-m68k/irq.h =================================================================== --- linux-2.6.orig/include/asm-m68k/irq.h 2006-07-08 17:44:35.000000000 +0200 +++ linux-2.6/include/asm-m68k/irq.h 2006-07-08 20:29:42.000000000 +0200 @@ -59,9 +59,6 @@ #define IRQ_USER 8 extern unsigned int irq_canonicalize(unsigned int irq); -extern void enable_irq(unsigned int); -extern void disable_irq(unsigned int); -#define disable_irq_nosync disable_irq struct pt_regs; Index: linux-2.6/include/asm-m68knommu/irq.h =================================================================== --- linux-2.6.orig/include/asm-m68knommu/irq.h 2006-07-08 17:44:36.000000000 +0200 +++ linux-2.6/include/asm-m68knommu/irq.h 2006-07-08 20:30:04.000000000 +0200 @@ -80,11 +80,4 @@ #endif /* CONFIG_M68360 */ -/* - * Some drivers want these entry points - */ -#define enable_irq(x) do { } while (0) -#define disable_irq(x) do { } while (0) -#define disable_irq_nosync(x) disable_irq(x) - #endif /* _M68K_IRQ_H_ */ Index: linux-2.6/include/asm-sparc/irq.h =================================================================== --- linux-2.6.orig/include/asm-sparc/irq.h 2006-07-08 20:27:38.000000000 +0200 +++ linux-2.6/include/asm-sparc/irq.h 2006-07-08 20:29:25.000000000 +0200 @@ -36,10 +36,6 @@ BTFIXUPDEF_CALL(void, clear_profile_irq, int) BTFIXUPDEF_CALL(void, load_profile_irq, int, unsigned int) -extern void disable_irq_nosync(unsigned int irq); -extern void disable_irq(unsigned int irq); -extern void enable_irq(unsigned int irq); - static inline void disable_pil_irq(unsigned int irq) { BTFIXUP_CALL(disable_pil_irq)(irq); Index: linux-2.6/include/linux/interrupt.h =================================================================== --- linux-2.6.orig/include/linux/interrupt.h 2006-07-08 17:44:36.000000000 +0200 +++ linux-2.6/include/linux/interrupt.h 2006-07-08 20:32:01.000000000 +0200 @@ -99,11 +99,11 @@ # define local_irq_enable_in_hardirq() local_irq_enable() #endif -#ifdef CONFIG_GENERIC_HARDIRQS extern void disable_irq_nosync(unsigned int irq); extern void disable_irq(unsigned int irq); extern void enable_irq(unsigned int irq); +#ifdef CONFIG_GENERIC_HARDIRQS /* * Special lockdep variants of irq disabling/enabling. * These should be used for locking constructs that Index: linux-2.6/arch/sparc/kernel/irq.c =================================================================== --- linux-2.6.orig/arch/sparc/kernel/irq.c 2006-07-08 17:44:21.000000000 +0200 +++ linux-2.6/arch/sparc/kernel/irq.c 2006-07-08 20:27:38.000000000 +0200 @@ -549,6 +549,25 @@ EXPORT_SYMBOL(request_irq); +void disable_irq_nosync(unsigned int irq) +{ + BTFIXUP_CALL(disable_irq)(irq); +} +EXPORT_SYMBOL(disable_irq_nosync); + +void disable_irq(unsigned int irq) +{ + BTFIXUP_CALL(disable_irq)(irq); +} +EXPORT_SYMBOL(disable_irq); + +void enable_irq(unsigned int irq) +{ + BTFIXUP_CALL(enable_irq)(irq); +} +EXPORT_SYMBOL(enable_irq); + + /* We really don't need these at all on the Sparc. We only have * stubs here because they are exported to modules. */ Index: linux-2.6/include/asm-sparc/irq.h =================================================================== --- linux-2.6.orig/include/asm-sparc/irq.h 2006-07-08 17:44:36.000000000 +0200 +++ linux-2.6/include/asm-sparc/irq.h 2006-07-08 20:27:38.000000000 +0200 @@ -36,20 +36,6 @@ BTFIXUPDEF_CALL(void, clear_profile_irq, int) BTFIXUPDEF_CALL(void, load_profile_irq, int, unsigned int) -static inline void disable_irq_nosync(unsigned int irq) -{ - BTFIXUP_CALL(disable_irq)(irq); -} - -static inline void disable_irq(unsigned int irq) -{ - BTFIXUP_CALL(disable_irq)(irq); -} - -static inline void enable_irq(unsigned int irq) -{ - BTFIXUP_CALL(enable_irq)(irq); -} static inline void disable_pil_irq(unsigned int irq) { ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-03 0:35 ` Andrew Morton 2006-07-03 6:29 ` Thomas Gleixner @ 2006-07-03 7:41 ` Russell King 2006-07-03 7:55 ` Andrew Morton 2006-07-03 17:13 ` Linus Torvalds 2 siblings, 1 reply; 21+ messages in thread From: Russell King @ 2006-07-03 7:41 UTC (permalink / raw) To: Andrew Morton; +Cc: tglx, torvalds, mingo, linux-kernel On Sun, Jul 02, 2006 at 05:35:27PM -0700, Andrew Morton wrote: > This is not exactly a thing of beauty either. It's much cleaner to use > __attribute__((weak)), but that will add an empty call-return to everyone's > interrupts. Let's not go overboard with the weak stuff - it does not get removed at link time, so it remains as dead code in the kernel image. -- Russell King Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/ maintainer of: 2.6 Serial core ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-03 7:41 ` Russell King @ 2006-07-03 7:55 ` Andrew Morton 2006-07-03 9:03 ` Russell King 2006-07-03 16:56 ` Linus Torvalds 0 siblings, 2 replies; 21+ messages in thread From: Andrew Morton @ 2006-07-03 7:55 UTC (permalink / raw) To: Russell King; +Cc: tglx, torvalds, mingo, linux-kernel On Mon, 3 Jul 2006 08:41:55 +0100 Russell King <rmk+lkml@arm.linux.org.uk> wrote: > On Sun, Jul 02, 2006 at 05:35:27PM -0700, Andrew Morton wrote: > > This is not exactly a thing of beauty either. It's much cleaner to use > > __attribute__((weak)), but that will add an empty call-return to everyone's > > interrupts. > > Let's not go overboard with the weak stuff - it does not get removed > at link time, so it remains as dead code in the kernel image. Well. void handle_dynamic_tick(struct irqaction *action) { } consumes one byte, doesn't it? That's not very far overboard ;) And we can optimise away that byte by doing what we do with cond_syscall(). ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-03 7:55 ` Andrew Morton @ 2006-07-03 9:03 ` Russell King 2006-07-03 9:12 ` Andrew Morton 2006-07-03 16:56 ` Linus Torvalds 1 sibling, 1 reply; 21+ messages in thread From: Russell King @ 2006-07-03 9:03 UTC (permalink / raw) To: Andrew Morton; +Cc: tglx, torvalds, mingo, linux-kernel On Mon, Jul 03, 2006 at 12:55:42AM -0700, Andrew Morton wrote: > On Mon, 3 Jul 2006 08:41:55 +0100 > Russell King <rmk+lkml@arm.linux.org.uk> wrote: > > > On Sun, Jul 02, 2006 at 05:35:27PM -0700, Andrew Morton wrote: > > > This is not exactly a thing of beauty either. It's much cleaner to use > > > __attribute__((weak)), but that will add an empty call-return to everyone's > > > interrupts. > > > > Let's not go overboard with the weak stuff - it does not get removed > > at link time, so it remains as dead code in the kernel image. > > Well. > > void handle_dynamic_tick(struct irqaction *action) > { > } > > consumes one byte, doesn't it? That's not very far overboard ;) ROTFL! All the word isn't x86. On ARM it's 3 words for the stack setup and one for the tear down, so 16 bytes, assuming the function doesn't return a value. If it does, add another 4 bytes. So, on ARM potentially 16 to 20 bytes per weak function. That's a 1600% to 2000% increase on your estimate. (Unfortunately we have to tell the compiler to always generate stack frames otherwise we can't get call traces out of the kernel.) -- Russell King Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/ maintainer of: 2.6 Serial core ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-03 9:03 ` Russell King @ 2006-07-03 9:12 ` Andrew Morton 0 siblings, 0 replies; 21+ messages in thread From: Andrew Morton @ 2006-07-03 9:12 UTC (permalink / raw) To: Russell King; +Cc: tglx, torvalds, mingo, linux-kernel On Mon, 3 Jul 2006 10:03:43 +0100 Russell King <rmk+lkml@arm.linux.org.uk> wrote: > On Mon, Jul 03, 2006 at 12:55:42AM -0700, Andrew Morton wrote: > > On Mon, 3 Jul 2006 08:41:55 +0100 > > Russell King <rmk+lkml@arm.linux.org.uk> wrote: > > > > > On Sun, Jul 02, 2006 at 05:35:27PM -0700, Andrew Morton wrote: > > > > This is not exactly a thing of beauty either. It's much cleaner to use > > > > __attribute__((weak)), but that will add an empty call-return to everyone's > > > > interrupts. > > > > > > Let's not go overboard with the weak stuff - it does not get removed > > > at link time, so it remains as dead code in the kernel image. > > > > Well. > > > > void handle_dynamic_tick(struct irqaction *action) > > { > > } > > > > consumes one byte, doesn't it? That's not very far overboard ;) > > ROTFL! > > All the word isn't x86. On ARM it's 3 words for the stack setup and > one for the tear down, so 16 bytes, assuming the function doesn't > return a value. If it does, add another 4 bytes. > Well yes, and there's also compiler-added alignment padding after the function itself. It's still pretty small beer. It's a judgement call, which is why I recommended it not be used here. A lot of places where it's used (and useful) are in __init setup code. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-03 7:55 ` Andrew Morton 2006-07-03 9:03 ` Russell King @ 2006-07-03 16:56 ` Linus Torvalds 1 sibling, 0 replies; 21+ messages in thread From: Linus Torvalds @ 2006-07-03 16:56 UTC (permalink / raw) To: Andrew Morton; +Cc: Russell King, tglx, mingo, linux-kernel On Mon, 3 Jul 2006, Andrew Morton wrote: > > void handle_dynamic_tick(struct irqaction *action) > { > } > > consumes one byte, doesn't it? That's not very far overboard ;) Nope, it consumes - very fundamentally - about 64 bytes. Even in the absense of alignment (which means that it generally takes up a minimum of 16 bytes of real memory), it takes up what would tend to be a much more critical resource: a cache line. So an empty macro is a _lot_ more efficient than an empty function call. For interrupt handlers, the L1 I$ miss rate is basically 100%. Even the L2 I$ miss rate is quite noticeable, _especially_ for things that are not easy to prefetch (ie stuff that is out-of-line). Which means that it also likely takes an inordinate amount of cycles, for doing zero work. Linus ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-03 0:35 ` Andrew Morton 2006-07-03 6:29 ` Thomas Gleixner 2006-07-03 7:41 ` Russell King @ 2006-07-03 17:13 ` Linus Torvalds 2006-07-03 17:27 ` Arjan van de Ven 2 siblings, 1 reply; 21+ messages in thread From: Linus Torvalds @ 2006-07-03 17:13 UTC (permalink / raw) To: Andrew Morton; +Cc: tglx, mingo, rmk+lkml, linux-kernel On Sun, 2 Jul 2006, Andrew Morton wrote: > > The requirement "if you implement this then you must do so as a macro" is a > bit regrettable. The ARCH_HAS_HANDLE_DYNAMIC_TICK approach would eliminate > that requirement. Btw, this is WRONG. The whole "ARCH_HAS_XYZZY" is nothing but crap. It's totally unreadable, compared to the _much_ simpler #ifndef xyzzy #define zyzzy() /* empty */ #endif which is a hell of a lot more obvious to everybody involved, not to mention being a lot easier to "grep" for (try it - "grep xyzzy" ends up showing _exactly_ what is going on for cases like this, unlike the ARCH_HAS_XYZZY crap). And no, it does not require implementing xyzzy as a macro AT ALL. You can very easily just do /* * We have a very complex xyzzy, we don't even want to * inline it! */ extern void xyxxy(...); /* Tell the rest of the world that we do it! */ #define xyzzy xyzzy and you're now all set. No need for a new stupid name like ARCH_HAS_XYZZY, which adds _nothing_ but unnecessary complexity ("What was the condition for using that symbol again?" and ungreppability). WE SHOULD GET RID OF ARCH_HAS_XYZZY. It's a disease. Linus ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-03 17:13 ` Linus Torvalds @ 2006-07-03 17:27 ` Arjan van de Ven 2006-07-05 23:24 ` Randy.Dunlap 0 siblings, 1 reply; 21+ messages in thread From: Arjan van de Ven @ 2006-07-03 17:27 UTC (permalink / raw) To: Linus Torvalds; +Cc: Andrew Morton, tglx, mingo, rmk+lkml, linux-kernel On Mon, 2006-07-03 at 10:13 -0700, Linus Torvalds wrote: > #ifndef xyzzy > #define zyzzy() /* empty */ > #endif > now if you write it as #define zyzzy() do { ; } while (0) it even works in a if (foo()) zyzzy(); bar(); scenario (I know you know that, just pointing that out before people copy your example :-) ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-03 17:27 ` Arjan van de Ven @ 2006-07-05 23:24 ` Randy.Dunlap 2006-07-05 23:35 ` Andrew Morton 2006-07-05 23:53 ` Linus Torvalds 0 siblings, 2 replies; 21+ messages in thread From: Randy.Dunlap @ 2006-07-05 23:24 UTC (permalink / raw) To: Arjan van de Ven; +Cc: torvalds, akpm, tglx, mingo, rmk+lkml, linux-kernel On Mon, 03 Jul 2006 19:27:07 +0200 Arjan van de Ven wrote: > On Mon, 2006-07-03 at 10:13 -0700, Linus Torvalds wrote: > > #ifndef xyzzy > > #define zyzzy() /* empty */ > > #endif > > > > now if you write it as > > #define zyzzy() do { ; } while (0) > > it even works in a > > if (foo()) > zyzzy(); > bar(); > > scenario > > (I know you know that, just pointing that out before people copy your > example :-) OK, I'll bite. What part of Linus's macro doesn't work. I compiled your foo/zyzzy/bar example with both his "empty" macro and the do-while macro. Same code produced both ways, no compile warnings/errors. --- ~Randy ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-05 23:24 ` Randy.Dunlap @ 2006-07-05 23:35 ` Andrew Morton 2006-07-05 23:50 ` Randy.Dunlap 2006-07-05 23:53 ` Linus Torvalds 1 sibling, 1 reply; 21+ messages in thread From: Andrew Morton @ 2006-07-05 23:35 UTC (permalink / raw) To: Randy.Dunlap; +Cc: arjan, torvalds, tglx, mingo, rmk+lkml, linux-kernel On Wed, 5 Jul 2006 16:24:25 -0700 "Randy.Dunlap" <rdunlap@xenotime.net> wrote: > On Mon, 03 Jul 2006 19:27:07 +0200 Arjan van de Ven wrote: > > > On Mon, 2006-07-03 at 10:13 -0700, Linus Torvalds wrote: > > > #ifndef xyzzy > > > #define zyzzy() /* empty */ > > > #endif > > > > > > > now if you write it as > > > > #define zyzzy() do { ; } while (0) > > > > it even works in a > > > > if (foo()) > > zyzzy(); > > bar(); > > > > scenario > > > > (I know you know that, just pointing that out before people copy your > > example :-) > > OK, I'll bite. What part of Linus's macro doesn't work. > I compiled your foo/zyzzy/bar example with both his "empty" > macro and the do-while macro. Same code produced both ways, > no compile warnings/errors. > if (foo()) ; will generate `warning: empty body in an if-statement' when compiled with -W. We go round this loop regularly. Maybe someone should write it up. Meanwhile, use do{}while(0) and be happy and secure. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-05 23:35 ` Andrew Morton @ 2006-07-05 23:50 ` Randy.Dunlap 0 siblings, 0 replies; 21+ messages in thread From: Randy.Dunlap @ 2006-07-05 23:50 UTC (permalink / raw) To: Andrew Morton; +Cc: arjan, torvalds, tglx, mingo, rmk+lkml, linux-kernel On Wed, 5 Jul 2006 16:35:30 -0700 Andrew Morton wrote: > On Wed, 5 Jul 2006 16:24:25 -0700 > "Randy.Dunlap" <rdunlap@xenotime.net> wrote: > > > On Mon, 03 Jul 2006 19:27:07 +0200 Arjan van de Ven wrote: > > > > > On Mon, 2006-07-03 at 10:13 -0700, Linus Torvalds wrote: > > > > #ifndef xyzzy > > > > #define zyzzy() /* empty */ > > > > #endif > > > > > > > > > > now if you write it as > > > > > > #define zyzzy() do { ; } while (0) > > > > > > it even works in a > > > > > > if (foo()) > > > zyzzy(); > > > bar(); > > > > > > scenario > > > > > > (I know you know that, just pointing that out before people copy your > > > example :-) > > > > OK, I'll bite. What part of Linus's macro doesn't work. > > I compiled your foo/zyzzy/bar example with both his "empty" > > macro and the do-while macro. Same code produced both ways, > > no compile warnings/errors. > > > > if (foo()) > ; > > will generate `warning: empty body in an if-statement' when compiled with -W. > > We go round this loop regularly. Maybe someone should write it up. Meanwhile, > use do{}while(0) and be happy and secure. Thanks, I was missing the -W. or I should read the kernelnewbies FAQ :) http://kernelnewbies.org/FAQ/DoWhile0 --- ~Randy ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-05 23:24 ` Randy.Dunlap 2006-07-05 23:35 ` Andrew Morton @ 2006-07-05 23:53 ` Linus Torvalds 2006-07-06 0:02 ` Randy.Dunlap 2006-07-06 6:47 ` Giacomo A. Catenazzi 1 sibling, 2 replies; 21+ messages in thread From: Linus Torvalds @ 2006-07-05 23:53 UTC (permalink / raw) To: Randy.Dunlap; +Cc: Arjan van de Ven, akpm, tglx, mingo, rmk+lkml, linux-kernel On Wed, 5 Jul 2006, Randy.Dunlap wrote: > > OK, I'll bite. What part of Linus's macro doesn't work. Heh. This is "C language 101". The reason we always write #define empty_statement do { } while (0) instead of #define empty_statement /* empty */ is not that if (x) empty_statement; wouldn't work like Arjan claimed, but because otherwise the empty statement won't parse perfectly as a real C statement. In particular, you tend to get much better error messages if you have syntax errors _around_ the empty statement if it's done as that "do { } while (0)" thing. You also avoid compiler warnings about empty statements or statements without effects, that you'd get if you were to use #define empty_statement /* empty */ or #define empty_statement 0 for example (a expression statement is a perfectly valid statement, as is an empty one, but many compilers will warn on them). It's also simply good practice - if you _always_ do the "do { } while (0)" thing, you'll never get bitten by having a macro that has several statements inside of it, and you'll also never get bitten by a macro that is _meant_ to be used as a statement being used as part of an expression instead. It basically boils down to the fact that the "do { } while (0)" format is always syntactically correct, /regardless/ of what is inside of the braces, and should always give you meaningful error messages regardless of what is _around_ the macro usage. For example: if (a) empty_statement b; will give the _correct_ syntax error message ("expected ';'"), instead of silently turning into if (a) b; or other nonsense. But in the end, the real aim is to just teach your fingers to _always_ put the do/while(0) there, so that you never EVER write something like #define MACRO one; two; which really breaks down. This is, btw, the same reason a lot of people (including me, most of the time) will write #define VALUE (12) instead of writing the simpler #define VALUE 12 just because it's good practice to _always_ have the parentheses around a macro that ends up being used as an expression. So we always also write #define ADD(a,b) ((a)+(b)) because otherwise you eventually _will_ get bitten (we've had that particular bug bite us in the *ss lots of times, even though people should know better) Linus ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-05 23:53 ` Linus Torvalds @ 2006-07-06 0:02 ` Randy.Dunlap 2006-07-06 6:47 ` Giacomo A. Catenazzi 1 sibling, 0 replies; 21+ messages in thread From: Randy.Dunlap @ 2006-07-06 0:02 UTC (permalink / raw) To: Linus Torvalds; +Cc: arjan, akpm, tglx, mingo, rmk+lkml, linux-kernel On Wed, 5 Jul 2006 16:53:22 -0700 (PDT) Linus Torvalds wrote: > > > On Wed, 5 Jul 2006, Randy.Dunlap wrote: > > > > OK, I'll bite. What part of Linus's macro doesn't work. > > Heh. This is "C language 101". Yes, I got most of that. :) more below. > The reason we always write > > #define empty_statement do { } while (0) > > instead of > > #define empty_statement /* empty */ > > is not that > > if (x) > empty_statement; > > wouldn't work like Arjan claimed, but because otherwise the empty > statement won't parse perfectly as a real C statement. > > In particular, you tend to get much better error messages if you have > syntax errors _around_ the empty statement if it's done as that > "do { } while (0)" thing. You also avoid compiler warnings about > empty statements or statements without effects, that you'd get if you were > to use > > #define empty_statement /* empty */ > > or > > #define empty_statement 0 > > for example (a expression statement is a perfectly valid statement, as is > an empty one, but many compilers will warn on them). > > It's also simply good practice - if you _always_ do the "do { } while (0)" > thing, you'll never get bitten by having a macro that has several > statements inside of it, and you'll also never get bitten by a macro that > is _meant_ to be used as a statement being used as part of an expression > instead. > > It basically boils down to the fact that the "do { } while (0)" format is > always syntactically correct, /regardless/ of what is inside of the > braces, and should always give you meaningful error messages regardless of > what is _around_ the macro usage. Yes, I already understood that. I was interested in Arjan's specific example, which was: if (foo()) zyzzy(); in which he supplied the terminating semi-colon, and which Andrew explained with the -W warning... > For example: > > if (a) > empty_statement > b; > > will give the _correct_ syntax error message ("expected ';'"), instead of > silently turning into > > if (a) > b; > > or other nonsense. OK, good practice, yes. > But in the end, the real aim is to just teach your fingers to _always_ put > the do/while(0) there, so that you never EVER write something like > > #define MACRO one; two; > > which really breaks down. > > This is, btw, the same reason a lot of people (including me, most of the > time) will write > > #define VALUE (12) > > instead of writing the simpler > > #define VALUE 12 > > just because it's good practice to _always_ have the parentheses around > a macro that ends up being used as an expression. > > So we always also write > > #define ADD(a,b) ((a)+(b)) > > because otherwise you eventually _will_ get bitten (we've had that > particular bug bite us in the *ss lots of times, even though people should > know better) Yes, I have the () macro practice down. I was just looking for the problem with that one specific example, which you and Andrew have now explained. Thanks. --- ~Randy ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH] genirq: ARM dyntick cleanup 2006-07-05 23:53 ` Linus Torvalds 2006-07-06 0:02 ` Randy.Dunlap @ 2006-07-06 6:47 ` Giacomo A. Catenazzi 1 sibling, 0 replies; 21+ messages in thread From: Giacomo A. Catenazzi @ 2006-07-06 6:47 UTC (permalink / raw) To: Linus Torvalds Cc: Randy.Dunlap, Arjan van de Ven, akpm, tglx, mingo, rmk+lkml, linux-kernel Linus Torvalds wrote: > > On Wed, 5 Jul 2006, Randy.Dunlap wrote: >> OK, I'll bite. What part of Linus's macro doesn't work. > > Heh. This is "C language 101". > > The reason we always write > > #define empty_statement do { } while (0) > > instead of > > #define empty_statement /* empty */ > > is not that > > if (x) > empty_statement; > > wouldn't work like Arjan claimed, but because otherwise the empty > statement won't parse perfectly as a real C statement. But the classical way of empty statments is "((void) 0)" See K&R, glibc or SuS, for assert.h ( http://www.opengroup.org/onlinepubs/000095399/basedefs/assert.h.html ) or I miss something? ciao cate ^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2006-07-08 18:54 UTC | newest] Thread overview: 21+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2006-07-03 0:18 [PATCH] genirq: ARM dyntick cleanup Thomas Gleixner 2006-07-03 0:35 ` Andrew Morton 2006-07-03 6:29 ` Thomas Gleixner 2006-07-03 6:57 ` Ingo Molnar 2006-07-04 11:54 ` Christoph Hellwig 2006-07-04 12:22 ` Ingo Molnar 2006-07-05 8:35 ` Russell King 2006-07-08 18:53 ` Christoph Hellwig 2006-07-03 7:41 ` Russell King 2006-07-03 7:55 ` Andrew Morton 2006-07-03 9:03 ` Russell King 2006-07-03 9:12 ` Andrew Morton 2006-07-03 16:56 ` Linus Torvalds 2006-07-03 17:13 ` Linus Torvalds 2006-07-03 17:27 ` Arjan van de Ven 2006-07-05 23:24 ` Randy.Dunlap 2006-07-05 23:35 ` Andrew Morton 2006-07-05 23:50 ` Randy.Dunlap 2006-07-05 23:53 ` Linus Torvalds 2006-07-06 0:02 ` Randy.Dunlap 2006-07-06 6:47 ` Giacomo A. Catenazzi
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox