summaryrefslogtreecommitdiff
path: root/kernel/softirq.c
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2011-02-02 17:10:48 +0100
committerThomas Gleixner <tglx@linutronix.de>2011-02-08 19:37:12 +0100
commitc305d524e5dd3c3c7a6035083e30950bea1b52dc (patch)
tree2929186dfc8b0f1094375873231809768d1ac385 /kernel/softirq.c
parentc9a443cdf7726ce8b78c3177c6ae601ce37292fc (diff)
downloadlwn-c305d524e5dd3c3c7a6035083e30950bea1b52dc.tar.gz
lwn-c305d524e5dd3c3c7a6035083e30950bea1b52dc.zip
softirq: Avoid stack switch from ksoftirqd
ksoftirqd() calls do_softirq() which switches stacks on several architectures. That makes no sense at all. ksoftirqd's stack is sufficient. Call __do_softirq() directly. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Peter Zijlstra <peterz@infradead.org> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Acked-by: David Miller <davem@davemloft.net> Cc: Paul Mundt <lethal@linux-sh.org> Reviewed-by: Frank Rowand <frank.rowand@am.sony.com> LKML-Reference: <alpine.LFD.2.00.1102021704530.31804@localhost6.localdomain6>
Diffstat (limited to 'kernel/softirq.c')
-rw-r--r--kernel/softirq.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/kernel/softirq.c b/kernel/softirq.c
index 68eb5efec388..c0490464e92f 100644
--- a/kernel/softirq.c
+++ b/kernel/softirq.c
@@ -738,7 +738,10 @@ static int run_ksoftirqd(void * __bind_cpu)
don't process */
if (cpu_is_offline((long)__bind_cpu))
goto wait_to_die;
- do_softirq();
+ local_irq_disable();
+ if (local_softirq_pending())
+ __do_softirq();
+ local_irq_enable();
preempt_enable_no_resched();
cond_resched();
preempt_disable();