[PATCH 3/3] x86/topology: Fix Intel HT disable

From: Peter Zijlstra
Date: Fri Mar 18 2016 - 11:08:24 EST


As per the comment below; due to BIOS it is sometimes impossible to
know if there actually are smp siblings until the machine is fully
enumerated.

Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx>
---
arch/x86/kernel/smpboot.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)

--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -312,8 +312,21 @@ static void __init smp_init_package_map(
/*
* Today neither Intel nor AMD support heterogenous systems. That
* might change in the future....
+ *
+ * While ideally we'd want '* smp_num_siblings' in the below @ncpus
+ * computation, this won't actually work since some Intel BIOSes
+ * report inconsistent HT data when they disable HT.
+ *
+ * In particular, they reduce the APIC-IDs to only include the cores,
+ * but leave the CPUID topology to say there are (2) siblings.
+ * This means we don't know how many threads there will be until
+ * after the APIC enumeration.
+ *
+ * By not including this we'll sometimes over-estimate the number of
+ * logical packages by the amount of !present siblings, but this is
+ * still better than MAX_LOCAL_APIC.
*/
- ncpus = boot_cpu_data.x86_max_cores * smp_num_siblings;
+ ncpus = boot_cpu_data.x86_max_cores;
__max_logical_packages = DIV_ROUND_UP(nr_cpu_ids, ncpus);

/*