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)
/* 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);
}
......
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