• Peter Zijlstra's avatar
    sched: Remove the cfs_rq dependency from set_task_cpu() · 88ec22d3
    Peter Zijlstra authored
    In order to remove the cfs_rq dependency from set_task_cpu() we
    need to ensure the task is cfs_rq invariant for all callsites.
    
    The simple approach is to substract cfs_rq->min_vruntime from
    se->vruntime on dequeue, and add cfs_rq->min_vruntime on
    enqueue.
    
    However, this has the downside of breaking FAIR_SLEEPERS since
    we loose the old vruntime as we only maintain the relative
    position.
    
    To solve this, we observe that we only migrate runnable tasks,
    we do this using deactivate_task(.sleep=0) and
    activate_task(.wakeup=0), therefore we can restrain the
    min_vruntime invariance to that state.
    
    The only other case is wakeup balancing, since we want to
    maintain the old vruntime we cannot make it relative on dequeue,
    but since we don't migrate inactive tasks, we can do so right
    before we activate it again.
    
    This is where we need the new pre-wakeup hook, we need to call
    this while still holding the old rq->lock. We could fold it into
    ->select_task_rq(), but since that has multiple callsites and
    would obfuscate the locking requirements, that seems like a
    fudge.
    
    This leaves the fork() case, simply make sure that ->task_fork()
    leaves the ->vruntime in a relative state.
    
    This covers all cases where set_task_cpu() gets called, and
    ensures it sees a relative vruntime.
    Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Mike Galbraith <efault@gmx.de>
    LKML-Reference: <20091216170518.191697025@chello.nl>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    88ec22d3
sched.c 269 KB