FAILED: patch "[PATCH] x86/topology: Fix multiple packages shown on a single-package" failed to apply to 5.4-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Possible dependencies:
2b12a7a126d6 ("x86/topology: Fix multiple packages shown on a single-package system") cb09a379724d ("x86/topology: Set cpu_die_id only if DIE_TYPE found")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 2b12a7a126d62bdbd81f4923c21bf6e9a7fbd069 Mon Sep 17 00:00:00 2001
From: Zhang Rui <[email protected]>
Date: Fri, 14 Oct 2022 17:01:46 +0800
Subject: [PATCH] x86/topology: Fix multiple packages shown on a single-package
system
CPUID.1F/B does not enumerate Package level explicitly, instead, all the APIC-ID bits above the enumerated levels are assumed to be package ID bits.
Current code gets package ID by shifting out all the APIC-ID bits that Linux supports, rather than shifting out all the APIC-ID bits that CPUID.1F enumerates. This introduces problems when CPUID.1F enumerates a level that Linux does not support.
For example, on a single package AlderLake-N, there are 2 Ecore Modules with 4 atom cores in each module. Linux does not support the Module level and interprets the Module ID bits as package ID and erroneously reports a multi module system as a multi-package system.
Fix this by using APIC-ID bits above all the CPUID.1F enumerated levels as package ID.
[ dhansen: spelling fix ]
arch/x86/kernel/cpu/topology.c +10 -4
@@ -96,6 +96,7 @@ int detect_extended_topology(struct cpuinfo_x86 *c)unsigned int ht_mask_width, core_plus_mask_width, die_plus_mask_width;unsigned int core_select_mask, core_level_siblings;unsigned int die_select_mask, die_level_siblings; +unsigned int pkg_mask_width;bool die_level_present = false;int leaf;
@@ -111,10 +112,10 @@ int detect_extended_topology(struct cpuinfo_x86 *c) core_level_siblings = smp_num_siblings =LEVEL_MAX_SIBLINGS (ebx); core_plus_mask_width = ht_mask_width =BITS_SHIFT_NEXT_LEVEL (eax); die_level_siblings =LEVEL_MAX_SIBLINGS (ebx); - die_plus_mask_width =BITS_SHIFT_NEXT_LEVEL (eax); + pkg_mask_width = die_plus_mask_width =BITS_SHIFT_NEXT_LEVEL (eax); sub_index =1 ; - do { +while (true) {cpuid_count (leaf, sub_index, &eax, &ebx, &ecx, &edx);/*
@@ -132,8 +133,13 @@ int detect_extended_topology(struct cpuinfo_x86 *c) die_plus_mask_width =BITS_SHIFT_NEXT_LEVEL (eax); } +if (LEAFB_SUBTYPE (ecx) !=INVALID_TYPE ) + pkg_mask_width =BITS_SHIFT_NEXT_LEVEL (eax); +else +break ; + sub_index++; - }while (LEAFB_SUBTYPE (ecx) !=INVALID_TYPE ); + } core_select_mask = (~(-1 << core_plus_mask_width)) >> ht_mask_width; die_select_mask = (~(-1 << die_plus_mask_width)) >>
@@ -148,7 +154,7 @@ int detect_extended_topology(struct cpuinfo_x86 *c) } c->phys_proc_id = apic->phys_pkg_id (c->initial_apicid, - die_plus_mask_width); + pkg_mask_width);/* * Reinit the apicid, now that we have extended initial_apicid. */