summaryrefslogtreecommitdiffstats
path: root/kernel/softirq.c
diff options
context:
space:
mode:
authorEric Dumazet <dada1@cosmosbay.com>2009-03-04 12:11:56 -0800
committerIngo Molnar <mingo@elte.hu>2009-03-04 22:08:45 +0100
commit64ca5ab913f1594ef316556e65f5eae63ff50cee (patch)
tree44cecee89609fbec9e4d7ed853b0eaf5c3782fc3 /kernel/softirq.c
parent559595a985e106d2fa9f0c79b7f5805453fed593 (diff)
downloadlinux-64ca5ab913f1594ef316556e65f5eae63ff50cee.tar.gz
linux-64ca5ab913f1594ef316556e65f5eae63ff50cee.tar.bz2
linux-64ca5ab913f1594ef316556e65f5eae63ff50cee.zip
rcu: increment quiescent state counter in ksoftirqd()
If a machine is flooded by network frames, a cpu can loop 100% of its time inside ksoftirqd() without calling schedule(). This can delay RCU grace period to insane values. Adding rcu_qsctr_inc() call in ksoftirqd() solves this problem. Paul: "This regression was a result of the recent change from "schedule()" to "cond_resched()", which got rid of that quiescent state in the common case where a reschedule is not needed". Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> Reviewed-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/softirq.c')
-rw-r--r--kernel/softirq.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/kernel/softirq.c b/kernel/softirq.c
index bdbe9de9cd8d..9041ea7948fe 100644
--- a/kernel/softirq.c
+++ b/kernel/softirq.c
@@ -626,6 +626,7 @@ static int ksoftirqd(void * __bind_cpu)
preempt_enable_no_resched();
cond_resched();
preempt_disable();
+ rcu_qsctr_inc((long)__bind_cpu);
}
preempt_enable();
set_current_state(TASK_INTERRUPTIBLE);