diff options
author | Yong Zhang <yong.zhang0@gmail.com> | 2010-01-11 14:21:25 +0800 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2010-01-21 13:39:04 +0100 |
commit | 6d558c3ac9b6508d26fd5cadccce51fc9d726b1c (patch) | |
tree | dbad2aa9c5874ea7ee5fff1f9f32b0be208c3df6 /kernel | |
parent | 50b926e439620c469565e8be0f28be78f5fca1ce (diff) | |
download | linux-6d558c3ac9b6508d26fd5cadccce51fc9d726b1c.tar.gz linux-6d558c3ac9b6508d26fd5cadccce51fc9d726b1c.tar.bz2 linux-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>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/sched.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index c535cc4f6428..4508fe7048be 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()) |