From: Yicong Yang <hidden> Date: 2025-02-18 14:10:12
From: Yicong Yang <yangyicong@hisilicon.com>
The core CPU control framework supports runtime SMT control which
is not yet supported on arm64. Besides the general vulnerabilities
concerns we want this runtime control on our arm64 server for:
- better single CPU performance in some cases
- saving overall power consumption
This patchset implements it in the following aspects:
- Provides a default topology_is_primary_thread()
- support retrieve SMT thread number on OF based system
- support retrieve SMT thread number on ACPI based system
- select HOTPLUG_SMT for arm64
Tests has been done on our ACPI based arm64 server and on ACPI/OF
based QEMU VMs.
Change since v10:
- handle topology parsing failure case on DT based system
- address some style comments per Jonathan and add tags, Thanks
Link: https://lore.kernel.org/linux-arm-kernel/20241220075313.51502-1-yangyicong@huawei.com/
Change since v9:
- Refine the comment of topology_is_primary_thread(). Tested with LoongArch
to prove it also works on architecture's not using CONFIG_GENERIC_ARCH_TOPOLOGY
- always call cpu_smt_set_num_threads() to make the smt/control shows correct
status on non-SMT system
Link: https://lore.kernel.org/linux-arm-kernel/20241114141127.23232-1-yangyicong@huawei.com/
Change since v8:
- Fix WARN on ACPI based non-SMT platform noticed in v7, per Pierre.
Link: https://lore.kernel.org/all/20241105093237.63565-1-yangyicong@huawei.com/
Change since v7:
Address the comments from Thomas:
- Add a newline between the glue define and function of topology_is_primary_thread
- Explicitly mention the sibling mask won't be empty in the comment
Link: https://lore.kernel.org/lkml/20241030125415.18994-1-yangyicong@huawei.com/
Change since v6:
- Fix unused variable if !CONFIG_ARM64 || !CONFIG_RISV found by lkp-test
- Fix max_smt_thread_num updating in OF path pointed by Pierre
- Drop unused variable and refine the comments/commit per Pierre
Link: https://lore.kernel.org/linux-arm-kernel/20241015021841.35713-1-yangyicong@huawei.com/
Change since v5:
- Drop the dependency on CONFIG_SMP since it's always on on arm64, per Pierre
- Avoid potential multiple calls of cpu_smt_set_num_threads() on asymmetric system, per Dietmar
- Detect heterogenous SMT topology and issue a warning for partly support, per Pierre
- Thanks Dietmar for testing, didn't pickup the tag due to code changes. Thanks testing by Pierre
Link: https://lore.kernel.org/linux-arm-kernel/20240806085320.63514-1-yangyicong@huawei.com/
Change since v4:
- Provide a default topology_is_primary_thread() in the framework, Per Will
Link: https://lore.kernel.org/linux-arm-kernel/20231121092602.47792-1-yangyicong@huawei.com/
Change since v3:
- Fix some build and kconfig error reported by kernel test robot [off-list ref]
Link: https://lore.kernel.org/linux-arm-kernel/20231114040110.54590-1-yangyicong@huawei.com/
Change since v2:
- Detect SMT thread number at topology build from ACPI/DT, avoid looping CPUs
- Split patches into ACPI/OF/arch_topology path and enable the kconfig for arm64
Link: https://lore.kernel.org/linux-arm-kernel/20231010115335.13862-1-yangyicong@huawei.com/
Yicong Yang (4):
cpu/SMT: Provide a default topology_is_primary_thread()
arch_topology: Support SMT control for OF based system
arm64: topology: Support SMT control on ACPI based system
arm64: Kconfig: Enable HOTPLUG_SMT
arch/arm64/Kconfig | 1 +
arch/arm64/kernel/topology.c | 66 +++++++++++++++++++++++++++++
arch/powerpc/include/asm/topology.h | 1 +
arch/x86/include/asm/topology.h | 2 +-
drivers/base/arch_topology.c | 27 ++++++++++++
include/linux/topology.h | 22 ++++++++++
6 files changed, 118 insertions(+), 1 deletion(-)
--
2.24.0
From: Yicong Yang <hidden> Date: 2025-02-18 14:10:11
From: Yicong Yang <yangyicong@hisilicon.com>
Currently if architectures want to support HOTPLUG_SMT they need to
provide a topology_is_primary_thread() telling the framework which
thread in the SMT cannot offline. However arm64 doesn't have a
restriction on which thread in the SMT cannot offline, a simplest
choice is that just make 1st thread as the "primary" thread. So
just make this as the default implementation in the framework and
let architectures like x86 that have special primary thread to
override this function (which they've already done).
There's no need to provide a stub function if !CONFIG_SMP or
!CONFIG_HOTPLUG_SMT. In such case the testing CPU is already
the 1st CPU in the SMT so it's always the primary thread.
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
Pre questioned in v9 [1] whether this works on architectures not using
CONFIG_GENERIC_ARCH_TOPOLOGY, See [2] for demonstration hacking on LoongArch
VM and this also works. Architectures should use this on their own situation.
[1] https://lore.kernel.org/linux-arm-kernel/427bd639-33c3-47e4-9e83-68c428eb1a7d@arm.com/
[2] https://lore.kernel.org/linux-arm-kernel/a5690fee-3019-f26c-8bad-1d95e388e877@huawei.com/
arch/powerpc/include/asm/topology.h | 1 +
arch/x86/include/asm/topology.h | 2 +-
include/linux/topology.h | 22 ++++++++++++++++++++++
3 files changed, 24 insertions(+), 1 deletion(-)
This sentence is hard to get. Do you want to say that other
architectures (CONFIG_GENERIC_ARCH_TOPOLOGY or
!CONFIG_GENERIC_ARCH_TOPOLOGY) have to check whether they can use this
default implementation or have to override it?
[...]
This sentence is hard to get. Do you want to say that other
architectures (CONFIG_GENERIC_ARCH_TOPOLOGY or
!CONFIG_GENERIC_ARCH_TOPOLOGY) have to check whether they can use this
default implementation or have to override it?
On Tue, Feb 18, 2025 at 10:10:15PM +0800, Yicong Yang wrote:
quoted hunk
From: Yicong Yang <yangyicong@hisilicon.com>
Currently if architectures want to support HOTPLUG_SMT they need to
provide a topology_is_primary_thread() telling the framework which
thread in the SMT cannot offline. However arm64 doesn't have a
restriction on which thread in the SMT cannot offline, a simplest
choice is that just make 1st thread as the "primary" thread. So
just make this as the default implementation in the framework and
let architectures like x86 that have special primary thread to
override this function (which they've already done).
There's no need to provide a stub function if !CONFIG_SMP or
!CONFIG_HOTPLUG_SMT. In such case the testing CPU is already
the 1st CPU in the SMT so it's always the primary thread.
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
Pre questioned in v9 [1] whether this works on architectures not using
CONFIG_GENERIC_ARCH_TOPOLOGY, See [2] for demonstration hacking on LoongArch
VM and this also works. Architectures should use this on their own situation.
[1] https://lore.kernel.org/linux-arm-kernel/427bd639-33c3-47e4-9e83-68c428eb1a7d@arm.com/
[2] https://lore.kernel.org/linux-arm-kernel/a5690fee-3019-f26c-8bad-1d95e388e877@huawei.com/
arch/powerpc/include/asm/topology.h | 1 +
arch/x86/include/asm/topology.h | 2 +-
include/linux/topology.h | 22 ++++++++++++++++++++++
3 files changed, 24 insertions(+), 1 deletion(-)
I may be misunderstanding the term "SMT hotplug" above. For me it is
comparable with logical CPU hotplug, so the above statement may be
misleading. IIUC, what you mean above is if SMT is disabled, the
primary thread will always remain enabled/active. Does that make sense
or am I missing something ?
--
Regards,
Sudeep
From: Yicong Yang <hidden> Date: 2025-03-03 13:39:01
On 2025/2/28 21:54, Sudeep Holla wrote:
On Tue, Feb 18, 2025 at 10:10:15PM +0800, Yicong Yang wrote:
quoted
From: Yicong Yang <yangyicong@hisilicon.com>
Currently if architectures want to support HOTPLUG_SMT they need to
provide a topology_is_primary_thread() telling the framework which
thread in the SMT cannot offline. However arm64 doesn't have a
restriction on which thread in the SMT cannot offline, a simplest
choice is that just make 1st thread as the "primary" thread. So
just make this as the default implementation in the framework and
let architectures like x86 that have special primary thread to
override this function (which they've already done).
There's no need to provide a stub function if !CONFIG_SMP or
!CONFIG_HOTPLUG_SMT. In such case the testing CPU is already
the 1st CPU in the SMT so it's always the primary thread.
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
Pre questioned in v9 [1] whether this works on architectures not using
CONFIG_GENERIC_ARCH_TOPOLOGY, See [2] for demonstration hacking on LoongArch
VM and this also works. Architectures should use this on their own situation.
[1] https://lore.kernel.org/linux-arm-kernel/427bd639-33c3-47e4-9e83-68c428eb1a7d@arm.com/
[2] https://lore.kernel.org/linux-arm-kernel/a5690fee-3019-f26c-8bad-1d95e388e877@huawei.com/
arch/powerpc/include/asm/topology.h | 1 +
arch/x86/include/asm/topology.h | 2 +-
include/linux/topology.h | 22 ++++++++++++++++++++++
3 files changed, 24 insertions(+), 1 deletion(-)
I may be misunderstanding the term "SMT hotplug" above. For me it is
comparable with logical CPU hotplug, so the above statement may be
misleading. IIUC, what you mean above is if SMT is disabled, the
primary thread will always remain enabled/active. Does that make sense
or am I missing something ?
I just the borrow the term from kconfig HOTPLUG_SMT here, but here the statement
only involves the disable part, so maybe it'll be more accurate to use "SMT
disable" rather than "SMT hotplug" here?
Thanks.
From: Yicong Yang <hidden> Date: 2025-02-18 14:10:13
From: Yicong Yang <yangyicong@hisilicon.com>
For ACPI we'll build the topology from PPTT and we cannot directly
get the SMT number of each core. Instead using a temporary xarray
to record the heterogeneous information (from ACPI_PPTT_ACPI_IDENTICAL)
and SMT information of the first core in its heterogeneous CPU cluster
when building the topology. Then we can know the largest SMT number
in the system. If a homogeneous system's using ACPI 6.2 or later,
all the CPUs should be under the root node of PPTT. There'll be
only one entry in the xarray and all the CPUs in the system will
be assumed identical.
The core's SMT control provides two interface to the users [1]:
1) enable/disable SMT by writing on/off
2) enable/disable SMT by writing thread number 1/max_thread_number
If a system have more than one SMT thread number the 2) may
not handle it well, since there're multiple thread numbers in the
system and 2) only accept 1/max_thread_number. So issue a warning
to notify the users if such system detected.
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/ABI/testing/sysfs-devices-system-cpu#n542
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
arch/arm64/kernel/topology.c | 66 ++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
@@ -57,6 +70,34 @@ int __init parse_acpi_topology(void)cpu_topology[cpu].thread_id=topology_id;topology_id=find_acpi_cpu_topology(cpu,1);cpu_topology[cpu].core_id=topology_id;++/*+*InthePPTT,CPUsbelowanodewiththe'identical+*implementation'flaghavethesamenumberofthreads.+*CountthenumberofthreadsforonlyoneCPU(i.e.+*onecore_id)amongthosewiththesamehetero_id.+*Seethecommentoffind_acpi_cpu_topology_hetero_id()+*formoredetails.+*+*Oneentryiscreatedforeachnodehaving:+*-the'identicalimplementation'flag+*-itsparentnothavingtheflag+*/+hetero_id=find_acpi_cpu_topology_hetero_id(cpu);+entry=xa_load(&hetero_cpu,hetero_id);+if(!entry){+entry=kzalloc(sizeof(*entry),GFP_KERNEL);+WARN_ON_ONCE(!entry);++if(entry){+entry->core_id=topology_id;+entry->thread_num=1;+xa_store(&hetero_cpu,hetero_id,+entry,GFP_KERNEL);+}+}elseif(entry->core_id==topology_id){+entry->thread_num++;+}}else{cpu_topology[cpu].thread_id=-1;cpu_topology[cpu].core_id=topology_id;
@@ -67,6 +108,31 @@ int __init parse_acpi_topology(void)cpu_topology[cpu].package_id=topology_id;}+/*+*Thisshouldbeashortloopdependingonthenumberofheterogeneous+*CPUclusters.Typicallyonahomogeneoussystemthere'sonlyone+*entryintheXArray.+*/+xa_for_each(&hetero_cpu,hetero_id,entry){+if(entry->thread_num!=max_smt_thread_num&&max_smt_thread_num)+pr_warn_once("Heterogeneous SMT topology is partly supported by SMT control\n");++max_smt_thread_num=max(max_smt_thread_num,entry->thread_num);+xa_erase(&hetero_cpu,hetero_id);+kfree(entry);+}++/*+*NotifytheCPUframeworkoftheSMTsupport.Initializethe+*max_smt_thread_numto1ifnoSMTsupportdetected.Athread+*numberof1canbehandledbytheframeworksowedon'tneed+*tocheckmax_smt_thread_numtoseewesupportSMTornot.+*/+if(!max_smt_thread_num)+max_smt_thread_num=1;++cpu_smt_set_num_threads(max_smt_thread_num,max_smt_thread_num);+xa_destroy(&hetero_cpu);return0;}#endif
From: Yicong Yang <yangyicong@hisilicon.com>
For ACPI we'll build the topology from PPTT and we cannot directly
get the SMT number of each core. Instead using a temporary xarray
to record the heterogeneous information (from ACPI_PPTT_ACPI_IDENTICAL)
and SMT information of the first core in its heterogeneous CPU cluster
when building the topology. Then we can know the largest SMT number
in the system. If a homogeneous system's using ACPI 6.2 or later,
all the CPUs should be under the root node of PPTT. There'll be
only one entry in the xarray and all the CPUs in the system will
be assumed identical.
The core's SMT control provides two interface to the users [1]:
1) enable/disable SMT by writing on/off
2) enable/disable SMT by writing thread number 1/max_thread_number
If a system have more than one SMT thread number the 2) may
not handle it well, since there're multiple thread numbers in the
system and 2) only accept 1/max_thread_number. So issue a warning
to notify the users if such system detected.
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/ABI/testing/sysfs-devices-system-cpu#n542
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
arch/arm64/kernel/topology.c | 66 ++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
@@ -57,6 +70,34 @@ int __init parse_acpi_topology(void)cpu_topology[cpu].thread_id=topology_id;topology_id=find_acpi_cpu_topology(cpu,1);cpu_topology[cpu].core_id=topology_id;++/*+*InthePPTT,CPUsbelowanodewiththe'identical+*implementation'flaghavethesamenumberofthreads.+*CountthenumberofthreadsforonlyoneCPU(i.e.+*onecore_id)amongthosewiththesamehetero_id.+*Seethecommentoffind_acpi_cpu_topology_hetero_id()+*formoredetails.+*+*Oneentryiscreatedforeachnodehaving:+*-the'identicalimplementation'flag+*-itsparentnothavingtheflag+*/+hetero_id=find_acpi_cpu_topology_hetero_id(cpu);+entry=xa_load(&hetero_cpu,hetero_id);+if(!entry){+entry=kzalloc(sizeof(*entry),GFP_KERNEL);+WARN_ON_ONCE(!entry);++if(entry){+entry->core_id=topology_id;+entry->thread_num=1;+xa_store(&hetero_cpu,hetero_id,+entry,GFP_KERNEL);+}+}elseif(entry->core_id==topology_id){+entry->thread_num++;+}}else{cpu_topology[cpu].thread_id=-1;cpu_topology[cpu].core_id=topology_id;
@@ -67,6 +108,31 @@ int __init parse_acpi_topology(void)cpu_topology[cpu].package_id=topology_id;}+/*+*Thisshouldbeashortloopdependingonthenumberofheterogeneous+*CPUclusters.Typicallyonahomogeneoussystemthere'sonlyone+*entryintheXArray.+*/+xa_for_each(&hetero_cpu,hetero_id,entry){+if(entry->thread_num!=max_smt_thread_num&&max_smt_thread_num)+pr_warn_once("Heterogeneous SMT topology is partly supported by SMT control\n");++max_smt_thread_num=max(max_smt_thread_num,entry->thread_num);+xa_erase(&hetero_cpu,hetero_id);+kfree(entry);+}++/*+*NotifytheCPUframeworkoftheSMTsupport.Initializethe+*max_smt_thread_numto1ifnoSMTsupportdetected.Athread+*numberof1canbehandledbytheframeworksowedon'tneed+*tocheckmax_smt_thread_numtoseewesupportSMTornot.+*/+if(!max_smt_thread_num)+max_smt_thread_num=1;++cpu_smt_set_num_threads(max_smt_thread_num,max_smt_thread_num);+xa_destroy(&hetero_cpu);return0;}#endif
Looks good to me,
Reviewed-by: Hanjun Guo <guohanjun@huawei.com>
Thanks
Hanjun
From: Yicong Yang <hidden> Date: 2025-03-03 14:42:38
On 2025/2/25 14:08, Hanjun Guo wrote:
On 2025/2/18 22:10, Yicong Yang wrote:
quoted
From: Yicong Yang <yangyicong@hisilicon.com>
For ACPI we'll build the topology from PPTT and we cannot directly
get the SMT number of each core. Instead using a temporary xarray
to record the heterogeneous information (from ACPI_PPTT_ACPI_IDENTICAL)
and SMT information of the first core in its heterogeneous CPU cluster
when building the topology. Then we can know the largest SMT number
in the system. If a homogeneous system's using ACPI 6.2 or later,
all the CPUs should be under the root node of PPTT. There'll be
only one entry in the xarray and all the CPUs in the system will
be assumed identical.
The core's SMT control provides two interface to the users [1]:
1) enable/disable SMT by writing on/off
2) enable/disable SMT by writing thread number 1/max_thread_number
If a system have more than one SMT thread number the 2) may
not handle it well, since there're multiple thread numbers in the
system and 2) only accept 1/max_thread_number. So issue a warning
to notify the users if such system detected.
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/ABI/testing/sysfs-devices-system-cpu#n542
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
arch/arm64/kernel/topology.c | 66 ++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
return !!is_threaded;
}
+struct cpu_smt_info {
+ unsigned int thread_num;
+ int core_id;
+};
+
/*
* Propagate the topology information of the processor_topology_node tree to the
* cpu_topology array.
*/
int __init parse_acpi_topology(void)
{
+ unsigned int max_smt_thread_num = 0;
+ struct cpu_smt_info *entry;
+ struct xarray hetero_cpu;
+ unsigned long hetero_id;
int cpu, topology_id;
if (acpi_disabled)
return 0;
+ xa_init(&hetero_cpu);
+
for_each_possible_cpu(cpu) {
topology_id = find_acpi_cpu_topology(cpu, 0);
if (topology_id < 0)
@@ -57,6 +70,34 @@ int __init parse_acpi_topology(void)
cpu_topology[cpu].thread_id = topology_id;
topology_id = find_acpi_cpu_topology(cpu, 1);
cpu_topology[cpu].core_id = topology_id;
+
+ /*
+ * In the PPTT, CPUs below a node with the 'identical
+ * implementation' flag have the same number of threads.
+ * Count the number of threads for only one CPU (i.e.
+ * one core_id) among those with the same hetero_id.
+ * See the comment of find_acpi_cpu_topology_hetero_id()
+ * for more details.
+ *
+ * One entry is created for each node having:
+ * - the 'identical implementation' flag
+ * - its parent not having the flag
+ */
+ hetero_id = find_acpi_cpu_topology_hetero_id(cpu);
+ entry = xa_load(&hetero_cpu, hetero_id);
+ if (!entry) {
+ entry = kzalloc(sizeof(*entry), GFP_KERNEL);
+ WARN_ON_ONCE(!entry);
+
+ if (entry) {
+ entry->core_id = topology_id;
+ entry->thread_num = 1;
+ xa_store(&hetero_cpu, hetero_id,
+ entry, GFP_KERNEL);
+ }
+ } else if (entry->core_id == topology_id) {
+ entry->thread_num++;
+ }
} else {
cpu_topology[cpu].thread_id = -1;
cpu_topology[cpu].core_id = topology_id;
@@ -67,6 +108,31 @@ int __init parse_acpi_topology(void)
cpu_topology[cpu].package_id = topology_id;
}
+ /*
+ * This should be a short loop depending on the number of heterogeneous
+ * CPU clusters. Typically on a homogeneous system there's only one
+ * entry in the XArray.
+ */
+ xa_for_each(&hetero_cpu, hetero_id, entry) {
+ if (entry->thread_num != max_smt_thread_num && max_smt_thread_num)
+ pr_warn_once("Heterogeneous SMT topology is partly supported by SMT control\n");
+
+ max_smt_thread_num = max(max_smt_thread_num, entry->thread_num);
+ xa_erase(&hetero_cpu, hetero_id);
+ kfree(entry);
+ }
+
+ /*
+ * Notify the CPU framework of the SMT support. Initialize the
+ * max_smt_thread_num to 1 if no SMT support detected. A thread
+ * number of 1 can be handled by the framework so we don't need
+ * to check max_smt_thread_num to see we support SMT or not.
+ */
+ if (!max_smt_thread_num)
+ max_smt_thread_num = 1;
+
+ cpu_smt_set_num_threads(max_smt_thread_num, max_smt_thread_num);
+ xa_destroy(&hetero_cpu);
return 0;
}
#endif
Looks good to me,
Reviewed-by: Hanjun Guo <guohanjun@huawei.com>
@@ -67,6 +108,31 @@ int __init parse_acpi_topology(void) cpu_topology[cpu].package_id = topology_id; }+ /*+ * This should be a short loop depending on the number of heterogeneous
^^^^^^
This _is_ a short loop since the number of xArray elements is the number
of heterogeneous CPU clusters.
+ * CPU clusters. Typically on a homogeneous system there's only one
On Tue, Feb 18, 2025 at 10:10:17PM +0800, Yicong Yang wrote:
quoted hunk
From: Yicong Yang <yangyicong@hisilicon.com>
For ACPI we'll build the topology from PPTT and we cannot directly
get the SMT number of each core. Instead using a temporary xarray
to record the heterogeneous information (from ACPI_PPTT_ACPI_IDENTICAL)
and SMT information of the first core in its heterogeneous CPU cluster
when building the topology. Then we can know the largest SMT number
in the system. If a homogeneous system's using ACPI 6.2 or later,
all the CPUs should be under the root node of PPTT. There'll be
only one entry in the xarray and all the CPUs in the system will
be assumed identical.
The core's SMT control provides two interface to the users [1]:
1) enable/disable SMT by writing on/off
2) enable/disable SMT by writing thread number 1/max_thread_number
If a system have more than one SMT thread number the 2) may
not handle it well, since there're multiple thread numbers in the
system and 2) only accept 1/max_thread_number. So issue a warning
to notify the users if such system detected.
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/ABI/testing/sysfs-devices-system-cpu#n542
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
arch/arm64/kernel/topology.c | 66 ++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
@@ -57,6 +70,34 @@ int __init parse_acpi_topology(void)cpu_topology[cpu].thread_id=topology_id;topology_id=find_acpi_cpu_topology(cpu,1);cpu_topology[cpu].core_id=topology_id;++/*+*InthePPTT,CPUsbelowanodewiththe'identical+*implementation'flaghavethesamenumberofthreads.+*CountthenumberofthreadsforonlyoneCPU(i.e.+*onecore_id)amongthosewiththesamehetero_id.+*Seethecommentoffind_acpi_cpu_topology_hetero_id()+*formoredetails.+*+*Oneentryiscreatedforeachnodehaving:+*-the'identicalimplementation'flag+*-itsparentnothavingtheflag+*/+hetero_id=find_acpi_cpu_topology_hetero_id(cpu);+entry=xa_load(&hetero_cpu,hetero_id);+if(!entry){+entry=kzalloc(sizeof(*entry),GFP_KERNEL);+WARN_ON_ONCE(!entry);++if(entry){+entry->core_id=topology_id;+entry->thread_num=1;+xa_store(&hetero_cpu,hetero_id,+entry,GFP_KERNEL);+}+}elseif(entry->core_id==topology_id){+entry->thread_num++;+}}else{cpu_topology[cpu].thread_id=-1;cpu_topology[cpu].core_id=topology_id;
@@ -67,6 +108,31 @@ int __init parse_acpi_topology(void)cpu_topology[cpu].package_id=topology_id;}+/*+*Thisshouldbeashortloopdependingonthenumberofheterogeneous+*CPUclusters.Typicallyonahomogeneoussystemthere'sonlyone+*entryintheXArray.+*/+xa_for_each(&hetero_cpu,hetero_id,entry){+if(entry->thread_num!=max_smt_thread_num&&max_smt_thread_num)+pr_warn_once("Heterogeneous SMT topology is partly supported by SMT control\n");
Ditto as previous patch about handling no threaded cores with threaded cores
in the system. I am not sure if that is required but just raising it here.
+
+ max_smt_thread_num = max(max_smt_thread_num, entry->thread_num);
+ xa_erase(&hetero_cpu, hetero_id);
+ kfree(entry);
+ }
+
+ /*
+ * Notify the CPU framework of the SMT support. Initialize the
+ * max_smt_thread_num to 1 if no SMT support detected. A thread
+ * number of 1 can be handled by the framework so we don't need
+ * to check max_smt_thread_num to see we support SMT or not.
+ */
+ if (!max_smt_thread_num)
+ max_smt_thread_num = 1;
+
Ditto as previous patch, can get rid if it is default 1.
--
Regards,
Sudeep
From: Pierre Gondois <pierre.gondois@arm.com> Date: 2025-02-28 17:51:29
On 2/28/25 14:56, Sudeep Holla wrote:
On Tue, Feb 18, 2025 at 10:10:17PM +0800, Yicong Yang wrote:
quoted
From: Yicong Yang <yangyicong@hisilicon.com>
For ACPI we'll build the topology from PPTT and we cannot directly
get the SMT number of each core. Instead using a temporary xarray
to record the heterogeneous information (from ACPI_PPTT_ACPI_IDENTICAL)
and SMT information of the first core in its heterogeneous CPU cluster
when building the topology. Then we can know the largest SMT number
in the system. If a homogeneous system's using ACPI 6.2 or later,
all the CPUs should be under the root node of PPTT. There'll be
only one entry in the xarray and all the CPUs in the system will
be assumed identical.
The core's SMT control provides two interface to the users [1]:
1) enable/disable SMT by writing on/off
2) enable/disable SMT by writing thread number 1/max_thread_number
If a system have more than one SMT thread number the 2) may
not handle it well, since there're multiple thread numbers in the
system and 2) only accept 1/max_thread_number. So issue a warning
to notify the users if such system detected.
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/ABI/testing/sysfs-devices-system-cpu#n542
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
arch/arm64/kernel/topology.c | 66 ++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
@@ -57,6 +70,34 @@ int __init parse_acpi_topology(void)cpu_topology[cpu].thread_id=topology_id;topology_id=find_acpi_cpu_topology(cpu,1);cpu_topology[cpu].core_id=topology_id;++/*+*InthePPTT,CPUsbelowanodewiththe'identical+*implementation'flaghavethesamenumberofthreads.+*CountthenumberofthreadsforonlyoneCPU(i.e.+*onecore_id)amongthosewiththesamehetero_id.+*Seethecommentoffind_acpi_cpu_topology_hetero_id()+*formoredetails.+*+*Oneentryiscreatedforeachnodehaving:+*-the'identicalimplementation'flag+*-itsparentnothavingtheflag+*/+hetero_id=find_acpi_cpu_topology_hetero_id(cpu);+entry=xa_load(&hetero_cpu,hetero_id);+if(!entry){+entry=kzalloc(sizeof(*entry),GFP_KERNEL);+WARN_ON_ONCE(!entry);++if(entry){+entry->core_id=topology_id;+entry->thread_num=1;+xa_store(&hetero_cpu,hetero_id,+entry,GFP_KERNEL);+}+}elseif(entry->core_id==topology_id){+entry->thread_num++;+}}else{cpu_topology[cpu].thread_id=-1;cpu_topology[cpu].core_id=topology_id;
@@ -67,6 +108,31 @@ int __init parse_acpi_topology(void)cpu_topology[cpu].package_id=topology_id;}+/*+*Thisshouldbeashortloopdependingonthenumberofheterogeneous+*CPUclusters.Typicallyonahomogeneoussystemthere'sonlyone+*entryintheXArray.+*/+xa_for_each(&hetero_cpu,hetero_id,entry){+if(entry->thread_num!=max_smt_thread_num&&max_smt_thread_num)+pr_warn_once("Heterogeneous SMT topology is partly supported by SMT control\n");
Ditto as previous patch about handling no threaded cores with threaded cores
in the system. I am not sure if that is required but just raising it here.
quoted
+
+ max_smt_thread_num = max(max_smt_thread_num, entry->thread_num);
+ xa_erase(&hetero_cpu, hetero_id);
+ kfree(entry);
+ }
+
+ /*
+ * Notify the CPU framework of the SMT support. Initialize the
+ * max_smt_thread_num to 1 if no SMT support detected. A thread
+ * number of 1 can be handled by the framework so we don't need
+ * to check max_smt_thread_num to see we support SMT or not.
+ */
+ if (!max_smt_thread_num)
+ max_smt_thread_num = 1;
+
Ditto as previous patch, can get rid if it is default 1.
On non-SMT platforms, not calling cpu_smt_set_num_threads() leaves
cpu_smt_num_threads uninitialized to UINT_MAX:
smt/active:0
smt/control:-1
If cpu_smt_set_num_threads() is called:
active:0
control:notsupported
So it might be slightly better to still initialize max_smt_thread_num.
Otherwise I tested the patches on arm64 ACPI smt platforms and it worked
well, so for all the patches (if there are no other major modifications):
Reviewed-by: Pierre Gondois <pierre.gondois@arm.com>
Regards,
Pierre
On Fri, Feb 28, 2025 at 06:51:16PM +0100, Pierre Gondois wrote:
On 2/28/25 14:56, Sudeep Holla wrote:
quoted
On Tue, Feb 18, 2025 at 10:10:17PM +0800, Yicong Yang wrote:
quoted
From: Yicong Yang <yangyicong@hisilicon.com>
For ACPI we'll build the topology from PPTT and we cannot directly
get the SMT number of each core. Instead using a temporary xarray
to record the heterogeneous information (from ACPI_PPTT_ACPI_IDENTICAL)
and SMT information of the first core in its heterogeneous CPU cluster
when building the topology. Then we can know the largest SMT number
in the system. If a homogeneous system's using ACPI 6.2 or later,
all the CPUs should be under the root node of PPTT. There'll be
only one entry in the xarray and all the CPUs in the system will
be assumed identical.
The core's SMT control provides two interface to the users [1]:
1) enable/disable SMT by writing on/off
2) enable/disable SMT by writing thread number 1/max_thread_number
If a system have more than one SMT thread number the 2) may
not handle it well, since there're multiple thread numbers in the
system and 2) only accept 1/max_thread_number. So issue a warning
to notify the users if such system detected.
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/ABI/testing/sysfs-devices-system-cpu#n542
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
arch/arm64/kernel/topology.c | 66 ++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
@@ -57,6 +70,34 @@ int __init parse_acpi_topology(void)cpu_topology[cpu].thread_id=topology_id;topology_id=find_acpi_cpu_topology(cpu,1);cpu_topology[cpu].core_id=topology_id;++/*+*InthePPTT,CPUsbelowanodewiththe'identical+*implementation'flaghavethesamenumberofthreads.+*CountthenumberofthreadsforonlyoneCPU(i.e.+*onecore_id)amongthosewiththesamehetero_id.+*Seethecommentoffind_acpi_cpu_topology_hetero_id()+*formoredetails.+*+*Oneentryiscreatedforeachnodehaving:+*-the'identicalimplementation'flag+*-itsparentnothavingtheflag+*/+hetero_id=find_acpi_cpu_topology_hetero_id(cpu);+entry=xa_load(&hetero_cpu,hetero_id);+if(!entry){+entry=kzalloc(sizeof(*entry),GFP_KERNEL);+WARN_ON_ONCE(!entry);++if(entry){+entry->core_id=topology_id;+entry->thread_num=1;+xa_store(&hetero_cpu,hetero_id,+entry,GFP_KERNEL);+}+}elseif(entry->core_id==topology_id){+entry->thread_num++;+}}else{cpu_topology[cpu].thread_id=-1;cpu_topology[cpu].core_id=topology_id;
@@ -67,6 +108,31 @@ int __init parse_acpi_topology(void)cpu_topology[cpu].package_id=topology_id;}+/*+*Thisshouldbeashortloopdependingonthenumberofheterogeneous+*CPUclusters.Typicallyonahomogeneoussystemthere'sonlyone+*entryintheXArray.+*/+xa_for_each(&hetero_cpu,hetero_id,entry){+if(entry->thread_num!=max_smt_thread_num&&max_smt_thread_num)+pr_warn_once("Heterogeneous SMT topology is partly supported by SMT control\n");
Ditto as previous patch about handling no threaded cores with threaded cores
in the system. I am not sure if that is required but just raising it here.
quoted
+
+ max_smt_thread_num = max(max_smt_thread_num, entry->thread_num);
+ xa_erase(&hetero_cpu, hetero_id);
+ kfree(entry);
+ }
+
+ /*
+ * Notify the CPU framework of the SMT support. Initialize the
+ * max_smt_thread_num to 1 if no SMT support detected. A thread
+ * number of 1 can be handled by the framework so we don't need
+ * to check max_smt_thread_num to see we support SMT or not.
+ */
+ if (!max_smt_thread_num)
+ max_smt_thread_num = 1;
+
Ditto as previous patch, can get rid if it is default 1.
On non-SMT platforms, not calling cpu_smt_set_num_threads() leaves
cpu_smt_num_threads uninitialized to UINT_MAX:
smt/active:0
smt/control:-1
If cpu_smt_set_num_threads() is called:
active:0
control:notsupported
So it might be slightly better to still initialize max_smt_thread_num.
Sure, what I meant is to have max_smt_thread_num set to 1 by default is
that is what needed anyways and the above code does that now.
Why not start with initialised to 1 instead ?
Of course some current logic needs to change around testing it for zero.
--
Regards,
Sudeep
From: Pierre Gondois <pierre.gondois@arm.com> Date: 2025-03-03 09:56:21
On 2/28/25 20:06, Sudeep Holla wrote:
On Fri, Feb 28, 2025 at 06:51:16PM +0100, Pierre Gondois wrote:
quoted
On 2/28/25 14:56, Sudeep Holla wrote:
quoted
On Tue, Feb 18, 2025 at 10:10:17PM +0800, Yicong Yang wrote:
quoted
From: Yicong Yang <yangyicong@hisilicon.com>
For ACPI we'll build the topology from PPTT and we cannot directly
get the SMT number of each core. Instead using a temporary xarray
to record the heterogeneous information (from ACPI_PPTT_ACPI_IDENTICAL)
and SMT information of the first core in its heterogeneous CPU cluster
when building the topology. Then we can know the largest SMT number
in the system. If a homogeneous system's using ACPI 6.2 or later,
all the CPUs should be under the root node of PPTT. There'll be
only one entry in the xarray and all the CPUs in the system will
be assumed identical.
The core's SMT control provides two interface to the users [1]:
1) enable/disable SMT by writing on/off
2) enable/disable SMT by writing thread number 1/max_thread_number
If a system have more than one SMT thread number the 2) may
not handle it well, since there're multiple thread numbers in the
system and 2) only accept 1/max_thread_number. So issue a warning
to notify the users if such system detected.
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/ABI/testing/sysfs-devices-system-cpu#n542
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
arch/arm64/kernel/topology.c | 66 ++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
@@ -57,6 +70,34 @@ int __init parse_acpi_topology(void)cpu_topology[cpu].thread_id=topology_id;topology_id=find_acpi_cpu_topology(cpu,1);cpu_topology[cpu].core_id=topology_id;++/*+*InthePPTT,CPUsbelowanodewiththe'identical+*implementation'flaghavethesamenumberofthreads.+*CountthenumberofthreadsforonlyoneCPU(i.e.+*onecore_id)amongthosewiththesamehetero_id.+*Seethecommentoffind_acpi_cpu_topology_hetero_id()+*formoredetails.+*+*Oneentryiscreatedforeachnodehaving:+*-the'identicalimplementation'flag+*-itsparentnothavingtheflag+*/+hetero_id=find_acpi_cpu_topology_hetero_id(cpu);+entry=xa_load(&hetero_cpu,hetero_id);+if(!entry){+entry=kzalloc(sizeof(*entry),GFP_KERNEL);+WARN_ON_ONCE(!entry);++if(entry){+entry->core_id=topology_id;+entry->thread_num=1;+xa_store(&hetero_cpu,hetero_id,+entry,GFP_KERNEL);+}+}elseif(entry->core_id==topology_id){+entry->thread_num++;+}}else{cpu_topology[cpu].thread_id=-1;cpu_topology[cpu].core_id=topology_id;
@@ -67,6 +108,31 @@ int __init parse_acpi_topology(void)cpu_topology[cpu].package_id=topology_id;}+/*+*Thisshouldbeashortloopdependingonthenumberofheterogeneous+*CPUclusters.Typicallyonahomogeneoussystemthere'sonlyone+*entryintheXArray.+*/+xa_for_each(&hetero_cpu,hetero_id,entry){+if(entry->thread_num!=max_smt_thread_num&&max_smt_thread_num)+pr_warn_once("Heterogeneous SMT topology is partly supported by SMT control\n");
Ditto as previous patch about handling no threaded cores with threaded cores
in the system. I am not sure if that is required but just raising it here.
quoted
+
+ max_smt_thread_num = max(max_smt_thread_num, entry->thread_num);
+ xa_erase(&hetero_cpu, hetero_id);
+ kfree(entry);
+ }
+
+ /*
+ * Notify the CPU framework of the SMT support. Initialize the
+ * max_smt_thread_num to 1 if no SMT support detected. A thread
+ * number of 1 can be handled by the framework so we don't need
+ * to check max_smt_thread_num to see we support SMT or not.
+ */
+ if (!max_smt_thread_num)
+ max_smt_thread_num = 1;
+
Ditto as previous patch, can get rid if it is default 1.
On non-SMT platforms, not calling cpu_smt_set_num_threads() leaves
cpu_smt_num_threads uninitialized to UINT_MAX:
smt/active:0
smt/control:-1
If cpu_smt_set_num_threads() is called:
active:0
control:notsupported
So it might be slightly better to still initialize max_smt_thread_num.
Sure, what I meant is to have max_smt_thread_num set to 1 by default is
that is what needed anyways and the above code does that now.
Why not start with initialised to 1 instead ?
Of course some current logic needs to change around testing it for zero.
I think there would still be a way to check against the default value.
If we have:
unsigned int max_smt_thread_num = 1;
then on a platform with 2 threads, the detection condition would trigger:
xa_for_each(&hetero_cpu, hetero_id, entry) {
if (entry->thread_num != max_smt_thread_num && max_smt_thread_num) <---- (entry->thread_num=2) and (max_smt_thread_num=1)
pr_warn_once("Heterogeneous SMT topology is partly
supported by SMT control\n");
so we would need an additional variable:
bool is_initialized = false;
On Mon, Mar 03, 2025 at 10:56:12AM +0100, Pierre Gondois wrote:
On 2/28/25 20:06, Sudeep Holla wrote:
quoted
quoted
quoted
Ditto as previous patch, can get rid if it is default 1.
On non-SMT platforms, not calling cpu_smt_set_num_threads() leaves
cpu_smt_num_threads uninitialized to UINT_MAX:
smt/active:0
smt/control:-1
If cpu_smt_set_num_threads() is called:
active:0
control:notsupported
So it might be slightly better to still initialize max_smt_thread_num.
Sure, what I meant is to have max_smt_thread_num set to 1 by default is
that is what needed anyways and the above code does that now.
Why not start with initialised to 1 instead ?
Of course some current logic needs to change around testing it for zero.
I think there would still be a way to check against the default value.
If we have:
unsigned int max_smt_thread_num = 1;
then on a platform with 2 threads, the detection condition would trigger:
xa_for_each(&hetero_cpu, hetero_id, entry) {
if (entry->thread_num != max_smt_thread_num && max_smt_thread_num) <---- (entry->thread_num=2) and (max_smt_thread_num=1)
pr_warn_once("Heterogeneous SMT topology is partly
supported by SMT control\n");
so we would need an additional variable:
bool is_initialized = false;
Sure, we could do that or skip the check if max_smt_thread_num == 1 ?
I mean
if (entry->thread_num != max_smt_thread_num && max_smt_thread_num != 1)
I assume entry->thread_num must be set to 1 on single threaded cores
Won't that work ? Am I missing something still ?
--
Regards,
Sudeep
From: Yicong Yang <hidden> Date: 2025-03-03 14:40:53
On 2025/3/3 19:16, Sudeep Holla wrote:
On Mon, Mar 03, 2025 at 10:56:12AM +0100, Pierre Gondois wrote:
quoted
On 2/28/25 20:06, Sudeep Holla wrote:
quoted
quoted
quoted
Ditto as previous patch, can get rid if it is default 1.
On non-SMT platforms, not calling cpu_smt_set_num_threads() leaves
cpu_smt_num_threads uninitialized to UINT_MAX:
smt/active:0
smt/control:-1
If cpu_smt_set_num_threads() is called:
active:0
control:notsupported
So it might be slightly better to still initialize max_smt_thread_num.
Sure, what I meant is to have max_smt_thread_num set to 1 by default is
that is what needed anyways and the above code does that now.
Why not start with initialised to 1 instead ?
Of course some current logic needs to change around testing it for zero.
I think there would still be a way to check against the default value.
If we have:
unsigned int max_smt_thread_num = 1;
then on a platform with 2 threads, the detection condition would trigger:
xa_for_each(&hetero_cpu, hetero_id, entry) {
if (entry->thread_num != max_smt_thread_num && max_smt_thread_num) <---- (entry->thread_num=2) and (max_smt_thread_num=1)
pr_warn_once("Heterogeneous SMT topology is partly
supported by SMT control\n");
so we would need an additional variable:
bool is_initialized = false;
Sure, we could do that or skip the check if max_smt_thread_num == 1 ?
I mean
if (entry->thread_num != max_smt_thread_num && max_smt_thread_num != 1)
this will work for me. will launch some tests.
Thanks.
From: Pierre Gondois <pierre.gondois@arm.com> Date: 2025-03-04 08:25:14
On 3/3/25 15:40, Yicong Yang wrote:
On 2025/3/3 19:16, Sudeep Holla wrote:
quoted
On Mon, Mar 03, 2025 at 10:56:12AM +0100, Pierre Gondois wrote:
quoted
On 2/28/25 20:06, Sudeep Holla wrote:
quoted
quoted
quoted
Ditto as previous patch, can get rid if it is default 1.
On non-SMT platforms, not calling cpu_smt_set_num_threads() leaves
cpu_smt_num_threads uninitialized to UINT_MAX:
smt/active:0
smt/control:-1
If cpu_smt_set_num_threads() is called:
active:0
control:notsupported
So it might be slightly better to still initialize max_smt_thread_num.
Sure, what I meant is to have max_smt_thread_num set to 1 by default is
that is what needed anyways and the above code does that now.
Why not start with initialised to 1 instead ?
Of course some current logic needs to change around testing it for zero.
I think there would still be a way to check against the default value.
If we have:
unsigned int max_smt_thread_num = 1;
then on a platform with 2 threads, the detection condition would trigger:
xa_for_each(&hetero_cpu, hetero_id, entry) {
if (entry->thread_num != max_smt_thread_num && max_smt_thread_num) <---- (entry->thread_num=2) and (max_smt_thread_num=1)
pr_warn_once("Heterogeneous SMT topology is partly
supported by SMT control\n");
so we would need an additional variable:
bool is_initialized = false;
Sure, we could do that or skip the check if max_smt_thread_num == 1 ?
I mean
if (entry->thread_num != max_smt_thread_num && max_smt_thread_num != 1)
I think it will be problematic if we parse:
- first a CPU with 1 thread
- then a CPU with 2 threads
in that case we should detect the 'Heterogeneous SMT topology',
but we cannot because we don't know whether max_smt_thread_num=1
because 1 is the default value or we found a CPU with one thread.
On Tue, Mar 04, 2025 at 09:25:02AM +0100, Pierre Gondois wrote:
On 3/3/25 15:40, Yicong Yang wrote:
quoted
On 2025/3/3 19:16, Sudeep Holla wrote:
quoted
On Mon, Mar 03, 2025 at 10:56:12AM +0100, Pierre Gondois wrote:
quoted
On 2/28/25 20:06, Sudeep Holla wrote:
quoted
quoted
quoted
Ditto as previous patch, can get rid if it is default 1.
On non-SMT platforms, not calling cpu_smt_set_num_threads() leaves
cpu_smt_num_threads uninitialized to UINT_MAX:
smt/active:0
smt/control:-1
If cpu_smt_set_num_threads() is called:
active:0
control:notsupported
So it might be slightly better to still initialize max_smt_thread_num.
Sure, what I meant is to have max_smt_thread_num set to 1 by default is
that is what needed anyways and the above code does that now.
Why not start with initialised to 1 instead ?
Of course some current logic needs to change around testing it for zero.
I think there would still be a way to check against the default value.
If we have:
unsigned int max_smt_thread_num = 1;
then on a platform with 2 threads, the detection condition would trigger:
xa_for_each(&hetero_cpu, hetero_id, entry) {
if (entry->thread_num != max_smt_thread_num && max_smt_thread_num) <---- (entry->thread_num=2) and (max_smt_thread_num=1)
pr_warn_once("Heterogeneous SMT topology is partly
supported by SMT control\n");
so we would need an additional variable:
bool is_initialized = false;
Sure, we could do that or skip the check if max_smt_thread_num == 1 ?
I mean
if (entry->thread_num != max_smt_thread_num && max_smt_thread_num != 1)
I think it will be problematic if we parse:
- first a CPU with 1 thread
- then a CPU with 2 threads
in that case we should detect the 'Heterogeneous SMT topology',
but we cannot because we don't know whether max_smt_thread_num=1
because 1 is the default value or we found a CPU with one thread.
Right, but as per Dietmar's and my previous response, it may be a valid
case. See latest response from Dietmar which is explicitly requesting
support for this. It may need some special handling if we decide to support
that.
--
Regards,
Sudeep
From: Pierre Gondois <pierre.gondois@arm.com> Date: 2025-03-04 15:07:43
On 3/4/25 11:02, Sudeep Holla wrote:
On Tue, Mar 04, 2025 at 09:25:02AM +0100, Pierre Gondois wrote:
quoted
On 3/3/25 15:40, Yicong Yang wrote:
quoted
On 2025/3/3 19:16, Sudeep Holla wrote:
quoted
On Mon, Mar 03, 2025 at 10:56:12AM +0100, Pierre Gondois wrote:
quoted
On 2/28/25 20:06, Sudeep Holla wrote:
quoted
quoted
quoted
Ditto as previous patch, can get rid if it is default 1.
On non-SMT platforms, not calling cpu_smt_set_num_threads() leaves
cpu_smt_num_threads uninitialized to UINT_MAX:
smt/active:0
smt/control:-1
If cpu_smt_set_num_threads() is called:
active:0
control:notsupported
So it might be slightly better to still initialize max_smt_thread_num.
Sure, what I meant is to have max_smt_thread_num set to 1 by default is
that is what needed anyways and the above code does that now.
Why not start with initialised to 1 instead ?
Of course some current logic needs to change around testing it for zero.
I think there would still be a way to check against the default value.
If we have:
unsigned int max_smt_thread_num = 1;
then on a platform with 2 threads, the detection condition would trigger:
xa_for_each(&hetero_cpu, hetero_id, entry) {
if (entry->thread_num != max_smt_thread_num && max_smt_thread_num) <---- (entry->thread_num=2) and (max_smt_thread_num=1)
pr_warn_once("Heterogeneous SMT topology is partly
supported by SMT control\n");
so we would need an additional variable:
bool is_initialized = false;
Sure, we could do that or skip the check if max_smt_thread_num == 1 ?
I mean
if (entry->thread_num != max_smt_thread_num && max_smt_thread_num != 1)
I think it will be problematic if we parse:
- first a CPU with 1 thread
- then a CPU with 2 threads
in that case we should detect the 'Heterogeneous SMT topology',
but we cannot because we don't know whether max_smt_thread_num=1
because 1 is the default value or we found a CPU with one thread.
Right, but as per Dietmar's and my previous response, it may be a valid
case. See latest response from Dietmar which is explicitly requesting
support for this. It may need some special handling if we decide to support
that.
Ah ok, right indeed.
For heterogeneous SMT platforms, the 'smt/control' file is able to accept
on/off/forceoff strings. But providing the max #count of threads as an integer would
be wrong if the CPU doesn't have this #count of threads.
Initially the idea was to just warn that support might be needed for heterogeneous
SMT platforms, and let whoever would have such platform solve this case, but just
disabling the integer interface in this case would solve the issue generically.
From: Yicong Yang <hidden> Date: 2025-03-05 09:01:39
On 2025/3/4 23:07, Pierre Gondois wrote:
On 3/4/25 11:02, Sudeep Holla wrote:
quoted
On Tue, Mar 04, 2025 at 09:25:02AM +0100, Pierre Gondois wrote:
quoted
On 3/3/25 15:40, Yicong Yang wrote:
quoted
On 2025/3/3 19:16, Sudeep Holla wrote:
quoted
On Mon, Mar 03, 2025 at 10:56:12AM +0100, Pierre Gondois wrote:
quoted
On 2/28/25 20:06, Sudeep Holla wrote:
quoted
quoted
quoted
Ditto as previous patch, can get rid if it is default 1.
On non-SMT platforms, not calling cpu_smt_set_num_threads() leaves
cpu_smt_num_threads uninitialized to UINT_MAX:
smt/active:0
smt/control:-1
If cpu_smt_set_num_threads() is called:
active:0
control:notsupported
So it might be slightly better to still initialize max_smt_thread_num.
Sure, what I meant is to have max_smt_thread_num set to 1 by default is
that is what needed anyways and the above code does that now.
Why not start with initialised to 1 instead ?
Of course some current logic needs to change around testing it for zero.
I think there would still be a way to check against the default value.
If we have:
unsigned int max_smt_thread_num = 1;
then on a platform with 2 threads, the detection condition would trigger:
xa_for_each(&hetero_cpu, hetero_id, entry) {
if (entry->thread_num != max_smt_thread_num && max_smt_thread_num) <---- (entry->thread_num=2) and (max_smt_thread_num=1)
pr_warn_once("Heterogeneous SMT topology is partly
supported by SMT control\n");
so we would need an additional variable:
bool is_initialized = false;
Sure, we could do that or skip the check if max_smt_thread_num == 1 ?
I mean
if (entry->thread_num != max_smt_thread_num && max_smt_thread_num != 1)
I think it will be problematic if we parse:
- first a CPU with 1 thread
- then a CPU with 2 threads
in that case we should detect the 'Heterogeneous SMT topology',
but we cannot because we don't know whether max_smt_thread_num=1
because 1 is the default value or we found a CPU with one thread.
Right, but as per Dietmar's and my previous response, it may be a valid
case. See latest response from Dietmar which is explicitly requesting
support for this. It may need some special handling if we decide to support
that.
Ah ok, right indeed.
For heterogeneous SMT platforms, the 'smt/control' file is able to accept
on/off/forceoff strings. But providing the max #count of threads as an integer would
be wrong if the CPU doesn't have this #count of threads.
Initially the idea was to just warn that support might be needed for heterogeneous
SMT platforms, and let whoever would have such platform solve this case, but just
disabling the integer interface in this case would solve the issue generically.
ok so let's regard the asymmetric platform as a valid case as suggested (also mentioned
by Dietmar on another thread) and remove the check here. Will update and test.
Thanks.
From: Yicong Yang <hidden> Date: 2025-02-18 14:10:13
From: Yicong Yang <yangyicong@hisilicon.com>
On building the topology from the devicetree, we've already
gotten the SMT thread number of each core. Update the largest
SMT thread number and enable the SMT control by the end of
topology parsing.
The core's SMT control provides two interface to the users [1]:
1) enable/disable SMT by writing on/off
2) enable/disable SMT by writing thread number 1/max_thread_number
If a system have more than one SMT thread number the 2) may
not handle it well, since there're multiple thread numbers in the
system and 2) only accept 1/max_thread_number. So issue a warning
to notify the users if such system detected.
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/ABI/testing/sysfs-devices-system-cpu#n542
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
drivers/base/arch_topology.c | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
@@ -506,6 +507,10 @@ core_initcall(free_raw_capacity);#endif#if defined(CONFIG_ARM64) || defined(CONFIG_RISCV)++/* Maximum SMT thread number detected used to enable the SMT control */+staticunsignedintmax_smt_thread_num;+/**Thisfunctionreturnsthelogiccpunumberofthenode.*Therearebasicallythreekindsofreturnvalues:
@@ -565,6 +570,16 @@ static int __init parse_core(struct device_node *core, int package_id,i++;}while(1);+/*+*Ifmax_smt_thread_numhasbeeninitializedanddoesn'tmatch+*thethreadnumberofthisentry,thenthesystemhas+*heterogeneousSMTtopology.+*/+if(max_smt_thread_num&&max_smt_thread_num!=i)+pr_warn_once("Heterogeneous SMT topology is partly supported by SMT control\n");++max_smt_thread_num=max_t(unsignedint,max_smt_thread_num,i);+cpu=get_cpu_for_node(core);if(cpu>=0){if(!leaf){
@@ -677,6 +692,18 @@ static int __init parse_socket(struct device_node *socket)if(!has_socket)ret=parse_cluster(socket,0,-1,0);+/*+*NotifytheCPUframeworkoftheSMTsupport.Initializethe+*max_smt_thread_numto1ifnoSMTsupportdetectedorfailed+*toparsethetopology.Athreadnumberof1canbehandledby+*theframeworksowedon'tneedtocheckmax_smt_thread_numto+*seewesupportSMTornot.+*/+if(!max_smt_thread_num||ret)+max_smt_thread_num=1;++cpu_smt_set_num_threads(max_smt_thread_num,max_smt_thread_num);+returnret;}
From: Yicong Yang <yangyicong@hisilicon.com>
On building the topology from the devicetree, we've already
gotten the SMT thread number of each core. Update the largest
SMT thread number and enable the SMT control by the end of
topology parsing.
The core's SMT control provides two interface to the users [1]:
1) enable/disable SMT by writing on/off
2) enable/disable SMT by writing thread number 1/max_thread_number
1/max_thread_number stands for '1 or max_thread_number', right ?
Aren't the two interfaces:
(a) /sys/devices/system/cpu/smt/active
(b) /sys/devices/system/cpu/smt/control
and you write 1) or 2) (or 'forceoff') into (b)?
If a system have more than one SMT thread number the 2) may
s/have/has
not handle it well, since there're multiple thread numbers in the
multiple thread numbers other than 1, right?
system and 2) only accept 1/max_thread_number. So issue a warning
to notify the users if such system detected.
This paragraph seems to be about heterogeneous systems. Maybe mention this?
Heterogeneous system with SMT only on a subset of cores (like Intel
Hybrid): This one works (N threads per core with N=1 and N=2) just fine.
But on Arm64 (default) we would still see:
[0.075782] Heterogeneous SMT topology is partly supported by SMT control
@@ -506,6 +507,10 @@ core_initcall(free_raw_capacity);#endif#if defined(CONFIG_ARM64) || defined(CONFIG_RISCV)++/* Maximum SMT thread number detected used to enable the SMT control */
maybe shorter ?
/* used to enable SMT control */
quoted hunk
+static unsigned int max_smt_thread_num;
+
/*
* This function returns the logic cpu number of the node.
* There are basically three kinds of return values:
@@ -565,6 +570,16 @@ static int __init parse_core(struct device_node *core, int package_id, i++; } while (1);+ /*+ * If max_smt_thread_num has been initialized and doesn't match+ * the thread number of this entry, then the system has+ * heterogeneous SMT topology.+ */+ if (max_smt_thread_num && max_smt_thread_num != i)+ pr_warn_once("Heterogeneous SMT topology is partly supported by SMT control\n");++ max_smt_thread_num = max_t(unsigned int, max_smt_thread_num, i);+ cpu = get_cpu_for_node(core); if (cpu >= 0) { if (!leaf) {
@@ -677,6 +692,18 @@ static int __init parse_socket(struct device_node *socket) if (!has_socket) ret = parse_cluster(socket, 0, -1, 0);+ /*+ * Notify the CPU framework of the SMT support. Initialize the+ * max_smt_thread_num to 1 if no SMT support detected or failed+ * to parse the topology. A thread number of 1 can be handled by+ * the framework so we don't need to check max_smt_thread_num to+ * see we support SMT or not.
Not sure whether the last sentence is needed here?
[...]
From: Yicong Yang <hidden> Date: 2025-03-03 14:03:09
On 2025/2/28 19:11, Dietmar Eggemann wrote:
On 18/02/2025 15:10, Yicong Yang wrote:
quoted
From: Yicong Yang <yangyicong@hisilicon.com>
On building the topology from the devicetree, we've already
gotten the SMT thread number of each core. Update the largest
SMT thread number and enable the SMT control by the end of
topology parsing.
The core's SMT control provides two interface to the users [1]:
1) enable/disable SMT by writing on/off
2) enable/disable SMT by writing thread number 1/max_thread_number
1/max_thread_number stands for '1 or max_thread_number', right ?
Aren't the two interfaces:
(a) /sys/devices/system/cpu/smt/active
(b) /sys/devices/system/cpu/smt/control
and you write 1) or 2) (or 'forceoff') into (b)?
yes you're correct. "active" is a RO file for status only so not for this interface.
Let me explicitly mention the /sys/devices/system/cpu/smt/control here in the commit.
quoted
If a system have more than one SMT thread number the 2) may
s/have/has
quoted
not handle it well, since there're multiple thread numbers in the
multiple thread numbers other than 1, right?
according to the pr_warn_once() we implemented below it also includes the case
where the system have one type of SMT cores and non-SMT cores (the thread number is 1):
- 1 thread
- X (!= 1) threads
Discussion made in [1] and I thought we have agreement (hope I understood correctly)
that all the asymmetric cases need to notify. Do you and Sudeep think we should not
warn in such case?
[1] https://lore.kernel.org/linux-arm-kernel/10082e64-b00a-a30b-b9c5-1401a54f6717@huawei.com/
quoted
system and 2) only accept 1/max_thread_number. So issue a warning
to notify the users if such system detected.
This paragraph seems to be about heterogeneous systems. Maybe mention this?
Heterogeneous system with SMT only on a subset of cores (like Intel
Hybrid): This one works (N threads per core with N=1 and N=2) just fine.
But on Arm64 (default) we would still see:
[0.075782] Heterogeneous SMT topology is partly supported by SMT control
@@ -506,6 +507,10 @@ core_initcall(free_raw_capacity);#endif#if defined(CONFIG_ARM64) || defined(CONFIG_RISCV)++/* Maximum SMT thread number detected used to enable the SMT control */
maybe shorter ?
/* used to enable SMT control */
sure.
quoted
+static unsigned int max_smt_thread_num;
+
/*
* This function returns the logic cpu number of the node.
* There are basically three kinds of return values:
@@ -565,6 +570,16 @@ static int __init parse_core(struct device_node *core, int package_id, i++; } while (1);+ /*+ * If max_smt_thread_num has been initialized and doesn't match+ * the thread number of this entry, then the system has+ * heterogeneous SMT topology.+ */+ if (max_smt_thread_num && max_smt_thread_num != i)+ pr_warn_once("Heterogeneous SMT topology is partly supported by SMT control\n");++ max_smt_thread_num = max_t(unsigned int, max_smt_thread_num, i);+ cpu = get_cpu_for_node(core); if (cpu >= 0) { if (!leaf) {
@@ -677,6 +692,18 @@ static int __init parse_socket(struct device_node *socket) if (!has_socket) ret = parse_cluster(socket, 0, -1, 0);+ /*+ * Notify the CPU framework of the SMT support. Initialize the+ * max_smt_thread_num to 1 if no SMT support detected or failed+ * to parse the topology. A thread number of 1 can be handled by+ * the framework so we don't need to check max_smt_thread_num to+ * see we support SMT or not.
Not sure whether the last sentence is needed here?
We always need to call cpu_smt_set_num_threads() to notify the framework
of the thread number even if SMT is not supported. In which case the
thread number is 1 but the framework can handle this well. I worry readers
may get confused for notifying a thread number of 1 so add this comment this.
Will get rid of this if thought redundant.
Thanks.
If a system have more than one SMT thread number the 2) may
s/have/has
quoted
not handle it well, since there're multiple thread numbers in the
multiple thread numbers other than 1, right?
according to the pr_warn_once() we implemented below it also includes the case
where the system have one type of SMT cores and non-SMT cores (the thread number is 1):
- 1 thread
- X (!= 1) threads
Discussion made in [1] and I thought we have agreement (hope I understood correctly)
that all the asymmetric cases need to notify. Do you and Sudeep think we should not
warn in such case?
Systems with non-SMT and SMT-2 cores are IMHO a special case since for
them the '/sys/devices/system/cpu/smt' interface still works correctly.
And on X86 those systems do exist today.
IMHO, it would be awkward to see the message 'Heterogeneous SMT topology
is partly supported by SMT control' on arm64 but not on x86 on such a
system.
I do understand that this message is more tailored to theoretically
possible 'multiple SMT-X (X>1) core' systems (e.g. 1,2,4).
And here we cannot issue a '2 > ./control' since
cpu_smt_num_threads_valid() only returns true for 1 or 4.
IMHO, I would remove the warning and state clearly in the patch that for
systems with multiple SMT-X (X>1) cores, this interface only support SMT
completely on or off.
Example Arm64 DT:
cpu-map {
cluster0 {
core0 {
thread0 {
cpu = <&A53_0>;
};
};
core1 {
thread0 {
cpu = <&A53_1>;
};
};
core2 {
thread0 {
cpu = <&A53_2>;
};
thread1 {
cpu = <&A53_3>;
};
};
core3 {
thread0 {
cpu = <&A53_4>;
};
thread1 {
cpu = <&A53_5>;
};
thread2 {
cpu = <&A53_6>;
};
thread3 {
cpu = <&A53_7>;
};
};
};
};
# cat /proc/cpuinfo | grep ^processor
processor : 0
processor : 1
processor : 2
processor : 3
processor : 4
processor : 5
processor : 6
processor : 7
/sys/devices/system/cpu/smt# echo 1 >control
# cat /proc/cpuinfo | grep ^processor
processor : 0
processor : 1
processor : 2
processor : 4
/sys/devices/system/cpu/smt# echo 2 >control
-bash: echo: write error: Invalid argument
[...]
On Tue, Feb 18, 2025 at 10:10:16PM +0800, Yicong Yang wrote:
quoted hunk
From: Yicong Yang <yangyicong@hisilicon.com>
On building the topology from the devicetree, we've already
gotten the SMT thread number of each core. Update the largest
SMT thread number and enable the SMT control by the end of
topology parsing.
The core's SMT control provides two interface to the users [1]:
1) enable/disable SMT by writing on/off
2) enable/disable SMT by writing thread number 1/max_thread_number
If a system have more than one SMT thread number the 2) may
not handle it well, since there're multiple thread numbers in the
system and 2) only accept 1/max_thread_number. So issue a warning
to notify the users if such system detected.
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/ABI/testing/sysfs-devices-system-cpu#n542
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
drivers/base/arch_topology.c | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
@@ -506,6 +507,10 @@ core_initcall(free_raw_capacity);#endif#if defined(CONFIG_ARM64) || defined(CONFIG_RISCV)++/* Maximum SMT thread number detected used to enable the SMT control */+staticunsignedintmax_smt_thread_num;+/**Thisfunctionreturnsthelogiccpunumberofthenode.*Therearebasicallythreekindsofreturnvalues:
@@ -565,6 +570,16 @@ static int __init parse_core(struct device_node *core, int package_id,i++;}while(1);+/*+*Ifmax_smt_thread_numhasbeeninitializedanddoesn'tmatch+*thethreadnumberofthisentry,thenthesystemhas+*heterogeneousSMTtopology.+*/+if(max_smt_thread_num&&max_smt_thread_num!=i)+pr_warn_once("Heterogeneous SMT topology is partly supported by SMT control\n");+
May be we need to make it more conditional as we may have to support
systems with few cores that are single threaded ? I think Dietmar's
comment is about that.
quoted hunk
+ max_smt_thread_num = max_t(unsigned int, max_smt_thread_num, i);
+
cpu = get_cpu_for_node(core);
if (cpu >= 0) {
if (!leaf) {
@@ -677,6 +692,18 @@ static int __init parse_socket(struct device_node *socket) if (!has_socket) ret = parse_cluster(socket, 0, -1, 0);+ /*+ * Notify the CPU framework of the SMT support. Initialize the+ * max_smt_thread_num to 1 if no SMT support detected or failed+ * to parse the topology. A thread number of 1 can be handled by+ * the framework so we don't need to check max_smt_thread_num to+ * see we support SMT or not.+ */+ if (!max_smt_thread_num || ret)+ max_smt_thread_num = 1;+
For the failed parsing of topology, reset_cpu_topology() gets called.
I suggest resetting max_smt_thread_num to 1 belongs there.
And if you start with max_smt_thread_num, we don't need to update it to
1 explicitly here. So I would like to get rid of above check completely.
--
Regards,
Sudeep
From: Yicong Yang <hidden> Date: 2025-03-03 14:11:53
On 2025/2/28 21:54, Sudeep Holla wrote:
On Tue, Feb 18, 2025 at 10:10:16PM +0800, Yicong Yang wrote:
quoted
From: Yicong Yang <yangyicong@hisilicon.com>
On building the topology from the devicetree, we've already
gotten the SMT thread number of each core. Update the largest
SMT thread number and enable the SMT control by the end of
topology parsing.
The core's SMT control provides two interface to the users [1]:
1) enable/disable SMT by writing on/off
2) enable/disable SMT by writing thread number 1/max_thread_number
If a system have more than one SMT thread number the 2) may
not handle it well, since there're multiple thread numbers in the
system and 2) only accept 1/max_thread_number. So issue a warning
to notify the users if such system detected.
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/ABI/testing/sysfs-devices-system-cpu#n542
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
---
drivers/base/arch_topology.c | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
@@ -506,6 +507,10 @@ core_initcall(free_raw_capacity);#endif#if defined(CONFIG_ARM64) || defined(CONFIG_RISCV)++/* Maximum SMT thread number detected used to enable the SMT control */+staticunsignedintmax_smt_thread_num;+/**Thisfunctionreturnsthelogiccpunumberofthenode.*Therearebasicallythreekindsofreturnvalues:
@@ -565,6 +570,16 @@ static int __init parse_core(struct device_node *core, int package_id,i++;}while(1);+/*+*Ifmax_smt_thread_numhasbeeninitializedanddoesn'tmatch+*thethreadnumberofthisentry,thenthesystemhas+*heterogeneousSMTtopology.+*/+if(max_smt_thread_num&&max_smt_thread_num!=i)+pr_warn_once("Heterogeneous SMT topology is partly supported by SMT control\n");+
May be we need to make it more conditional as we may have to support
systems with few cores that are single threaded ? I think Dietmar's
comment is about that.
it thought of ignoring the cores with single thread in one previous discussion
as replied in Dietmar's thread.
quoted
+ max_smt_thread_num = max_t(unsigned int, max_smt_thread_num, i);
+
cpu = get_cpu_for_node(core);
if (cpu >= 0) {
if (!leaf) {
@@ -677,6 +692,18 @@ static int __init parse_socket(struct device_node *socket) if (!has_socket) ret = parse_cluster(socket, 0, -1, 0);+ /*+ * Notify the CPU framework of the SMT support. Initialize the+ * max_smt_thread_num to 1 if no SMT support detected or failed+ * to parse the topology. A thread number of 1 can be handled by+ * the framework so we don't need to check max_smt_thread_num to+ * see we support SMT or not.+ */+ if (!max_smt_thread_num || ret)+ max_smt_thread_num = 1;+
For the failed parsing of topology, reset_cpu_topology() gets called.
I suggest resetting max_smt_thread_num to 1 belongs there.
this is only used by ARM64 || RISCV for using arch_topology to parse
the CPU topology, but the reset_cpu_topology() is also shared by arm/parisc.
Should we move it there and add some ARM64 || RISCV protection macro?
And if you start with max_smt_thread_num, we don't need to update it to
1 explicitly here. So I would like to get rid of above check completely.
--
Regards,
Sudeep
.
From: Yicong Yang <yangyicong@hisilicon.com>
The core CPU control framework supports runtime SMT control which
is not yet supported on arm64. Besides the general vulnerabilities
concerns we want this runtime control on our arm64 server for:
- better single CPU performance in some cases
- saving overall power consumption
This patchset implements it in the following aspects:
- Provides a default topology_is_primary_thread()
- support retrieve SMT thread number on OF based system
- support retrieve SMT thread number on ACPI based system
- select HOTPLUG_SMT for arm64
Tests has been done on our ACPI based arm64 server and on ACPI/OF
based QEMU VMs.
[...]
Yicong Yang (4):
cpu/SMT: Provide a default topology_is_primary_thread()
arch_topology: Support SMT control for OF based system
arm64: topology: Support SMT control on ACPI based system
arm64: Kconfig: Enable HOTPLUG_SMT
arch/arm64/Kconfig | 1 +
arch/arm64/kernel/topology.c | 66 +++++++++++++++++++++++++++++
arch/powerpc/include/asm/topology.h | 1 +
arch/x86/include/asm/topology.h | 2 +-
drivers/base/arch_topology.c | 27 ++++++++++++
include/linux/topology.h | 22 ++++++++++
6 files changed, 118 insertions(+), 1 deletion(-)
With the review comments on the individual patches [0-3]/4:
Reviewed-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
From: Yicong Yang <hidden> Date: 2025-03-03 14:41:50
On 2025/2/28 19:12, Dietmar Eggemann wrote:
On 18/02/2025 15:10, Yicong Yang wrote:
quoted
From: Yicong Yang <yangyicong@hisilicon.com>
The core CPU control framework supports runtime SMT control which
is not yet supported on arm64. Besides the general vulnerabilities
concerns we want this runtime control on our arm64 server for:
- better single CPU performance in some cases
- saving overall power consumption
This patchset implements it in the following aspects:
- Provides a default topology_is_primary_thread()
- support retrieve SMT thread number on OF based system
- support retrieve SMT thread number on ACPI based system
- select HOTPLUG_SMT for arm64
Tests has been done on our ACPI based arm64 server and on ACPI/OF
based QEMU VMs.
[...]
quoted
Yicong Yang (4):
cpu/SMT: Provide a default topology_is_primary_thread()
arch_topology: Support SMT control for OF based system
arm64: topology: Support SMT control on ACPI based system
arm64: Kconfig: Enable HOTPLUG_SMT
arch/arm64/Kconfig | 1 +
arch/arm64/kernel/topology.c | 66 +++++++++++++++++++++++++++++
arch/powerpc/include/asm/topology.h | 1 +
arch/x86/include/asm/topology.h | 2 +-
drivers/base/arch_topology.c | 27 ++++++++++++
include/linux/topology.h | 22 ++++++++++
6 files changed, 118 insertions(+), 1 deletion(-)
With the review comments on the individual patches [0-3]/4: