• Vincent Guittot's avatar
    sched/cgroup: Fix cpu_cgroup_fork() handling · ea86cb4b
    Vincent Guittot authored
    A new fair task is detached and attached from/to task_group with:
    
      cgroup_post_fork()
        ss->fork(child) := cpu_cgroup_fork()
          sched_move_task()
            task_move_group_fair()
    
    Which is wrong, because at this point in fork() the task isn't fully
    initialized and it cannot 'move' to another group, because its not
    attached to any group as yet.
    
    In fact, cpu_cgroup_fork() needs a small part of sched_move_task() so we
    can just call this small part directly instead sched_move_task(). And
    the task doesn't really migrate because it is not yet attached so we
    need the following sequence:
    
      do_fork()
        sched_fork()
          __set_task_cpu()
    
        cgroup_post_fork()
          set_task_rq() # set task group and runqueue
    
        wake_up_new_task()
          select_task_rq() can select a new cpu
          __set_task_cpu
          post_init_entity_util_avg
            attach_task_cfs_rq()
          activate_task
            enqueue_task
    
    This patch makes that happen.
    Signed-off-by: default avatarVincent Guittot <vincent.guittot@linaro.org>
    [ Added TASK_SET_GROUP to set depth properly. ]
    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: linux-kernel@vger.kernel.org
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    ea86cb4b
fair.c 229 KB