• Peter Zijlstra's avatar
    sched: Allow balance callbacks for check_class_changed() · 4c9a4bc8
    Peter Zijlstra authored
    In order to remove dropping rq->lock from the
    switched_{to,from}()/prio_changed() sched_class methods, run the
    balance callbacks after it.
    
    We need to remove dropping rq->lock because its buggy,
    suppose using sched_setattr()/sched_setscheduler() to change a running
    task from FIFO to OTHER.
    
    By the time we get to switched_from_rt() the task is already enqueued
    on the cfs runqueues. If switched_from_rt() does pull_rt_task() and
    drops rq->lock, load-balancing can come in and move our task @p to
    another rq.
    
    The subsequent switched_to_fair() still assumes @p is on @rq and bad
    things will happen.
    
    By using balance callbacks we delay the load-balancing operations
    {rt,dl}x{push,pull} until we've done all the important work and the
    task is fully set up.
    
    Furthermore, the balance callbacks do not know about @p, therefore
    they cannot get confused like this.
    Reported-by: default avatarMike Galbraith <umgwanakikbuti@gmail.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: ktkhai@parallels.com
    Cc: rostedt@goodmis.org
    Cc: juri.lelli@gmail.com
    Cc: pang.xunlei@linaro.org
    Cc: oleg@redhat.com
    Cc: wanpeng.li@linux.intel.com
    Link: http://lkml.kernel.org/r/20150611124742.615343911@infradead.orgSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    4c9a4bc8
core.c 201 KB