aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2013-10-14 11:27:10 +0100
committerMark Brown <broonie@linaro.org>2013-10-14 11:27:10 +0100
commit095857390c54551a081d0286d3a39c7c049d0d33 (patch)
treed5aa00ce86075df41ce7353166035d640340cd9a /kernel
parentfa4b900fcaa6092a43fd60fe7dd72f8df654bcde (diff)
parent7fc878164dd8bc7812eb774e728f2cc1ffe905ed (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.c15
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)