• Peter Zijlstra's avatar
    sched/fair: Fix min_vruntime tracking · b60205c7
    Peter Zijlstra authored
    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: default avatarPeter 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: 1e876231 ("sched: Fix ->min_vruntime calculation in dequeue_entity()")
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    b60205c7
fair.c 237 KB