From: Dietmar Eggemann <dietmar.eggemann@arm.com>
To: Qing Wang <wangqing@vivo.com>,
Sudeep Holla <sudeep.holla@arm.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
"Rafael J. Wysocki" <rafael@kernel.org>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] arch_topology: support parsing cluster_id from DT
Date: Tue, 10 May 2022 19:21:41 +0200 [thread overview]
Message-ID: <f7d6d1ec-e95d-9c7a-db7c-e1445f6ff8fe@arm.com> (raw)
In-Reply-To: <1651739735-51884-1-git-send-email-wangqing@vivo.com>
On 05/05/2022 10:35, Qing Wang wrote:
> From: Wang Qing <wangqing@vivo.com>
>
> Use nested cluster structures in DT to support describing multi-level
> cluster topologies.
>
> Notice: the clusters describing in DT currently are not physical
> boundaries, since changing "cluster" to "socket" is too involved and error
> prone, this patch will not have any effect on one-level cluster topo, but
> can support the mutil-level cluster topo to support CLUSTER_SCHED.
>
> Signed-off-by: Wang Qing <wangqing@vivo.com>
> ---
> drivers/base/arch_topology.c | 25 +++++++++++++++++--------
> 1 file changed, 17 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c
> index 1d6636ebaac5..f2ea8113d619 100644
> --- a/drivers/base/arch_topology.c
> +++ b/drivers/base/arch_topology.c
> @@ -491,7 +491,7 @@ static int __init get_cpu_for_node(struct device_node *node)
> }
>
> static int __init parse_core(struct device_node *core, int package_id,
> - int core_id)
> + int cluster_id, int core_id)
> {
> char name[20];
> bool leaf = true;
> @@ -507,6 +507,7 @@ static int __init parse_core(struct device_node *core, int package_id,
> cpu = get_cpu_for_node(t);
> if (cpu >= 0) {
> cpu_topology[cpu].package_id = package_id;
> + cpu_topology[cpu].cluster_id = cluster_id;
> cpu_topology[cpu].core_id = core_id;
> cpu_topology[cpu].thread_id = i;
> } else if (cpu != -ENODEV) {
> @@ -528,6 +529,7 @@ static int __init parse_core(struct device_node *core, int package_id,
> }
>
> cpu_topology[cpu].package_id = package_id;
> + cpu_topology[cpu].cluster_id = cluster_id;
> cpu_topology[cpu].core_id = core_id;
> } else if (leaf && cpu != -ENODEV) {
> pr_err("%pOF: Can't get CPU for leaf core\n", core);
> @@ -544,13 +546,15 @@ static int __init parse_cluster(struct device_node *cluster, int depth)
> bool has_cores = false;
> struct device_node *c;
> static int package_id __initdata;
> + static int cluster_id __initdata;
Starting with cluster_id = 0 breaks existing platforms like
./arch/arm64/boot/dts/arm/juno.dts. For them it has to be still set to -1.
You get e.g.:
# cat /sys/kernel/debug/sched/domains/cpu1/domain*/name
CLS
DIE
instead of:
# cat /sys/kernel/debug/sched/domains/cpu1/domain*/name
MC
DIE
> int core_id = 0;
> int i, ret;
>
> /*
> - * First check for child clusters; we currently ignore any
> - * information about the nesting of clusters and present the
> - * scheduler with a flat list of them.
> + * nesting of clusters :
> + * level 1: package_id
> + * level 2: cluster_id
> + * level 3+: ignore
> */
> i = 0;
> do {
> @@ -559,6 +563,14 @@ static int __init parse_cluster(struct device_node *cluster, int depth)
> if (c) {
> leaf = false;
> ret = parse_cluster(c, depth + 1);
> + if (depth == 0) {
> + package_id++;
> + cluster_id = 0;
- cluster_id = 0;
+ cluster_id = -1;
Would have to be cluster_id = -1. 0 is a valid 2. level cluster.
Otherwise you're not removing the CLS data from CPU4 to CPU7 in the
`Armv9 with L2 complexes` cpu-map example I used for testing:
cpu-map {
cluster0 {
cluster0 {
core0 {
cpu = <&cpu0>;
};
core1 {
cpu = <&cpu1>;
};
};
cluster1 {
core0 {
cpu = <&cpu2>;
};
core1 {
cpu = <&cpu3>;
};
};
};
cluster1 {
core0 {
cpu = <&cpu4>;
};
core1 {
cpu = <&cpu5>;
};
core2 {
cpu = <&cpu6>;
};
};
cluster2 {
core0 {
cpu = <&cpu7>;
};
};
};
> + } else if (depth == 1)
> + cluster_id++;
> + else
> + pr_err("Ignore nested clusters with more than two levels!\n");
> +
> of_node_put(c);
> if (ret != 0)
> return ret;
> @@ -582,7 +594,7 @@ static int __init parse_cluster(struct device_node *cluster, int depth)
> }
>
> if (leaf) {
> - ret = parse_core(c, package_id, core_id++);
> + ret = parse_core(c, package_id, cluster_id, core_id++);
> } else {
> pr_err("%pOF: Non-leaf cluster with core %s\n",
> cluster, name);
> @@ -599,9 +611,6 @@ static int __init parse_cluster(struct device_node *cluster, int depth)
> if (leaf && !has_cores)
> pr_warn("%pOF: empty cluster\n", cluster);
>
> - if (leaf)
> - package_id++;
> -
> return 0;
> }
Looks like you also need to adapt update_siblings_masks() to only set
cpu in &cpu_topo->thread_sibling and &cpuid_topo->thread_sibling when
`cpu_topo->thread_id != -1`.
@@ -723,11 +723,11 @@ void update_siblings_masks(unsigned int cpuid)
cpumask_set_cpu(cpuid, &cpu_topo->core_sibling);
cpumask_set_cpu(cpu, &cpuid_topo->core_sibling);
- if (cpuid_topo->core_id != cpu_topo->core_id)
- continue;
-
- cpumask_set_cpu(cpuid, &cpu_topo->thread_sibling);
- cpumask_set_cpu(cpu, &cpuid_topo->thread_sibling);
+ if (cpu_topo->thread_id != -1 &&
+ cpuid_topo->core_id == cpu_topo->core_id) {
+ cpumask_set_cpu(cpuid, &cpu_topo->thread_sibling);
+ cpumask_set_cpu(cpu, &cpuid_topo->thread_sibling);
+
next prev parent reply other threads:[~2022-05-10 17:22 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-05 8:35 [PATCH] arch_topology: support parsing cluster_id from DT Qing Wang
2022-05-10 17:21 ` Dietmar Eggemann [this message]
2022-05-11 9:38 ` 王擎
2022-05-12 9:52 ` Dietmar Eggemann
2022-05-12 12:52 ` 王擎
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f7d6d1ec-e95d-9c7a-db7c-e1445f6ff8fe@arm.com \
--to=dietmar.eggemann@arm.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rafael@kernel.org \
--cc=sudeep.holla@arm.com \
--cc=wangqing@vivo.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.