diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-10-04 09:02:35 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-10-04 09:02:35 -0700 |
commit | 7f467cbff66a9f96dc7b1ee619a3fa54a80d0c79 (patch) | |
tree | 43374fe54a9e39df4df9cac57b335bafb2e32ab4 | |
parent | 6d15ee492809d38bd62237b6d0f6a81d4dd12d15 (diff) | |
parent | 0d119fb57614fe947aa9048f61d680bbede64170 (diff) | |
download | linux-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.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) 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) |