• P
    sched: fix share (re)distribution · 3f5087a2
    Peter Zijlstra 提交于
    fix __aggregate_redistribute_shares() related lockup reported by
    David S. Miller.
    
    The problem this code tries to solve is 'accurately' calculating the 'fair'
    share of the group weight for each cpu. The current code falls back to a global
    group rebalance in case the sched_domain's span it looks at has no shares, but
    does have tasks.
    
    The reason it gets stuck here, is because its inherently racy - if someone
    steals the last task after we compute the agg->rq_weight, but before we
    rebalance, we'll never get out of the loop.
    
    We could of course go fix that, but while looking at this issue I found that
    this 'fallback' wasn't nearly as rare as I'd hoped it to be. In fact its quite
    common - and given it walks the whole machine, thats very bad.
    
    The new approach is simple (why didn't I think of it before?), we set the
    aggregate shares to the full task group weight, and each larger sched domain
    that encounters an aggregate shares larger than the weight, clips it (it
    already re-distributes anyway).
    
    This nicely converges to the desired global picture where the sum of all
    shares equals the task group weight.
    Signed-off-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
    Signed-off-by: NIngo Molnar <mingo@elte.hu>
    3f5087a2
sched.c 223.3 KB