From e7778aa6f31831fddb810517f950ba87787dfedd Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Sun, 18 May 2003 20:46:39 -0700 Subject: [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. --- kernel/sched.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'kernel') diff --git a/kernel/sched.c b/kernel/sched.c index a699eb066551..f9dc0a968a61 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -1180,7 +1180,7 @@ void scheduler_tick(int user_ticks, int sys_ticks) /* Task might have expired already, but not scheduled off yet */ if (p->array != rq->active) { set_tsk_need_resched(p); - return; + goto out; } spin_lock(&rq->lock); /* @@ -1207,7 +1207,7 @@ void scheduler_tick(int user_ticks, int sys_ticks) dequeue_task(p, rq->active); enqueue_task(p, rq->active); } - goto out; + goto out_unlock; } if (!--p->time_slice) { dequeue_task(p, rq->active); @@ -1223,8 +1223,9 @@ void scheduler_tick(int user_ticks, int sys_ticks) } else enqueue_task(p, rq->active); } -out: +out_unlock: spin_unlock(&rq->lock); +out: rebalance_tick(rq, 0); } -- cgit v1.2.3