]> git.baikalelectronics.ru Git - kernel.git/commit
sched/fair: Fix min_vruntime tracking
authorPeter Zijlstra <peterz@infradead.org>
Tue, 20 Sep 2016 19:58:12 +0000 (21:58 +0200)
committerIngo Molnar <mingo@kernel.org>
Fri, 30 Sep 2016 09:03:29 +0000 (11:03 +0200)
commit4310c013dc607e43df9f7bfe568d7c7cd6b693e8
tree3d54676c0af39e738ea7dded622a1685c0fc483a
parent0db177a87d5db0a86e8301fbb9b0ef352d5328e0
sched/fair: Fix min_vruntime tracking

While going through enqueue/dequeue to review the movement of
set_curr_task() I noticed that the (2nd) update_min_vruntime() call in
dequeue_entity() is suspect.

It turns out, its actually wrong because it will consider
cfs_rq->curr, which could be the entry we just normalized. This mixes
different vruntime forms and leads to fail.

The purpose of the second update_min_vruntime() is to move
min_vruntime forward if the entity we just removed is the one that was
holding it back; _except_ for the DEQUEUE_SAVE case, because then we
know its a temporary removal and it will come back.

However, since we do put_prev_task() _after_ dequeue(), cfs_rq->curr
will still be set (and per the above, can be tranformed into a
different unit), so update_min_vruntime() should also consider
curr->on_rq. This also fixes another corner case where the enqueue
(which also does update_curr()->update_min_vruntime()) happens on the
rq->lock break in schedule(), between dequeue and put_prev_task.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-kernel@vger.kernel.org
Fixes: bc40605b86fb ("sched: Fix ->min_vruntime calculation in dequeue_entity()")
Signed-off-by: Ingo Molnar <mingo@kernel.org>
kernel/sched/fair.c