• D
    sched: fix __pick_next_entity() · 08ec3df5
    Dmitry Adamushko 提交于
    The thing is that __pick_next_entity() must never be called when
    first_fair(cfs_rq) == NULL. It wouldn't be a problem, should 'run_node'
    be the very first field of 'struct sched_entity' (and it's the second).
    
    The 'nr_running != 0' check is _not_ enough, due to the fact that
    'current' is not within the tree. Generic paths are ok (e.g. schedule()
    as put_prev_task() is called previously)... I'm more worried about e.g.
    migration_call() -> CPU_DEAD_FROZEN -> migrate_dead_tasks()... if
    'current' == rq->idle, no problems.. if it's one of the SCHED_NORMAL
    tasks (or imagine, some other use-cases in the future -- i.e. we should
    not make outer world dependent on internal details of sched_fair class)
    -- it may be "Houston, we've got a problem" case.
    
    it's +16 bytes to the ".text". Another variant is to make 'run_node' the
    first data member of 'struct sched_entity' but an additional check (se !
    = NULL) is still needed in pick_next_entity().
    Signed-off-by: NDmitry Adamushko <dmitry.adamushko@gmail.com>
    Signed-off-by: NIngo Molnar <mingo@elte.hu>
    Reviewed-by: NThomas Gleixner <tglx@linutronix.de>
    08ec3df5
sched_fair.c 25.5 KB