diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/softirq.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/kernel/softirq.c b/kernel/softirq.c index 53cc09ceb0b8..d7d498d8cc4f 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c | |||
| @@ -328,10 +328,19 @@ void irq_enter(void) | |||
| 328 | 328 | ||
| 329 | static inline void invoke_softirq(void) | 329 | static inline void invoke_softirq(void) |
| 330 | { | 330 | { |
| 331 | if (!force_irqthreads) | 331 | if (!force_irqthreads) { |
| 332 | __do_softirq(); | 332 | /* |
| 333 | else | 333 | * We can safely execute softirq on the current stack if |
| 334 | * it is the irq stack, because it should be near empty | ||
| 335 | * at this stage. But we have no way to know if the arch | ||
| 336 | * calls irq_exit() on the irq stack. So call softirq | ||
| 337 | * in its own stack to prevent from any overrun on top | ||
| 338 | * of a potentially deep task stack. | ||
| 339 | */ | ||
| 340 | do_softirq(); | ||
| 341 | } else { | ||
| 334 | wakeup_softirqd(); | 342 | wakeup_softirqd(); |
| 343 | } | ||
| 335 | } | 344 | } |
| 336 | 345 | ||
| 337 | static inline void tick_irq_exit(void) | 346 | static inline void tick_irq_exit(void) |
