• Vincent Guittot's avatar
    sched/pelt: Fix false running accounting · f235a54f
    Vincent Guittot authored
    The running state is a subset of runnable state which means that running
    can't be set if runnable (weight) is cleared. There are corner cases
    where the current sched_entity has been already dequeued but cfs_rq->curr
    has not been updated yet and still points to the dequeued sched_entity.
    If ___update_load_avg() is called at that time, weight will be 0 and running
    will be set which is not possible.
    
    This case happens during pick_next_task_fair() when a cfs_rq becomes idles.
    The current sched_entity has been dequeued so se->on_rq is cleared and
    cfs_rq->weight is null. But cfs_rq->curr still points to se (it will be
    cleared when picking the idle thread). Because the cfs_rq becomes idle,
    idle_balance() is called and ends up to call update_blocked_averages()
    with these wrong running and runnable states.
    
    Add a test in ___update_load_avg() to correct the running state in this case.
    Signed-off-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: Morten.Rasmussen@arm.com
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: dietmar.eggemann@arm.com
    Link: http://lkml.kernel.org/r/1498885573-18984-1-git-send-email-vincent.guittot@linaro.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    f235a54f
fair.c 247 KB