• Peter Zijlstra's avatar
    sched/fair: Fix PELT integrity for new groups · 01011473
    Peter Zijlstra authored
    Vincent reported that when a new task is moved into a new cgroup it
    gets attached twice to the load tracking:
    
      sched_move_task()
        task_move_group_fair()
          detach_task_cfs_rq()
          set_task_rq()
          attach_task_cfs_rq()
            attach_entity_load_avg()
              se->avg.last_load_update = cfs_rq->avg.last_load_update // == 0
    
      enqueue_entity()
        enqueue_entity_load_avg()
          update_cfs_rq_load_avg()
            now = clock()
            __update_load_avg(&cfs_rq->avg)
              cfs_rq->avg.last_load_update = now
              // ages load/util for: now - 0, load/util -> 0
          if (migrated)
            attach_entity_load_avg()
              se->avg.last_load_update = cfs_rq->avg.last_load_update; // now != 0
    
    The problem is that we don't update cfs_rq load_avg before all
    entity attach/detach operations. Only enqueue_task() and migrate_task()
    do this.
    
    By fixing this, the above will not happen, because the
    sched_move_task() attach will have updated cfs_rq's last_load_update
    time before attach, and in turn the attach will have set the entity's
    last_load_update stamp.
    
    Note that there is a further problem with sched_move_task() calling
    detach on a task that hasn't yet been attached; this will be taken
    care of in a subsequent patch.
    Reported-by: default avatarVincent Guittot <vincent.guittot@linaro.org>
    Tested-by: default avatarVincent Guittot <vincent.guittot@linaro.org>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Mike Galbraith <efault@gmx.de>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Yuyang Du <yuyang.du@intel.com>
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    01011473
fair.c 228 KB