hulk inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/ID89XG -------------------------------- The cpu_clustergroup_mask() does not represent the actual CPU topology. Fixes: a042432f1f90 ("sched: topology: Build soft domain for LLC") Signed-off-by: Zhang Qiao <zhangqiao22@huawei.com> --- kernel/sched/soft_domain.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/kernel/sched/soft_domain.c b/kernel/sched/soft_domain.c index fdf53fa932b5..f8bca1005b4e 100644 --- a/kernel/sched/soft_domain.c +++ b/kernel/sched/soft_domain.c @@ -46,10 +46,9 @@ static DEFINE_PER_CPU(struct soft_domain *, g_sf_d); static void free_sub_soft_domain(struct soft_domain *sf_d); -static int build_soft_sub_domain(struct sched_domain *sd, struct cpumask *cpus) +static int build_soft_sub_domain(int nid, struct cpumask *cpus) { - struct cpumask *span = sched_domain_span(sd); - int nid = cpu_to_node(cpumask_first(span)); + const struct cpumask *span = cpumask_of_node(nid); struct soft_domain *sf_d = NULL; int i; @@ -72,8 +71,8 @@ static int build_soft_sub_domain(struct sched_domain *sd, struct cpumask *cpus) return -ENOMEM; } list_add_tail(&sub_d->node, &sf_d->child_domain); - cpumask_and(soft_domain_span(sub_d->span), span, cpu_clustergroup_mask(i)); - cpumask_andnot(cpus, cpus, cpu_clustergroup_mask(i)); + cpumask_and(soft_domain_span(sub_d->span), span, topology_cluster_cpumask(i)); + cpumask_andnot(cpus, cpus, topology_cluster_cpumask(i)); } for_each_cpu(i, span) { @@ -117,7 +116,6 @@ static void free_soft_domain(void) void build_soft_domain(void) { - struct sched_domain *sd; static struct cpumask cpus; int i, ret; @@ -126,15 +124,12 @@ void build_soft_domain(void) cpumask_copy(&cpus, cpu_active_mask); rcu_read_lock(); - for_each_cpu(i, &cpus) { - /* build soft domain for each llc domain. */ - sd = rcu_dereference(per_cpu(sd_llc, i)); - if (sd) { - ret = build_soft_sub_domain(sd, &cpus); - if (ret) { - free_soft_domain(); - goto out; - } + for (i = 0; i < nr_node_ids; i++) { + /* build soft domain for each numa domain. */ + ret = build_soft_sub_domain(i, &cpus); + if (ret) { + free_soft_domain(); + goto out; } } -- 2.18.0.huawei.25