Commit 110ed28246a0063a5984d7f72ba5c97f154a51cf

Authored by Paul Mundt
1 parent 0e670685e4

sh: Decouple 4k and soft/hardirq stacks.

While using separate IRQ stacks can cut down on stack consumption,
many users can also use 4k stacks directly without the additional
need of separate stacks for soft and hardirqs.

With this split, we support the same rationale for 4KSTACKS as
m68knommu, with the IRQSTACKS abstraction as per ppc64.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>

Showing 3 changed files with 13 additions and 5 deletions Side-by-side Diff

arch/sh/Kconfig.debug
... ... @@ -86,6 +86,14 @@
86 86 on the VM subsystem for higher order allocations. This option
87 87 will also use IRQ stacks to compensate for the reduced stackspace.
88 88  
  89 +config IRQSTACKS
  90 + bool "Use separate kernel stacks when processing interrupts"
  91 + depends on DEBUG_KERNEL
  92 + help
  93 + If you say Y here the kernel will use separate kernel stacks
  94 + for handling hard and soft interrupts. This can help avoid
  95 + overflowing the process kernel stacks.
  96 +
89 97 config SH_KGDB
90 98 bool "Include KGDB kernel debugger"
91 99 select FRAME_POINTER
arch/sh/kernel/irq.c
... ... @@ -69,7 +69,7 @@
69 69 }
70 70 #endif
71 71  
72   -#ifdef CONFIG_4KSTACKS
  72 +#ifdef CONFIG_IRQSTACKS
73 73 /*
74 74 * per-CPU IRQ handling contexts (thread information and stack)
75 75 */
... ... @@ -85,7 +85,7 @@
85 85 asmlinkage int do_IRQ(unsigned int irq, struct pt_regs *regs)
86 86 {
87 87 struct pt_regs *old_regs = set_irq_regs(regs);
88   -#ifdef CONFIG_4KSTACKS
  88 +#ifdef CONFIG_IRQSTACKS
89 89 union irq_ctx *curctx, *irqctx;
90 90 #endif
91 91  
... ... @@ -109,7 +109,7 @@
109 109  
110 110 irq = irq_demux(evt2irq(irq));
111 111  
112   -#ifdef CONFIG_4KSTACKS
  112 +#ifdef CONFIG_IRQSTACKS
113 113 curctx = (union irq_ctx *)current_thread_info();
114 114 irqctx = hardirq_ctx[smp_processor_id()];
115 115  
... ... @@ -157,7 +157,7 @@
157 157 return 1;
158 158 }
159 159  
160   -#ifdef CONFIG_4KSTACKS
  160 +#ifdef CONFIG_IRQSTACKS
161 161 static char softirq_stack[NR_CPUS * THREAD_SIZE]
162 162 __attribute__((__section__(".bss.page_aligned")));
163 163  
include/asm-sh/irq.h
... ... @@ -41,7 +41,7 @@
41 41 #define irq_canonicalize(irq) (irq)
42 42 #define irq_demux(irq) sh_mv.mv_irq_demux(irq)
43 43  
44   -#ifdef CONFIG_4KSTACKS
  44 +#ifdef CONFIG_IRQSTACKS
45 45 extern void irq_ctx_init(int cpu);
46 46 extern void irq_ctx_exit(int cpu);
47 47 # define __ARCH_HAS_DO_SOFTIRQ