• Peter Zijlstra's avatar
    sched: fix update_min_vruntime · e17036da
    Peter Zijlstra authored
    Impact: fix SCHED_IDLE latency problems
    
    OK, so we have 1 running task A (which is obviously curr and the tree is
    equally obviously empty).
    
    'A' nicely chugs along, doing its thing, carrying min_vruntime along as it
    goes.
    
    Then some whacko speed freak SCHED_IDLE task gets inserted due to SMP
    balancing, which is very likely far right, in that case
    
    update_curr
      update_min_vruntime
        cfs_rq->rb_leftmost := true (the crazy task sitting in a tree)
          vruntime = se->vruntime
    
    and voila, min_vruntime is waaay right of where it ought to be.
    
    OK, so why did I write it like that to begin with...
    
    Aah, yes.
    
    Say we've just dequeued current
    
    schedule
      deactivate_task(prev)
        dequeue_entity
          update_min_vruntime
    
    Then we'll set
    
      vruntime = cfs_rq->min_vruntime;
    
    we find !cfs_rq->curr, but do find someone in the tree. Then we _must_
    do vruntime = se->vruntime, because
    
     vruntime = min_vruntime(vruntime := cfs_rq->min_vruntime, se->vruntime)
    
    will not advance vruntime, and cause lags the other way around (which we
    fixed with that initial patch: 1af5f730
    (sched: more accurate min_vruntime accounting).
    Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    Tested-by: default avatarMike Galbraith <efault@gmx.de>
    Acked-by: default avatarMike Galbraith <efault@gmx.de>
    Cc: <stable@kernel.org>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    e17036da
sched_fair.c 41.8 KB