summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYong Zhang <yong.zhang0@gmail.com>2010-01-11 14:21:25 +0800
committerIngo Molnar <mingo@elte.hu>2010-01-21 13:39:04 +0100
commit6d558c3ac9b6508d26fd5cadccce51fc9d726b1c (patch)
treedbad2aa9c5874ea7ee5fff1f9f32b0be208c3df6
parent50b926e439620c469565e8be0f28be78f5fca1ce (diff)
downloadlinux-3.10-6d558c3ac9b6508d26fd5cadccce51fc9d726b1c.tar.gz
linux-3.10-6d558c3ac9b6508d26fd5cadccce51fc9d726b1c.tar.bz2
linux-3.10-6d558c3ac9b6508d26fd5cadccce51fc9d726b1c.zip
sched: Reassign prev and switch_count when reacquire_kernel_lock() fail
Assume A->B schedule is processing, if B have acquired BKL before and it need reschedule this time. Then on B's context, it will go to need_resched_nonpreemptible for reschedule. But at this time, prev and switch_count are related to A. It's wrong and will lead to incorrect scheduler statistics. Signed-off-by: Yong Zhang <yong.zhang0@gmail.com> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> LKML-Reference: <2674af741001102238w7b0ddcadref00d345e2181d11@mail.gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--kernel/sched.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index c535cc4f642..4508fe7048b 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -5530,8 +5530,11 @@ need_resched_nonpreemptible:
post_schedule(rq);
- if (unlikely(reacquire_kernel_lock(current) < 0))
+ if (unlikely(reacquire_kernel_lock(current) < 0)) {
+ prev = rq->curr;
+ switch_count = &prev->nivcsw;
goto need_resched_nonpreemptible;
+ }
preempt_enable_no_resched();
if (need_resched())