diff options
author | Mark Brown <broonie@linaro.org> | 2013-10-14 11:27:10 +0100 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-10-14 11:27:10 +0100 |
commit | 095857390c54551a081d0286d3a39c7c049d0d33 (patch) | |
tree | d5aa00ce86075df41ce7353166035d640340cd9a /kernel | |
parent | fa4b900fcaa6092a43fd60fe7dd72f8df654bcde (diff) | |
parent | 7fc878164dd8bc7812eb774e728f2cc1ffe905ed (diff) |
Merge tag 'v3.10.16' into linux-linaro-lsk
This is the 3.10.16 stable release
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 3d6833f125d..787b3a03242 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -330,10 +330,19 @@ void irq_enter(void) static inline void invoke_softirq(void) { - if (!force_irqthreads) - __do_softirq(); - else + if (!force_irqthreads) { + /* + * We can safely execute softirq on the current stack if + * it is the irq stack, because it should be near empty + * at this stage. But we have no way to know if the arch + * calls irq_exit() on the irq stack. So call softirq + * in its own stack to prevent from any overrun on top + * of a potentially deep task stack. + */ + do_softirq(); + } else { wakeup_softirqd(); + } } static inline void tick_irq_exit(void) |