]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.15-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 26 Oct 2022 16:39:24 +0000 (18:39 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 26 Oct 2022 16:39:24 +0000 (18:39 +0200)
added patches:
x86-topology-fix-duplicated-core-id-within-a-package.patch
x86-topology-fix-multiple-packages-shown-on-a-single-package-system.patch

queue-5.15/series
queue-5.15/x86-topology-fix-duplicated-core-id-within-a-package.patch [new file with mode: 0644]
queue-5.15/x86-topology-fix-multiple-packages-shown-on-a-single-package-system.patch [new file with mode: 0644]

index a5a3cc8866d8ae9e1316f8ade6331e64450fcf1f..ba23b38c4ee021b34ba0132db21f9b96e8bd4934 100644 (file)
@@ -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 (file)
index 0000000..d0c7379
--- /dev/null
@@ -0,0 +1,49 @@
+From 71eac7063698b7d7b8fafb1683ac24a034541141 Mon Sep 17 00:00:00 2001
+From: Zhang Rui <rui.zhang@intel.com>
+Date: Fri, 14 Oct 2022 17:01:47 +0800
+Subject: x86/topology: Fix duplicated core ID within a package
+
+From: Zhang Rui <rui.zhang@intel.com>
+
+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 <len.brown@intel.com>
+Signed-off-by: Zhang Rui <rui.zhang@intel.com>
+Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
+Reviewed-by: Len Brown <len.brown@intel.com>
+Cc: stable@vger.kernel.org
+Link: https://lkml.kernel.org/r/20221014090147.1836-5-rui.zhang@intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..4caa7e9
--- /dev/null
@@ -0,0 +1,87 @@
+From 2b12a7a126d62bdbd81f4923c21bf6e9a7fbd069 Mon Sep 17 00:00:00 2001
+From: Zhang Rui <rui.zhang@intel.com>
+Date: Fri, 14 Oct 2022 17:01:46 +0800
+Subject: x86/topology: Fix multiple packages shown on a single-package system
+
+From: Zhang Rui <rui.zhang@intel.com>
+
+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 <len.brown@intel.com>
+Signed-off-by: Zhang Rui <rui.zhang@intel.com>
+Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
+Reviewed-by: Len Brown <len.brown@intel.com>
+Cc: stable@vger.kernel.org
+Link: https://lkml.kernel.org/r/20221014090147.1836-4-rui.zhang@intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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.
+        */