lkml.org 
[lkml]   [2020]   [Feb]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 13/13] sched/numa: Stop an exhastive search if a reasonable swap candidate or idle CPU is found
    Date
    When domains are imbalanced or overloaded a search of all CPUs on the
    target domain is searched and compared with task_numa_compare. In some
    circumstances, a candidate is found that is an obvious win.

    o A task can move to an idle CPU and an idle CPU is found
    o A swap candidate is found that would move to its preferred domain

    This patch terminates the search when either condition is met.

    Signed-off-by: Mel Gorman <mgorman@techsingularity.net>
    ---
    kernel/sched/fair.c | 31 +++++++++++++++++++++++++++----
    1 file changed, 27 insertions(+), 4 deletions(-)

    diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
    index 935baf529f10..a1d5760f7985 100644
    --- a/kernel/sched/fair.c
    +++ b/kernel/sched/fair.c
    @@ -1707,7 +1707,7 @@ static bool load_too_imbalanced(long src_load, long dst_load,
    * into account that it might be best if task running on the dst_cpu should
    * be exchanged with the source task
    */
    -static void task_numa_compare(struct task_numa_env *env,
    +static bool task_numa_compare(struct task_numa_env *env,
    long taskimp, long groupimp, bool maymove)
    {
    struct numa_group *cur_ng, *p_ng = deref_curr_numa_group(env->p);
    @@ -1718,9 +1718,10 @@ static void task_numa_compare(struct task_numa_env *env,
    int dist = env->dist;
    long moveimp = imp;
    long load;
    + bool stopsearch = false;

    if (READ_ONCE(dst_rq->numa_migrate_on))
    - return;
    + return false;

    rcu_read_lock();
    cur = rcu_dereference(dst_rq->curr);
    @@ -1731,8 +1732,10 @@ static void task_numa_compare(struct task_numa_env *env,
    * Because we have preemption enabled we can get migrated around and
    * end try selecting ourselves (current == env->p) as a swap candidate.
    */
    - if (cur == env->p)
    + if (cur == env->p) {
    + stopsearch = true;
    goto unlock;
    + }

    if (!cur) {
    if (maymove && moveimp >= env->best_imp)
    @@ -1860,8 +1863,27 @@ static void task_numa_compare(struct task_numa_env *env,
    }

    task_numa_assign(env, cur, imp);
    +
    + /*
    + * If a move to idle is allowed because there is capacity or load
    + * balance improves then stop the search. While a better swap
    + * candidate may exist, a search is not free.
    + */
    + if (maymove && !cur && env->best_cpu >= 0 && idle_cpu(env->best_cpu))
    + stopsearch = true;
    +
    + /*
    + * If a swap candidate must be identified and the current best task
    + * moves its preferred node then stop the search.
    + */
    + if (!maymove && env->best_task &&
    + env->best_task->numa_preferred_nid == env->src_nid) {
    + stopsearch = true;
    + }
    unlock:
    rcu_read_unlock();
    +
    + return stopsearch;
    }

    static void task_numa_find_cpu(struct task_numa_env *env,
    @@ -1911,7 +1933,8 @@ static void task_numa_find_cpu(struct task_numa_env *env,
    continue;

    env->dst_cpu = cpu;
    - task_numa_compare(env, taskimp, groupimp, maymove);
    + if (task_numa_compare(env, taskimp, groupimp, maymove))
    + break;
    }
    }

    --
    2.16.4
    \
     
     \ /
      Last update: 2020-02-17 11:47    [W:5.720 / U:0.292 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site