]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 10 Mar 2025 16:09:45 +0000 (17:09 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 10 Mar 2025 16:09:45 +0000 (17:09 +0100)
added patches:
x86-mm-don-t-disable-pcid-when-invlpg-has-been-fixed-by-microcode.patch

queue-5.4/x86-mm-don-t-disable-pcid-when-invlpg-has-been-fixed-by-microcode.patch [new file with mode: 0644]

diff --git a/queue-5.4/x86-mm-don-t-disable-pcid-when-invlpg-has-been-fixed-by-microcode.patch b/queue-5.4/x86-mm-don-t-disable-pcid-when-invlpg-has-been-fixed-by-microcode.patch
new file mode 100644 (file)
index 0000000..3e650d3
--- /dev/null
@@ -0,0 +1,89 @@
+From f24f669d03f884a6ef95cca84317d0f329e93961 Mon Sep 17 00:00:00 2001
+From: Xi Ruoyao <xry111@xry111.site>
+Date: Wed, 22 May 2024 10:06:24 +0800
+Subject: x86/mm: Don't disable PCID when INVLPG has been fixed by microcode
+
+From: Xi Ruoyao <xry111@xry111.site>
+
+commit f24f669d03f884a6ef95cca84317d0f329e93961 upstream.
+
+Per the "Processor Specification Update" documentations referred by
+the intel-microcode-20240312 release note, this microcode release has
+fixed the issue for all affected models.
+
+So don't disable PCID if the microcode is new enough.  The precise
+minimum microcode revision fixing the issue was provided by Pawan
+Intel.
+
+[ dhansen: comment and changelog tweaks ]
+
+Signed-off-by: Xi Ruoyao <xry111@xry111.site>
+Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
+Acked-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
+Link: https://lore.kernel.org/all/168436059559.404.13934972543631851306.tip-bot2@tip-bot2/
+Link: https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files/releases/tag/microcode-20240312
+Link: https://cdrdv2.intel.com/v1/dl/getContent/740518 # RPL042, rev. 13
+Link: https://cdrdv2.intel.com/v1/dl/getContent/682436 # ADL063, rev. 24
+Link: https://lore.kernel.org/all/20240325231300.qrltbzf6twm43ftb@desk/
+Link: https://lore.kernel.org/all/20240522020625.69418-1-xry111%40xry111.site
+Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/mm/init.c |   32 +++++++++++++++++++-------------
+ 1 file changed, 19 insertions(+), 13 deletions(-)
+
+--- a/arch/x86/mm/init.c
++++ b/arch/x86/mm/init.c
+@@ -211,33 +211,39 @@ static void __init probe_page_size_mask(
+       }
+ }
+-#define INTEL_MATCH(_model) { .vendor  = X86_VENDOR_INTEL,    \
+-                            .family  = 6,                     \
+-                            .model = _model,                  \
+-                          }
++#define INTEL_MATCH(_model, ucode) { .vendor  = X86_VENDOR_INTEL,     \
++                                   .family  = 6,                      \
++                                   .model = _model,                   \
++                                   .driver_data = ucode,              \
++                                 }
+ /*
+- * INVLPG may not properly flush Global entries
+- * on these CPUs when PCIDs are enabled.
++ * INVLPG may not properly flush Global entries on
++ * these CPUs.  New microcode fixes the issue.
+  */
+ static const struct x86_cpu_id invlpg_miss_ids[] = {
+-      INTEL_MATCH(INTEL_FAM6_ALDERLAKE   ),
+-      INTEL_MATCH(INTEL_FAM6_ALDERLAKE_L ),
+-      INTEL_MATCH(INTEL_FAM6_ALDERLAKE_N ),
+-      INTEL_MATCH(INTEL_FAM6_RAPTORLAKE  ),
+-      INTEL_MATCH(INTEL_FAM6_RAPTORLAKE_P),
+-      INTEL_MATCH(INTEL_FAM6_RAPTORLAKE_S),
++      INTEL_MATCH(INTEL_FAM6_ALDERLAKE,       0x2e),
++      INTEL_MATCH(INTEL_FAM6_ALDERLAKE_L,     0x42c),
++      INTEL_MATCH(INTEL_FAM6_ALDERLAKE_N,     0x11),
++      INTEL_MATCH(INTEL_FAM6_RAPTORLAKE,      0x118),
++      INTEL_MATCH(INTEL_FAM6_RAPTORLAKE_P,    0x4117),
++      INTEL_MATCH(INTEL_FAM6_RAPTORLAKE_S,    0x2e),
+       {}
+ };
+ static void setup_pcid(void)
+ {
++      const struct x86_cpu_id *invlpg_miss_match;
++
+       if (!IS_ENABLED(CONFIG_X86_64))
+               return;
+       if (!boot_cpu_has(X86_FEATURE_PCID))
+               return;
+-      if (x86_match_cpu(invlpg_miss_ids)) {
++      invlpg_miss_match = x86_match_cpu(invlpg_miss_ids);
++
++      if (invlpg_miss_match &&
++          boot_cpu_data.microcode < invlpg_miss_match->driver_data) {
+               pr_info("Incomplete global flushes, disabling PCID");
+               setup_clear_cpu_cap(X86_FEATURE_PCID);
+               return;