• Vincent Guittot's avatar
    sched/fair: Make sure to update tg contrib for blocked load · 02da26ad
    Vincent Guittot authored
    During the update of fair blocked load (__update_blocked_fair()), we
    update the contribution of the cfs in tg->load_avg if cfs_rq's pelt
    has decayed.  Nevertheless, the pelt values of a cfs_rq could have
    been recently updated while propagating the change of a child. In this
    case, cfs_rq's pelt will not decayed because it has already been
    updated and we don't update tg->load_avg.
    
    __update_blocked_fair
      ...
      for_each_leaf_cfs_rq_safe: child cfs_rq
        update cfs_rq_load_avg() for child cfs_rq
        ...
        update_load_avg(cfs_rq_of(se), se, 0)
          ...
          update cfs_rq_load_avg() for parent cfs_rq
    		-propagation of child's load makes parent cfs_rq->load_sum
    		 becoming null
            -UPDATE_TG is not set so it doesn't update parent
    		 cfs_rq->tg_load_avg_contrib
      ..
      for_each_leaf_cfs_rq_safe: parent cfs_rq
        update cfs_rq_load_avg() for parent cfs_rq
          - nothing to do because parent cfs_rq has already been updated
    		recently so cfs_rq->tg_load_avg_contrib is not updated
        ...
        parent cfs_rq is decayed
          list_del_leaf_cfs_rq parent cfs_rq
    	  - but it still contibutes to tg->load_avg
    
    we must set UPDATE_TG flags when propagting pending load to the parent
    
    Fixes: 039ae8bc
    
     ("sched/fair: Fix O(nr_cgroups) in the load balancing path")
    Reported-by: default avatarOdin Ugedal <odin@uged.al>
    Signed-off-by: default avatarVincent Guittot <vincent.guittot@linaro.org>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: default avatarOdin Ugedal <odin@uged.al>
    Link: https://lkml.kernel.org/r/20210527122916.27683-3-vincent.guittot@linaro.org
    02da26ad
fair.c 299 KB