summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-10-04 09:02:35 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2013-10-04 09:02:35 -0700
commit7f467cbff66a9f96dc7b1ee619a3fa54a80d0c79 (patch)
tree43374fe54a9e39df4df9cac57b335bafb2e32ab4
parent6d15ee492809d38bd62237b6d0f6a81d4dd12d15 (diff)
parent0d119fb57614fe947aa9048f61d680bbede64170 (diff)
downloadlinux-7f467cbff66a9f96dc7b1ee619a3fa54a80d0c79.tar.bz2
Merge branch 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq fix from Ingo Molnar: "Frederic's minimal fix for hardirq/softirq nesting crashes" * 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: irq: Force hardirq exit's softirq processing on its own stack
-rw-r--r--kernel/softirq.c15
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)
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)