From: Greg Kroah-Hartman Date: Wed, 26 Oct 2022 16:39:24 +0000 (+0200) Subject: 5.15-stable patches X-Git-Tag: v5.10.151~48 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6a50f3d9312762f472a6eee775555e5215b976f8;p=thirdparty%2Fkernel%2Fstable-queue.git 5.15-stable patches added patches: x86-topology-fix-duplicated-core-id-within-a-package.patch x86-topology-fix-multiple-packages-shown-on-a-single-package-system.patch --- diff --git a/queue-5.15/series b/queue-5.15/series index a5a3cc8866d..ba23b38c4ee 100644 --- a/queue-5.15/series +++ b/queue-5.15/series @@ -27,3 +27,5 @@ kvm-arm64-vgic-fix-exit-condition-in-scan_its_table.patch media-ipu3-imgu-fix-null-pointer-dereference-in-active-selection-access.patch media-mceusb-set-timeout-to-at-least-timeout-provided.patch media-venus-dec-handle-the-case-where-find_format-fails.patch +x86-topology-fix-multiple-packages-shown-on-a-single-package-system.patch +x86-topology-fix-duplicated-core-id-within-a-package.patch diff --git a/queue-5.15/x86-topology-fix-duplicated-core-id-within-a-package.patch b/queue-5.15/x86-topology-fix-duplicated-core-id-within-a-package.patch new file mode 100644 index 00000000000..d0c73799448 --- /dev/null +++ b/queue-5.15/x86-topology-fix-duplicated-core-id-within-a-package.patch @@ -0,0 +1,49 @@ +From 71eac7063698b7d7b8fafb1683ac24a034541141 Mon Sep 17 00:00:00 2001 +From: Zhang Rui +Date: Fri, 14 Oct 2022 17:01:47 +0800 +Subject: x86/topology: Fix duplicated core ID within a package + +From: Zhang Rui + +commit 71eac7063698b7d7b8fafb1683ac24a034541141 upstream. + +Today, core ID is assumed to be unique within each package. + +But an AlderLake-N platform adds a Module level between core and package, +Linux excludes the unknown modules bits from the core ID, resulting in +duplicate core ID's. + +To keep core ID unique within a package, Linux must include all APIC-ID +bits for known or unknown levels above the core and below the package +in the core ID. + +It is important to understand that core ID's have always come directly +from the APIC-ID encoding, which comes from the BIOS. Thus there is no +guarantee that they start at 0, or that they are contiguous. +As such, naively using them for array indexes can be problematic. + +[ dhansen: un-known -> unknown ] + +Fixes: 7745f03eb395 ("x86/topology: Add CPUID.1F multi-die/package support") +Suggested-by: Len Brown +Signed-off-by: Zhang Rui +Signed-off-by: Dave Hansen +Reviewed-by: Len Brown +Cc: stable@vger.kernel.org +Link: https://lkml.kernel.org/r/20221014090147.1836-5-rui.zhang@intel.com +Signed-off-by: Greg Kroah-Hartman +--- + arch/x86/kernel/cpu/topology.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/arch/x86/kernel/cpu/topology.c ++++ b/arch/x86/kernel/cpu/topology.c +@@ -141,7 +141,7 @@ int detect_extended_topology(struct cpui + sub_index++; + } + +- core_select_mask = (~(-1 << core_plus_mask_width)) >> ht_mask_width; ++ core_select_mask = (~(-1 << pkg_mask_width)) >> ht_mask_width; + die_select_mask = (~(-1 << die_plus_mask_width)) >> + core_plus_mask_width; + diff --git a/queue-5.15/x86-topology-fix-multiple-packages-shown-on-a-single-package-system.patch b/queue-5.15/x86-topology-fix-multiple-packages-shown-on-a-single-package-system.patch new file mode 100644 index 00000000000..4caa7e9df07 --- /dev/null +++ b/queue-5.15/x86-topology-fix-multiple-packages-shown-on-a-single-package-system.patch @@ -0,0 +1,87 @@ +From 2b12a7a126d62bdbd81f4923c21bf6e9a7fbd069 Mon Sep 17 00:00:00 2001 +From: Zhang Rui +Date: Fri, 14 Oct 2022 17:01:46 +0800 +Subject: x86/topology: Fix multiple packages shown on a single-package system + +From: Zhang Rui + +commit 2b12a7a126d62bdbd81f4923c21bf6e9a7fbd069 upstream. + +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 ] + +Fixes: 7745f03eb395 ("x86/topology: Add CPUID.1F multi-die/package support") +Suggested-by: Len Brown +Signed-off-by: Zhang Rui +Signed-off-by: Dave Hansen +Reviewed-by: Len Brown +Cc: stable@vger.kernel.org +Link: https://lkml.kernel.org/r/20221014090147.1836-4-rui.zhang@intel.com +Signed-off-by: Greg Kroah-Hartman +--- + arch/x86/kernel/cpu/topology.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +--- a/arch/x86/kernel/cpu/topology.c ++++ b/arch/x86/kernel/cpu/topology.c +@@ -96,6 +96,7 @@ int detect_extended_topology(struct cpui + 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 cpui + 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 cpui + 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 cpui + } + + 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. + */