public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86-32: always use irq stacks
@ 2010-05-26 11:09 Christoph Hellwig
  2010-05-26 12:47 ` Thomas Gleixner
  2010-06-16  5:16 ` Christoph Hellwig
  0 siblings, 2 replies; 7+ messages in thread
From: Christoph Hellwig @ 2010-05-26 11:09 UTC (permalink / raw)
  To: x86, linux-kernel


IRQ stacks provide much better safety against unexpected stack use from
interrupts, at the minimal downside of slightly higher memory usage.
Enable irq stacks also for the default 8k stack to minimize the problem
of stack overflows through interrupt activity.

This is what x86-64 and various other architectures already do.

Signed-off-by: Christoph Hellwig <hch@lst.de>

Index: linux-2.6/arch/x86/Kconfig.debug
===================================================================
--- linux-2.6.orig/arch/x86/Kconfig.debug	2010-05-25 18:45:43.048276085 +0200
+++ linux-2.6/arch/x86/Kconfig.debug	2010-05-25 18:45:53.603003841 +0200
@@ -128,8 +128,7 @@ config 4KSTACKS
 	  If you say Y here the kernel will use a 4Kb stacksize for the
 	  kernel stack attached to each process/thread. This facilitates
 	  running more threads on a system and also reduces the pressure
-	  on the VM subsystem for higher order allocations. This option
-	  will also use IRQ stacks to compensate for the reduced stackspace.
+	  on the VM subsystem for higher order allocations.
 
 config DOUBLEFAULT
 	default y
Index: linux-2.6/arch/x86/include/asm/irq.h
===================================================================
--- linux-2.6.orig/arch/x86/include/asm/irq.h	2010-05-25 18:45:43.040025143 +0200
+++ linux-2.6/arch/x86/include/asm/irq.h	2010-05-25 18:45:53.604003981 +0200
@@ -19,18 +19,16 @@ static inline int irq_canonicalize(int i
 # define ARCH_HAS_NMI_WATCHDOG
 #endif
 
-#ifdef CONFIG_4KSTACKS
-  extern void irq_ctx_init(int cpu);
-  extern void irq_ctx_exit(int cpu);
-# define __ARCH_HAS_DO_SOFTIRQ
+#ifdef CONFIG_X86_32
+extern void irq_ctx_init(int cpu);
+extern void irq_ctx_exit(int cpu);
 #else
 # define irq_ctx_init(cpu) do { } while (0)
 # define irq_ctx_exit(cpu) do { } while (0)
-# ifdef CONFIG_X86_64
-#  define __ARCH_HAS_DO_SOFTIRQ
-# endif
 #endif
 
+#define __ARCH_HAS_DO_SOFTIRQ
+
 #ifdef CONFIG_HOTPLUG_CPU
 #include <linux/cpumask.h>
 extern void fixup_irqs(void);
Index: linux-2.6/arch/x86/kernel/irq_32.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irq_32.c	2010-05-25 18:45:42.981006006 +0200
+++ linux-2.6/arch/x86/kernel/irq_32.c	2010-05-25 18:45:53.606003632 +0200
@@ -49,7 +49,6 @@ static inline int check_stack_overflow(v
 static inline void print_stack_overflow(void) { }
 #endif
 
-#ifdef CONFIG_4KSTACKS
 /*
  * per-CPU IRQ handling contexts (thread information and stack)
  */
@@ -187,11 +186,6 @@ asmlinkage void do_softirq(void)
 	local_irq_restore(flags);
 }
 
-#else
-static inline int
-execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq) { return 0; }
-#endif
-
 bool handle_irq(unsigned irq, struct pt_regs *regs)
 {
 	struct irq_desc *desc;
Index: linux-2.6/Documentation/x86/x86_64/kernel-stacks
===================================================================
--- linux-2.6.orig/Documentation/x86/x86_64/kernel-stacks	2010-05-25 18:45:55.631004120 +0200
+++ linux-2.6/Documentation/x86/x86_64/kernel-stacks	2010-05-25 18:46:21.785256528 +0200
@@ -18,9 +18,9 @@ specialized stacks contain no useful dat
   Used for external hardware interrupts.  If this is the first external
   hardware interrupt (i.e. not a nested hardware interrupt) then the
   kernel switches from the current task to the interrupt stack.  Like
-  the split thread and interrupt stacks on i386 (with CONFIG_4KSTACKS),
-  this gives more room for kernel interrupt processing without having
-  to increase the size of every per thread stack.
+  the split thread and interrupt stacks on i386, this gives more room
+  for kernel interrupt processing without having to increase the size
+  of every per thread stack.
 
   The interrupt stack is also used when processing a softirq.
 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] x86-32: always use irq stacks
  2010-05-26 11:09 [PATCH] x86-32: always use irq stacks Christoph Hellwig
@ 2010-05-26 12:47 ` Thomas Gleixner
  2010-05-26 13:00   ` Christoph Hellwig
  2010-06-16  5:16 ` Christoph Hellwig
  1 sibling, 1 reply; 7+ messages in thread
From: Thomas Gleixner @ 2010-05-26 12:47 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: x86, linux-kernel

On Wed, 26 May 2010, Christoph Hellwig wrote:

> 
> IRQ stacks provide much better safety against unexpected stack use from
> interrupts, at the minimal downside of slightly higher memory usage.
> Enable irq stacks also for the default 8k stack to minimize the problem
> of stack overflows through interrupt activity.
> 
> This is what x86-64 and various other architectures already do.

We got rid of nested interrupts, so is this really a concern anymore ?

Thanks,

	tglx

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] x86-32: always use irq stacks
  2010-05-26 12:47 ` Thomas Gleixner
@ 2010-05-26 13:00   ` Christoph Hellwig
  0 siblings, 0 replies; 7+ messages in thread
From: Christoph Hellwig @ 2010-05-26 13:00 UTC (permalink / raw)
  To: Thomas Gleixner; +Cc: Christoph Hellwig, x86, linux-kernel

On Wed, May 26, 2010 at 02:47:07PM +0200, Thomas Gleixner wrote:
> On Wed, 26 May 2010, Christoph Hellwig wrote:
> 
> > 
> > IRQ stacks provide much better safety against unexpected stack use from
> > interrupts, at the minimal downside of slightly higher memory usage.
> > Enable irq stacks also for the default 8k stack to minimize the problem
> > of stack overflows through interrupt activity.
> > 
> > This is what x86-64 and various other architectures already do.
> 
> We got rid of nested interrupts, so is this really a concern anymore ?

Yes, especially for deep storage stacks anything that can come in
unexpectedly from IRQ context is quite harmful.  It's a really cheap
way to avoid that indeterminism.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] x86-32: always use irq stacks
  2010-05-26 11:09 [PATCH] x86-32: always use irq stacks Christoph Hellwig
  2010-05-26 12:47 ` Thomas Gleixner
@ 2010-06-16  5:16 ` Christoph Hellwig
  2010-06-16  5:56   ` Ingo Molnar
  1 sibling, 1 reply; 7+ messages in thread
From: Christoph Hellwig @ 2010-06-16  5:16 UTC (permalink / raw)
  To: x86, linux-kernel

ping?  This just came up again as a side-issue in the direct reclaim
thread.  x86-32 really is the only one out there still having this
compared to the other common architetures like x86-64, powerpc and s390.

On Wed, May 26, 2010 at 01:09:23PM +0200, Christoph Hellwig wrote:
> 
> IRQ stacks provide much better safety against unexpected stack use from
> interrupts, at the minimal downside of slightly higher memory usage.
> Enable irq stacks also for the default 8k stack to minimize the problem
> of stack overflows through interrupt activity.
> 
> This is what x86-64 and various other architectures already do.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> 
> Index: linux-2.6/arch/x86/Kconfig.debug
> ===================================================================
> --- linux-2.6.orig/arch/x86/Kconfig.debug	2010-05-25 18:45:43.048276085 +0200
> +++ linux-2.6/arch/x86/Kconfig.debug	2010-05-25 18:45:53.603003841 +0200
> @@ -128,8 +128,7 @@ config 4KSTACKS
>  	  If you say Y here the kernel will use a 4Kb stacksize for the
>  	  kernel stack attached to each process/thread. This facilitates
>  	  running more threads on a system and also reduces the pressure
> -	  on the VM subsystem for higher order allocations. This option
> -	  will also use IRQ stacks to compensate for the reduced stackspace.
> +	  on the VM subsystem for higher order allocations.
>  
>  config DOUBLEFAULT
>  	default y
> Index: linux-2.6/arch/x86/include/asm/irq.h
> ===================================================================
> --- linux-2.6.orig/arch/x86/include/asm/irq.h	2010-05-25 18:45:43.040025143 +0200
> +++ linux-2.6/arch/x86/include/asm/irq.h	2010-05-25 18:45:53.604003981 +0200
> @@ -19,18 +19,16 @@ static inline int irq_canonicalize(int i
>  # define ARCH_HAS_NMI_WATCHDOG
>  #endif
>  
> -#ifdef CONFIG_4KSTACKS
> -  extern void irq_ctx_init(int cpu);
> -  extern void irq_ctx_exit(int cpu);
> -# define __ARCH_HAS_DO_SOFTIRQ
> +#ifdef CONFIG_X86_32
> +extern void irq_ctx_init(int cpu);
> +extern void irq_ctx_exit(int cpu);
>  #else
>  # define irq_ctx_init(cpu) do { } while (0)
>  # define irq_ctx_exit(cpu) do { } while (0)
> -# ifdef CONFIG_X86_64
> -#  define __ARCH_HAS_DO_SOFTIRQ
> -# endif
>  #endif
>  
> +#define __ARCH_HAS_DO_SOFTIRQ
> +
>  #ifdef CONFIG_HOTPLUG_CPU
>  #include <linux/cpumask.h>
>  extern void fixup_irqs(void);
> Index: linux-2.6/arch/x86/kernel/irq_32.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/kernel/irq_32.c	2010-05-25 18:45:42.981006006 +0200
> +++ linux-2.6/arch/x86/kernel/irq_32.c	2010-05-25 18:45:53.606003632 +0200
> @@ -49,7 +49,6 @@ static inline int check_stack_overflow(v
>  static inline void print_stack_overflow(void) { }
>  #endif
>  
> -#ifdef CONFIG_4KSTACKS
>  /*
>   * per-CPU IRQ handling contexts (thread information and stack)
>   */
> @@ -187,11 +186,6 @@ asmlinkage void do_softirq(void)
>  	local_irq_restore(flags);
>  }
>  
> -#else
> -static inline int
> -execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq) { return 0; }
> -#endif
> -
>  bool handle_irq(unsigned irq, struct pt_regs *regs)
>  {
>  	struct irq_desc *desc;
> Index: linux-2.6/Documentation/x86/x86_64/kernel-stacks
> ===================================================================
> --- linux-2.6.orig/Documentation/x86/x86_64/kernel-stacks	2010-05-25 18:45:55.631004120 +0200
> +++ linux-2.6/Documentation/x86/x86_64/kernel-stacks	2010-05-25 18:46:21.785256528 +0200
> @@ -18,9 +18,9 @@ specialized stacks contain no useful dat
>    Used for external hardware interrupts.  If this is the first external
>    hardware interrupt (i.e. not a nested hardware interrupt) then the
>    kernel switches from the current task to the interrupt stack.  Like
> -  the split thread and interrupt stacks on i386 (with CONFIG_4KSTACKS),
> -  this gives more room for kernel interrupt processing without having
> -  to increase the size of every per thread stack.
> +  the split thread and interrupt stacks on i386, this gives more room
> +  for kernel interrupt processing without having to increase the size
> +  of every per thread stack.
>  
>    The interrupt stack is also used when processing a softirq.
>  
---end quoted text---

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] x86-32: always use irq stacks
  2010-06-16  5:16 ` Christoph Hellwig
@ 2010-06-16  5:56   ` Ingo Molnar
  2010-06-16  6:27     ` Christoph Hellwig
  0 siblings, 1 reply; 7+ messages in thread
From: Ingo Molnar @ 2010-06-16  5:56 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: x86, linux-kernel, H. Peter Anvin, Thomas Gleixner,
	Arjan van de Ven


* Christoph Hellwig <hch@lst.de> wrote:

> ping?  This just came up again as a side-issue in the direct reclaim thread.  
> x86-32 really is the only one out there still having this compared to the 
> other common architetures like x86-64, powerpc and s390.

We should also make 8K stacks the default on 32-bit. I.e. remove all the 
Kconfig distinctions and make the stack model similar on 32-bit and 64-bit 
x86.

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] x86-32: always use irq stacks
  2010-06-16  5:56   ` Ingo Molnar
@ 2010-06-16  6:27     ` Christoph Hellwig
  2010-06-16  7:32       ` Ingo Molnar
  0 siblings, 1 reply; 7+ messages in thread
From: Christoph Hellwig @ 2010-06-16  6:27 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Christoph Hellwig, x86, linux-kernel, H. Peter Anvin,
	Thomas Gleixner, Arjan van de Ven

On Wed, Jun 16, 2010 at 07:56:09AM +0200, Ingo Molnar wrote:
> 
> * Christoph Hellwig <hch@lst.de> wrote:
> 
> > ping?  This just came up again as a side-issue in the direct reclaim thread.  
> > x86-32 really is the only one out there still having this compared to the 
> > other common architetures like x86-64, powerpc and s390.
> 
> We should also make 8K stacks the default on 32-bit. I.e. remove all the 
> Kconfig distinctions and make the stack model similar on 32-bit and 64-bit 
> x86.

Sounds fine to me.  Do you want an additional patch for that or a respin
to include it in one patch?


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] x86-32: always use irq stacks
  2010-06-16  6:27     ` Christoph Hellwig
@ 2010-06-16  7:32       ` Ingo Molnar
  0 siblings, 0 replies; 7+ messages in thread
From: Ingo Molnar @ 2010-06-16  7:32 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: x86, linux-kernel, H. Peter Anvin, Thomas Gleixner,
	Arjan van de Ven


* Christoph Hellwig <hch@lst.de> wrote:

> On Wed, Jun 16, 2010 at 07:56:09AM +0200, Ingo Molnar wrote:
> > 
> > * Christoph Hellwig <hch@lst.de> wrote:
> > 
> > > ping?  This just came up again as a side-issue in the direct reclaim thread.  
> > > x86-32 really is the only one out there still having this compared to the 
> > > other common architetures like x86-64, powerpc and s390.
> > 
> > We should also make 8K stacks the default on 32-bit. I.e. remove all the 
> > Kconfig distinctions and make the stack model similar on 32-bit and 64-bit 
> > x86.
> 
> Sounds fine to me.  Do you want an additional patch for that or a respin
> to include it in one patch?

Two patches would be fine too - gives people something more finegrained to 
bisect to, should there be any problems.

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2010-06-16  7:32 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-26 11:09 [PATCH] x86-32: always use irq stacks Christoph Hellwig
2010-05-26 12:47 ` Thomas Gleixner
2010-05-26 13:00   ` Christoph Hellwig
2010-06-16  5:16 ` Christoph Hellwig
2010-06-16  5:56   ` Ingo Molnar
2010-06-16  6:27     ` Christoph Hellwig
2010-06-16  7:32       ` Ingo Molnar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox