• P
    sched/fair: Fix calc_cfs_shares() fixed point arithmetics width confusion · ea1dc6fc
    Peter Zijlstra 提交于
    Commit:
    
      fde7d22e ("sched/fair: Fix overly small weight for interactive group entities")
    
    did something non-obvious but also did it buggy yet latent.
    
    The problem was exposed for real by a later commit in the v4.7 merge window:
    
      2159197d ("sched/core: Enable increased load resolution on 64-bit kernels")
    
    ... after which tg->load_avg and cfs_rq->load.weight had different
    units (10 bit fixed point and 20 bit fixed point resp.).
    
    Add a comment to explain the use of cfs_rq->load.weight over the
    'natural' cfs_rq->avg.load_avg and add scale_load_down() to correct
    for the difference in unit.
    
    Since this is (now, as per a previous commit) the only user of
    calc_tg_weight(), collapse it.
    
    The effects of this bug should be randomly inconsistent SMP-balancing
    of cgroups workloads.
    Reported-by: NJirka Hladky <jhladky@redhat.com>
    Signed-off-by: NPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Fixes: 2159197d ("sched/core: Enable increased load resolution on 64-bit kernels")
    Fixes: fde7d22e ("sched/fair: Fix overly small weight for interactive group entities")
    Signed-off-by: NIngo Molnar <mingo@kernel.org>
    ea1dc6fc
fair.c 228.9 KB