When a softirq executes in irq_exit(), it can contribute to random complicated and large stack scenario involving task calls, hw interrupt calls, softirq handler calls and then other irqs, interrupting the softirq, that can dig further with an irq handler.
Softirqs executing on the inline hw interrupt stack may favour stack overflows in such circumstances, as it has been reported in powerpc where task -> irq -> softirq -> irq can end up forming a huge calltrace in the single kernel stack. So if there are softirqs pending on hardirq exit, lets execute them on the softirq stack to minimize this. Reported-by: Benjamin Herrenschmidt <b...@kernel.crashing.org> Signed-off-by: Frederic Weisbecker <fweis...@gmail.com> Tested-by: Paul Mackerras <pau...@samba.org> Cc: Benjamin Herrenschmidt <b...@kernel.crashing.org> Cc: Paul Mackerras <pau...@au1.ibm.com> Cc: Ingo Molnar <mi...@kernel.org> Cc: Thomas Gleixner <t...@linutronix.de> Cc: Peter Zijlstra <pet...@infradead.org> Cc: H. Peter Anvin <h...@zytor.com> Cc: Linus Torvalds <torva...@linux-foundation.org> Cc: Paul Mackerras <pau...@au1.ibm.com> Cc: James Hogan <james.ho...@imgtec.com> Cc: James E.J. Bottomley <j...@parisc-linux.org> Cc: Helge Deller <del...@gmx.de> Cc: Martin Schwidefsky <schwidef...@de.ibm.com> Cc: Heiko Carstens <heiko.carst...@de.ibm.com> Cc: David S. Miller <da...@davemloft.net> Cc: Andrew Morton <a...@linux-foundation.org> --- kernel/softirq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/softirq.c b/kernel/softirq.c index 36112cf..8c8f08b 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -326,7 +326,7 @@ void irq_enter(void) static inline void invoke_softirq(void) { if (!force_irqthreads) - __do_softirq(); + do_softirq_own_stack(); else wakeup_softirqd(); } -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/