Patch "x86/topology: Fix erroneous smp_num_siblings on Intel Hybrid platforms" has been added to the 4.19-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    x86/topology: Fix erroneous smp_num_siblings on Intel Hybrid platforms

to the 4.19-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     x86-topology-fix-erroneous-smp_num_siblings-on-intel.patch
and it can be found in the queue-4.19 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit c429b416c053eab6a839cd6d138e8381f67f65f9
Author: Zhang Rui <rui.zhang@xxxxxxxxx>
Date:   Thu Mar 23 09:56:40 2023 +0800

    x86/topology: Fix erroneous smp_num_siblings on Intel Hybrid platforms
    
    [ Upstream commit edc0a2b5957652f4685ef3516f519f84807087db ]
    
    Traditionally, all CPUs in a system have identical numbers of SMT
    siblings.  That changes with hybrid processors where some logical CPUs
    have a sibling and others have none.
    
    Today, the CPU boot code sets the global variable smp_num_siblings when
    every CPU thread is brought up. The last thread to boot will overwrite
    it with the number of siblings of *that* thread. That last thread to
    boot will "win". If the thread is a Pcore, smp_num_siblings == 2.  If it
    is an Ecore, smp_num_siblings == 1.
    
    smp_num_siblings describes if the *system* supports SMT.  It should
    specify the maximum number of SMT threads among all cores.
    
    Ensure that smp_num_siblings represents the system-wide maximum number
    of siblings by always increasing its value. Never allow it to decrease.
    
    On MeteorLake-P platform, this fixes a problem that the Ecore CPUs are
    not updated in any cpu sibling map because the system is treated as an
    UP system when probing Ecore CPUs.
    
    Below shows part of the CPU topology information before and after the
    fix, for both Pcore and Ecore CPU (cpu0 is Pcore, cpu 12 is Ecore).
    ...
    -/sys/devices/system/cpu/cpu0/topology/package_cpus:000fff
    -/sys/devices/system/cpu/cpu0/topology/package_cpus_list:0-11
    +/sys/devices/system/cpu/cpu0/topology/package_cpus:3fffff
    +/sys/devices/system/cpu/cpu0/topology/package_cpus_list:0-21
    ...
    -/sys/devices/system/cpu/cpu12/topology/package_cpus:001000
    -/sys/devices/system/cpu/cpu12/topology/package_cpus_list:12
    +/sys/devices/system/cpu/cpu12/topology/package_cpus:3fffff
    +/sys/devices/system/cpu/cpu12/topology/package_cpus_list:0-21
    
    Notice that the "before" 'package_cpus_list' has only one CPU.  This
    means that userspace tools like lscpu will see a little laptop like
    an 11-socket system:
    
    -Core(s) per socket:  1
    -Socket(s):           11
    +Core(s) per socket:  16
    +Socket(s):           1
    
    This is also expected to make the scheduler do rather wonky things
    too.
    
    [ dhansen: remove CPUID detail from changelog, add end user effects ]
    
    CC: stable@xxxxxxxxxx
    Fixes: bbb65d2d365e ("x86: use cpuid vector 0xb when available for detecting cpu topology")
    Fixes: 95f3d39ccf7a ("x86/cpu/topology: Provide detect_extended_topology_early()")
    Suggested-by: Len Brown <len.brown@xxxxxxxxx>
    Signed-off-by: Zhang Rui <rui.zhang@xxxxxxxxx>
    Signed-off-by: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>
    Acked-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx>
    Link: https://lore.kernel.org/all/20230323015640.27906-1-rui.zhang%40intel.com
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/x86/kernel/cpu/topology.c b/arch/x86/kernel/cpu/topology.c
index 71ca064e37948..31fe56a90cbf8 100644
--- a/arch/x86/kernel/cpu/topology.c
+++ b/arch/x86/kernel/cpu/topology.c
@@ -44,7 +44,7 @@ int detect_extended_topology_early(struct cpuinfo_x86 *c)
 	 * initial apic id, which also represents 32-bit extended x2apic id.
 	 */
 	c->initial_apicid = edx;
-	smp_num_siblings = LEVEL_MAX_SIBLINGS(ebx);
+	smp_num_siblings = max_t(int, smp_num_siblings, LEVEL_MAX_SIBLINGS(ebx));
 #endif
 	return 0;
 }
@@ -68,7 +68,8 @@ int detect_extended_topology(struct cpuinfo_x86 *c)
 	 * Populate HT related information from sub-leaf level 0.
 	 */
 	cpuid_count(0xb, SMT_LEVEL, &eax, &ebx, &ecx, &edx);
-	core_level_siblings = smp_num_siblings = LEVEL_MAX_SIBLINGS(ebx);
+	core_level_siblings = LEVEL_MAX_SIBLINGS(ebx);
+	smp_num_siblings = max_t(int, smp_num_siblings, LEVEL_MAX_SIBLINGS(ebx));
 	core_plus_mask_width = ht_mask_width = BITS_SHIFT_NEXT_LEVEL(eax);
 
 	sub_index = 1;



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux