• Daisuke Nishimura's avatar
    sched: Fix cgroup movement of newly created process · 7ceff013
    Daisuke Nishimura authored
    There is a small race between do_fork() and sched_move_task(), which is
    trying to move the child.
    
                do_fork()                 sched_move_task()
    --------------------------------+---------------------------------
      copy_process()
        sched_fork()
          task_fork_fair()
            -> vruntime of the child is initialized
               based on that of the parent.
      -> we can see the child in "tasks" file now.
                                        task_rq_lock()
                                        task_move_group_fair()
                                          -> child.se.vruntime
                                               -= (old)cfs_rq->min_vruntime
                                               += (new)cfs_rq->min_vruntime
                                        task_rq_unlock()
      wake_up_new_task()
        ...
        enqueue_entity()
          child.se.vruntime += cfs_rq->min_vruntime
    
    As a result, vruntime of the child becomes far bigger than min_vruntime,
    if (new)cfs_rq->min_vruntime >> (old)cfs_rq->min_vruntime.
    
    This patch fixes this problem by just ignoring such process in
    task_move_group_fair(), because the vruntime has already been normalized in
    task_fork_fair().
    Signed-off-by: default avatarDaisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
    Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Tejun Heo <tj@kernel.org>
    Link: http://lkml.kernel.org/r/20111215143607.2ee12c5d.nishimura@mxp.nes.nec.co.jpSigned-off-by: default avatarIngo Molnar <mingo@elte.hu>
    7ceff013
fair.c 141 KB