• Peter Zijlstra's avatar
    sched: Merge select_task_rq_fair() and sched_balance_self() · c88d5910
    Peter Zijlstra authored
    The problem with wake_idle() is that is doesn't respect things like
    cpu_power, which means it doesn't deal well with SMT nor the recent
    RT interaction.
    
    To cure this, it needs to do what sched_balance_self() does, which
    leads to the possibility of merging select_task_rq_fair() and
    sched_balance_self().
    
    Modify sched_balance_self() to:
    
      - update_shares() when walking up the domain tree,
        (it only called it for the top domain, but it should
         have done this anyway), which allows us to remove
        this ugly bit from try_to_wake_up().
    
      - do wake_affine() on the smallest domain that contains
        both this (the waking) and the prev (the wakee) cpu for
        WAKE invocations.
    
    Then use the top-down balance steps it had to replace wake_idle().
    
    This leads to the dissapearance of SD_WAKE_BALANCE and
    SD_WAKE_IDLE_FAR, with SD_WAKE_IDLE replaced with SD_BALANCE_WAKE.
    
    SD_WAKE_AFFINE needs SD_BALANCE_WAKE to be effective.
    
    Touch all topology bits to replace the old with new SD flags --
    platforms might need re-tuning, enabling SD_BALANCE_WAKE
    conditionally on a NUMA distance seems like a good additional
    feature, magny-core and small nehalem systems would want this
    enabled, systems with slow interconnects would not.
    Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    LKML-Reference: <new-submission>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    c88d5910
topology.h 3.19 KB