lkml.org 
[lkml]   [2009]   [Jan]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 07/46] sched: fix update_min_vruntime
    2.6.28-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Peter Zijlstra <a.p.zijlstra@chello.nl>

    commit e17036dac189dd034c092a91df56aa740db7146d upstream.

    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: 1af5f730fc1bf7c62ec9fb2d307206e18bf40a69
    (sched: more accurate min_vruntime accounting).

    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Tested-by: Mike Galbraith <efault@gmx.de>
    Acked-by: Mike Galbraith <efault@gmx.de>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    kernel/sched_fair.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- a/kernel/sched_fair.c
    +++ b/kernel/sched_fair.c
    @@ -283,7 +283,7 @@ static void update_min_vruntime(struct c
    struct sched_entity,
    run_node);

    - if (vruntime == cfs_rq->min_vruntime)
    + if (!cfs_rq->curr)
    vruntime = se->vruntime;
    else
    vruntime = min_vruntime(vruntime, se->vruntime);


    \
     
     \ /
      Last update: 2009-01-23 02:23    [W:4.054 / U:0.436 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site