• Daisuke Nishimura's avatar
    sched: Fix cgroup movement of waking process · 62af3783
    Daisuke Nishimura authored
    There is a small race between try_to_wake_up() and sched_move_task(),
    which is trying to move the process being woken up.
    
        try_to_wake_up() on CPU0       sched_move_task() on CPU1
    --------------------------------+---------------------------------
      raw_spin_lock_irqsave(p->pi_lock)
      task_waking_fair()
        ->p.se.vruntime -= cfs_rq->min_vruntime
      ttwu_queue()
        ->send reschedule IPI to CPU1
      raw_spin_unlock_irqsave(p->pi_lock)
                                       task_rq_lock()
                                         -> tring to aquire both p->pi_lock and
                                            rq->lock with IRQ disabled
                                       task_move_group_fair()
                                         -> p.se.vruntime
                                              -= (old)cfs_rq->min_vruntime
                                              += (new)cfs_rq->min_vruntime
                                       task_rq_unlock()
    
                                       (via IPI)
                                       sched_ttwu_pending()
                                         raw_spin_lock(rq->lock)
                                         ttwu_do_activate()
                                           ...
                                           enqueue_entity()
                                             child.se->vruntime += cfs_rq->min_vruntime
                                         raw_spin_unlock(rq->lock)
    
    As a result, vruntime of the process 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_waking_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/20111215143741.df82dd50.nishimura@mxp.nes.nec.co.jpSigned-off-by: default avatarIngo Molnar <mingo@elte.hu>
    62af3783
fair.c 141 KB