lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 102/757] sched/fair: Fix wrong cpu selecting from isolated domain
    Date
    From: Xunlei Pang <xlpang@linux.alibaba.com>

    [ Upstream commit df3cb4ea1fb63ff326488efd671ba3c39034255e ]

    We've met problems that occasionally tasks with full cpumask
    (e.g. by putting it into a cpuset or setting to full affinity)
    were migrated to our isolated cpus in production environment.

    After some analysis, we found that it is due to the current
    select_idle_smt() not considering the sched_domain mask.

    Steps to reproduce on my 31-CPU hyperthreads machine:
    1. with boot parameter: "isolcpus=domain,2-31"
    (thread lists: 0,16 and 1,17)
    2. cgcreate -g cpu:test; cgexec -g cpu:test "test_threads"
    3. some threads will be migrated to the isolated cpu16~17.

    Fix it by checking the valid domain mask in select_idle_smt().

    Fixes: 10e2f1acd010 ("sched/core: Rewrite and improve select_idle_siblings())
    Reported-by: Wetp Zhang <wetp.zy@linux.alibaba.com>
    Signed-off-by: Xunlei Pang <xlpang@linux.alibaba.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Jiang Biao <benbjiang@tencent.com>
    Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>
    Link: https://lkml.kernel.org/r/1600930127-76857-1-git-send-email-xlpang@linux.alibaba.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/sched/fair.c | 9 +++++----
    1 file changed, 5 insertions(+), 4 deletions(-)

    diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
    index 51408ebd76c27..ea3d20be3e756 100644
    --- a/kernel/sched/fair.c
    +++ b/kernel/sched/fair.c
    @@ -6075,7 +6075,7 @@ static int select_idle_core(struct task_struct *p, struct sched_domain *sd, int
    /*
    * Scan the local SMT mask for idle CPUs.
    */
    -static int select_idle_smt(struct task_struct *p, int target)
    +static int select_idle_smt(struct task_struct *p, struct sched_domain *sd, int target)
    {
    int cpu;

    @@ -6083,7 +6083,8 @@ static int select_idle_smt(struct task_struct *p, int target)
    return -1;

    for_each_cpu(cpu, cpu_smt_mask(target)) {
    - if (!cpumask_test_cpu(cpu, p->cpus_ptr))
    + if (!cpumask_test_cpu(cpu, p->cpus_ptr) ||
    + !cpumask_test_cpu(cpu, sched_domain_span(sd)))
    continue;
    if (available_idle_cpu(cpu) || sched_idle_cpu(cpu))
    return cpu;
    @@ -6099,7 +6100,7 @@ static inline int select_idle_core(struct task_struct *p, struct sched_domain *s
    return -1;
    }

    -static inline int select_idle_smt(struct task_struct *p, int target)
    +static inline int select_idle_smt(struct task_struct *p, struct sched_domain *sd, int target)
    {
    return -1;
    }
    @@ -6274,7 +6275,7 @@ static int select_idle_sibling(struct task_struct *p, int prev, int target)
    if ((unsigned)i < nr_cpumask_bits)
    return i;

    - i = select_idle_smt(p, target);
    + i = select_idle_smt(p, sd, target);
    if ((unsigned)i < nr_cpumask_bits)
    return i;

    --
    2.25.1


    \
     
     \ /
      Last update: 2020-10-27 16:31    [W:4.034 / U:0.320 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site