--- b/arch/x86/kernel/cpu/bugs.c +++ a/arch/x86/kernel/cpu/bugs.c @@ -61,7 +61,7 @@ * identify_boot_cpu() initialized SMT support information, let the * core code know. */ + cpu_smt_check_topology(); - cpu_smt_check_topology_early(); if (!IS_ENABLED(CONFIG_SMP)) { pr_info("CPU: "); --- b/include/linux/cpu.h +++ a/include/linux/cpu.h @@ -267,12 +267,10 @@ #if defined(CONFIG_SMP) && defined(CONFIG_HOTPLUG_SMT) extern enum cpuhp_smt_control cpu_smt_control; extern void cpu_smt_disable(bool force); -extern void cpu_smt_check_topology_early(void); extern void cpu_smt_check_topology(void); #else # define cpu_smt_control (CPU_SMT_ENABLED) static inline void cpu_smt_disable(bool force) { } -static inline void cpu_smt_check_topology_early(void) { } static inline void cpu_smt_check_topology(void) { } #endif --- b/kernel/cpu.c +++ a/kernel/cpu.c @@ -360,8 +360,6 @@ enum cpuhp_smt_control cpu_smt_control __read_mostly = CPU_SMT_ENABLED; EXPORT_SYMBOL_GPL(cpu_smt_control); -static bool cpu_smt_available __read_mostly; - void __init cpu_smt_disable(bool force) { if (cpu_smt_control == CPU_SMT_FORCE_DISABLED || @@ -378,28 +376,14 @@ /* * The decision whether SMT is supported can only be done after the full + * CPU identification. Called from architecture code. - * CPU identification. Called from architecture code before non boot CPUs - * are brought up. */ +void __init cpu_smt_check_topology(void) -void __init cpu_smt_check_topology_early(void) { if (!topology_smt_supported()) cpu_smt_control = CPU_SMT_NOT_SUPPORTED; } -/* - * If SMT was disabled by BIOS, detect it here, after the CPUs have been - * brought online. This ensures the smt/l1tf sysfs entries are consistent - * with reality. cpu_smt_available is set to true during the bringup of non - * boot CPUs when a SMT sibling is detected. Note, this may overwrite - * cpu_smt_control's previous setting. - */ -void __init cpu_smt_check_topology(void) -{ - if (!cpu_smt_available) - cpu_smt_control = CPU_SMT_NOT_SUPPORTED; -} - static int __init smt_cmdline_disable(char *str) { cpu_smt_disable(str && !strcmp(str, "force")); @@ -409,18 +393,10 @@ static inline bool cpu_smt_allowed(unsigned int cpu) { + if (cpu_smt_control == CPU_SMT_ENABLED) - if (topology_is_primary_thread(cpu)) return true; + if (topology_is_primary_thread(cpu)) - /* - * If the CPU is not a 'primary' thread and the booted_once bit is - * set then the processor has SMT support. Store this information - * for the late check of SMT support in cpu_smt_check_topology(). - */ - if (per_cpu(cpuhp_state, cpu).booted_once) - cpu_smt_available = true; - - if (cpu_smt_control == CPU_SMT_ENABLED) return true; /* @@ -2087,6 +2063,15 @@ static int __init cpu_smt_state_init(void) { + /* + * If SMT was disabled by BIOS, detect it here, after the CPUs have + * been brought online. This ensures the smt/l1tf sysfs entries are + * consistent with reality. Note this may overwrite cpu_smt_control's + * previous setting. + */ + if (topology_max_smt_threads() == 1) + cpu_smt_control = CPU_SMT_NOT_SUPPORTED; + return sysfs_create_group(&cpu_subsys.dev_root->kobj, &cpuhp_smt_attr_group); } --- b/kernel/smp.c +++ a/kernel/smp.c @@ -564,8 +564,6 @@ cpu_up(cpu); } - /* Final decision about SMT support */ - cpu_smt_check_topology(); /* Any cleanup work */ smp_announce(); smp_cpus_done(setup_max_cpus);