Patch "cpu/SMT: Create topology_smt_thread_allowed()" has been added to the 6.5-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    cpu/SMT: Create topology_smt_thread_allowed()

to the 6.5-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     cpu-smt-create-topology_smt_thread_allowed.patch
and it can be found in the queue-6.5 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit f4d26aec9636f657d932e9cc9d75a82e731ce635
Author: Michael Ellerman <mpe@xxxxxxxxxxxxxx>
Date:   Wed Jul 5 16:51:39 2023 +0200

    cpu/SMT: Create topology_smt_thread_allowed()
    
    [ Upstream commit 38253464bc821d6de6bba81bb1412ebb36f6cbd1 ]
    
    Some architectures allows partial SMT states, i.e. when not all SMT threads
    are brought online.
    
    To support that, add an architecture helper which checks whether a given
    CPU is allowed to be brought online depending on how many SMT threads are
    currently enabled. Since this is only applicable to architecture supporting
    partial SMT, only these architectures should select the new configuration
    variable CONFIG_SMT_NUM_THREADS_DYNAMIC. For the other architectures, not
    supporting the partial SMT states, there is no need to define
    topology_cpu_smt_allowed(), the generic code assumed that all the threads
    are allowed or only the primary ones.
    
    Call the helper from cpu_smt_enable(), and cpu_smt_allowed() when SMT is
    enabled, to check if the particular thread should be onlined. Notably,
    also call it from cpu_smt_disable() if CPU_SMT_ENABLED, to allow
    offlining some threads to move from a higher to lower number of threads
    online.
    
    [ ldufour: Slightly reword the commit's description ]
    [ ldufour: Introduce CONFIG_SMT_NUM_THREADS_DYNAMIC ]
    
    Suggested-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
    Signed-off-by: Michael Ellerman <mpe@xxxxxxxxxxxxxx>
    Signed-off-by: Laurent Dufour <ldufour@xxxxxxxxxxxxx>
    Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
    Tested-by: Zhang Rui <rui.zhang@xxxxxxxxx>
    Link: https://lore.kernel.org/r/20230705145143.40545-7-ldufour@xxxxxxxxxxxxx
    Stable-dep-of: d91bdd96b55c ("cpu/SMT: Make SMT control more robust against enumeration failures")
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/Kconfig b/arch/Kconfig
index aff2746c8af28..63c5d6a2022bc 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -34,6 +34,9 @@ config ARCH_HAS_SUBPAGE_FAULTS
 config HOTPLUG_SMT
 	bool
 
+config SMT_NUM_THREADS_DYNAMIC
+	bool
+
 # Selected by HOTPLUG_CORE_SYNC_DEAD or HOTPLUG_CORE_SYNC_FULL
 config HOTPLUG_CORE_SYNC
 	bool
diff --git a/kernel/cpu.c b/kernel/cpu.c
index dd59ffeacff2e..21864899c770a 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -625,9 +625,23 @@ static int __init smt_cmdline_disable(char *str)
 }
 early_param("nosmt", smt_cmdline_disable);
 
+/*
+ * For Archicture supporting partial SMT states check if the thread is allowed.
+ * Otherwise this has already been checked through cpu_smt_max_threads when
+ * setting the SMT level.
+ */
+static inline bool cpu_smt_thread_allowed(unsigned int cpu)
+{
+#ifdef CONFIG_SMT_NUM_THREADS_DYNAMIC
+	return topology_smt_thread_allowed(cpu);
+#else
+	return true;
+#endif
+}
+
 static inline bool cpu_smt_allowed(unsigned int cpu)
 {
-	if (cpu_smt_control == CPU_SMT_ENABLED)
+	if (cpu_smt_control == CPU_SMT_ENABLED && cpu_smt_thread_allowed(cpu))
 		return true;
 
 	if (topology_is_primary_thread(cpu))
@@ -2644,6 +2658,12 @@ int cpuhp_smt_disable(enum cpuhp_smt_control ctrlval)
 	for_each_online_cpu(cpu) {
 		if (topology_is_primary_thread(cpu))
 			continue;
+		/*
+		 * Disable can be called with CPU_SMT_ENABLED when changing
+		 * from a higher to lower number of SMT threads per core.
+		 */
+		if (ctrlval == CPU_SMT_ENABLED && cpu_smt_thread_allowed(cpu))
+			continue;
 		ret = cpu_down_maps_locked(cpu, CPUHP_OFFLINE);
 		if (ret)
 			break;
@@ -2678,6 +2698,8 @@ int cpuhp_smt_enable(void)
 		/* Skip online CPUs and CPUs on offline nodes */
 		if (cpu_online(cpu) || !node_online(cpu_to_node(cpu)))
 			continue;
+		if (!cpu_smt_thread_allowed(cpu))
+			continue;
 		ret = _cpu_up(cpu, 0, CPUHP_ONLINE);
 		if (ret)
 			break;



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux