Skip to content

Commit 5deb9c7

Browse files
Yicong Yangctmarinas
authored andcommitted
arch_topology: Support SMT control for OF based system
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 framework's SMT control provides two interface to the users through /sys/devices/system/cpu/smt/control (Documentation/ABI/testing/sysfs-devices-system-cpu): 1) enable SMT by writing "on" and disable by "off" 2) enable SMT by writing max_thread_number or disable by writing 1 Both method support to completely disable/enable the SMT cores so both work correctly for symmetric SMT platform and asymmetric platform with non-SMT and one type SMT cores like: core A: 1 thread core B: X (X!=1) threads Note that for a theoretically possible multiple SMT-X (X>1) core platform the SMT control is also supported as expected but only by writing the "on/off" method. Reviewed-by: Pierre Gondois <pierre.gondois@arm.com> Reviewed-by: Dietmar Eggemann <dietmar.eggemann@arm.com> Signed-off-by: Yicong Yang <yangyicong@hisilicon.com> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Reviewed-by: Sudeep Holla <sudeep.holla@arm.com> Link: https://lore.kernel.org/r/20250311075143.61078-3-yangyicong@huawei.com Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
1 parent 4b455f5 commit 5deb9c7

File tree

1 file changed

+18
-0
lines changed

1 file changed

+18
-0
lines changed

drivers/base/arch_topology.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <linux/cleanup.h>
1212
#include <linux/cpu.h>
1313
#include <linux/cpufreq.h>
14+
#include <linux/cpu_smt.h>
1415
#include <linux/device.h>
1516
#include <linux/of.h>
1617
#include <linux/slab.h>
@@ -506,6 +507,10 @@ core_initcall(free_raw_capacity);
506507
#endif
507508

508509
#if defined(CONFIG_ARM64) || defined(CONFIG_RISCV)
510+
511+
/* Used to enable the SMT control */
512+
static unsigned int max_smt_thread_num = 1;
513+
509514
/*
510515
* This function returns the logic cpu number of the node.
511516
* There are basically three kinds of return values:
@@ -565,6 +570,8 @@ static int __init parse_core(struct device_node *core, int package_id,
565570
i++;
566571
} while (1);
567572

573+
max_smt_thread_num = max_t(unsigned int, max_smt_thread_num, i);
574+
568575
cpu = get_cpu_for_node(core);
569576
if (cpu >= 0) {
570577
if (!leaf) {
@@ -677,6 +684,17 @@ static int __init parse_socket(struct device_node *socket)
677684
if (!has_socket)
678685
ret = parse_cluster(socket, 0, -1, 0);
679686

687+
/*
688+
* Reset the max_smt_thread_num to 1 on failure. Since on failure
689+
* we need to notify the framework the SMT is not supported, but
690+
* max_smt_thread_num can be initialized to the SMT thread number
691+
* of the cores which are successfully parsed.
692+
*/
693+
if (ret)
694+
max_smt_thread_num = 1;
695+
696+
cpu_smt_set_num_threads(max_smt_thread_num, max_smt_thread_num);
697+
680698
return ret;
681699
}
682700

0 commit comments

Comments
 (0)