]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
LoongArch: Add HOTPLUG_SMT implementation
authorHuacai Chen <chenhuacai@loongson.cn>
Tue, 10 Feb 2026 11:31:13 +0000 (19:31 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Tue, 10 Feb 2026 11:31:13 +0000 (19:31 +0800)
For benchmarking or debugging purpose, we usually want to control SMT
via boot parameter and sysfs knobs. So add HOTPLUG_SMT implementation.

1. Boot parameters:

nosmt: Disable SMT, can be enabled via sysfs knobs.
nosmt=force: Disable SMT, cannot be enabled via sysfs knobs.

2. Runtime sysfs controls:

Write "on", "off", "forceoff" or the number of SMT threads (1, 2, ...)
to /sys/devices/system/cpu/smt/control.

Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Documentation/admin-guide/kernel-parameters.txt
arch/loongarch/Kconfig
arch/loongarch/kernel/smp.c

index aa0031108bc1da46f32fb2f26f106a4232c104aa..674ad1f3bf55f3d1c405815fd4516b4a483ca2fd 100644 (file)
@@ -4585,7 +4585,7 @@ Kernel parameters
        nosmt           [KNL,MIPS,PPC,EARLY] Disable symmetric multithreading (SMT).
                        Equivalent to smt=1.
 
-                       [KNL,X86,PPC,S390] Disable symmetric multithreading (SMT).
+                       [KNL,LOONGARCH,X86,PPC,S390] Disable symmetric multithreading (SMT).
                        nosmt=force: Force disable SMT, cannot be undone
                                     via the sysfs control file.
 
index bf5a5beab366c69989755f7d6c4c8ee8bc7b60cb..36dbc62cb2a99ce7048bf78bc842a27fb9f36715 100644 (file)
@@ -186,6 +186,7 @@ config LOONGARCH
        select HAVE_SYSCALL_TRACEPOINTS
        select HAVE_TIF_NOHZ
        select HAVE_VIRT_CPU_ACCOUNTING_GEN
+       select HOTPLUG_SMT if HOTPLUG_CPU
        select IRQ_FORCED_THREADING
        select IRQ_LOONGARCH_CPU
        select LOCK_MM_AND_FIND_VMA
index 8b2fcb3fb874c556bedab761bbd0d5f45ed40814..64a048f1b88033ef5b01060852b4933727bce854 100644 (file)
@@ -365,16 +365,29 @@ void __init loongson_smp_setup(void)
 void __init loongson_prepare_cpus(unsigned int max_cpus)
 {
        int i = 0;
+       int threads_per_core = 0;
 
        parse_acpi_topology();
        cpu_data[0].global_id = cpu_logical_map(0);
 
+       if (!pptt_enabled)
+               threads_per_core = 1;
+       else {
+               for_each_possible_cpu(i) {
+                       if (cpu_to_node(i) != 0)
+                               continue;
+                       if (cpus_are_siblings(0, i))
+                               threads_per_core++;
+               }
+       }
+
        for (i = 0; i < loongson_sysconf.nr_cpus; i++) {
                set_cpu_present(i, true);
                csr_mail_send(0, __cpu_logical_map[i], 0);
        }
 
        per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
+       cpu_smt_set_num_threads(threads_per_core, threads_per_core);
 }
 
 /*