diff options
Diffstat (limited to 'kernel/softirq.c')
-rw-r--r-- | kernel/softirq.c | 14 |
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) | |||
332 | static inline void invoke_softirq(void) | 332 | static 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 | } |