• Paul Turner's avatar
    sched: Fix interactivity bug by charging unaccounted run-time on entity re-weight · 19e5eebb
    Paul Turner authored
    Mike Galbraith reported poor interactivity[*] when the new shares distribution
    code was combined with autogroups.
    
    The root cause turns out to be a mis-ordering of accounting accrued execution
    time and shares updates.  Since update_curr() is issued hierarchically,
    updating the parent entity weights to reflect child enqueue/dequeue results in
    the parent's unaccounted execution time then being accrued (vs vruntime) at the
    new weight as opposed to the weight present at accumulation.
    
    While this doesn't have much effect on processes with timeslices that cross a
    tick, it is particularly problematic for an interactive process (e.g. Xorg)
    which incurs many (tiny) timeslices.  In this scenario almost all updates are
    at dequeue which can result in significant fairness perturbation (especially if
    it is the only thread, resulting in potential {tg->shares, MIN_SHARES}
    transitions).
    
    Correct this by ensuring unaccounted time is accumulated prior to manipulating
    an entity's weight.
    
    [*] http://xkcd.com/619/ is perversely Nostradamian here.
    Signed-off-by: default avatarPaul Turner <pjt@google.com>
    Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Mike Galbraith <efault@gmx.de>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    LKML-Reference: <20101216031038.159704378@google.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    19e5eebb
sched_fair.c 107 KB