For x86 boxes, smp_num_siblings is set to a value read in a CPUID call in detect_ht(). This value is the *factory defined* value in all cases; even if HT is disabled in BIOS the value still returns 2 if the CPU supports HT. AMD also reports the factory defined value in all cases.
That is, even with threading disabled, crash> p smp_num_siblings smp_num_siblings = $1 = 0x2 on processors that support multi-threading. smp_num_siblings should be calculated a single time on cpu 0 to determine whether or not the system is multi-threaded or not. On a system with HT enabled, crash> p smp_num_siblings smp_num_siblings = $1 = 0x2 On a system with HT disabled, crash> p smp_num_siblings smp_num_siblings = $1 = 0x1 Cc: Thomas Gleixner <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: "H. Peter Anvin" <[email protected]> Cc: [email protected] Cc: Borislav Petkov <[email protected]> Cc: Paul Gortmaker <[email protected]> Cc: Andrew Morton <[email protected]> Cc: Andi Kleen <[email protected]> Cc: Dave Jones <[email protected]> Cc: Torsten Kaiser <[email protected]> Cc: Jan Beulich <[email protected]> Cc: Jan Kiszka <[email protected]> Cc: Toshi Kani <[email protected]> Cc: Andrew Jones <[email protected]> Signed-off-by: Prarit Bhargava <[email protected]> --- arch/x86/kernel/cpu/common.c | 2 +- arch/x86/kernel/smpboot.c | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index fc1235c..81a5aac 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -522,7 +522,7 @@ void detect_ht(struct cpuinfo_x86 *c) cpuid(1, &eax, &ebx, &ecx, &edx); - threads_per_core = smp_num_siblings = (ebx & 0xff0000) >> 16; + threads_per_core = (ebx & 0xff0000) >> 16; if (threads_per_core <= 1) { pr_info_once("CPU: Hyper-Threading is unsupported on this processor.\n"); diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index b2ad27c..9eb96d2 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c @@ -363,6 +363,7 @@ void set_cpu_sibling_map(int cpu) cpumask_set_cpu(cpu, cpu_llc_shared_mask(cpu)); cpumask_set_cpu(cpu, cpu_core_mask(cpu)); c->booted_cores = 1; + smp_num_siblings = 1; return; } @@ -407,6 +408,10 @@ void set_cpu_sibling_map(int cpu) c->booted_cores = cpu_data(i).booted_cores; } } + + /* Only need to check this on the boot cpu, o/w it is disabled */ + if (cpu == 0) + smp_num_siblings = cpumask_weight(cpu_sibling_mask(cpu)); } /* maps the cpu to the sched domain representing multi-core */ -- 1.7.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

