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) <[email protected]>
---
 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);
 
        /*


Reply via email to