aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/softirq.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/softirq.c')
-rw-r--r--kernel/softirq.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/kernel/softirq.c b/kernel/softirq.c
index 2b4328ea769f..dacd0ab51df4 100644
--- a/kernel/softirq.c
+++ b/kernel/softirq.c
@@ -332,15 +332,21 @@ void irq_enter(void)
332static inline void invoke_softirq(void) 332static inline void invoke_softirq(void)
333{ 333{
334 if (!force_irqthreads) { 334 if (!force_irqthreads) {
335#ifdef CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK
335 /* 336 /*
336 * We can safely execute softirq on the current stack if 337 * We can safely execute softirq on the current stack if
337 * it is the irq stack, because it should be near empty 338 * it is the irq stack, because it should be near empty
338 * at this stage. But we have no way to know if the arch 339 * at this stage.
339 * calls irq_exit() on the irq stack. So call softirq 340 */
340 * in its own stack to prevent from any overrun on top 341 __do_softirq();
341 * of a potentially deep task stack. 342#else
343 /*
344 * Otherwise, irq_exit() is called on the task stack that can
345 * be potentially deep already. So call softirq in its own stack
346 * to prevent from any overrun.
342 */ 347 */
343 do_softirq_own_stack(); 348 do_softirq_own_stack();
349#endif
344 } else { 350 } else {
345 wakeup_softirqd(); 351 wakeup_softirqd();
346 } 352 }