Commit e7778aa6 authored by Ingo Molnar's avatar Ingo Molnar Committed by Linus Torvalds

[PATCH] Fix lost scheduler rebalances

This fixes a race noticed by Mike Galbraith: the scheduler can lose a
rebalance tick if some task happens to not be rescheduled in time.  This
is not a fatal condition, but an inconsistency nevertheless.
parent 84205d05
...@@ -1180,7 +1180,7 @@ void scheduler_tick(int user_ticks, int sys_ticks) ...@@ -1180,7 +1180,7 @@ void scheduler_tick(int user_ticks, int sys_ticks)
/* Task might have expired already, but not scheduled off yet */ /* Task might have expired already, but not scheduled off yet */
if (p->array != rq->active) { if (p->array != rq->active) {
set_tsk_need_resched(p); set_tsk_need_resched(p);
return; goto out;
} }
spin_lock(&rq->lock); spin_lock(&rq->lock);
/* /*
...@@ -1207,7 +1207,7 @@ void scheduler_tick(int user_ticks, int sys_ticks) ...@@ -1207,7 +1207,7 @@ void scheduler_tick(int user_ticks, int sys_ticks)
dequeue_task(p, rq->active); dequeue_task(p, rq->active);
enqueue_task(p, rq->active); enqueue_task(p, rq->active);
} }
goto out; goto out_unlock;
} }
if (!--p->time_slice) { if (!--p->time_slice) {
dequeue_task(p, rq->active); dequeue_task(p, rq->active);
...@@ -1223,8 +1223,9 @@ void scheduler_tick(int user_ticks, int sys_ticks) ...@@ -1223,8 +1223,9 @@ void scheduler_tick(int user_ticks, int sys_ticks)
} else } else
enqueue_task(p, rq->active); enqueue_task(p, rq->active);
} }
out: out_unlock:
spin_unlock(&rq->lock); spin_unlock(&rq->lock);
out:
rebalance_tick(rq, 0); rebalance_tick(rq, 0);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment