Skip to content

Commit 8031772

Browse files
xry111gregkh
authored andcommitted
x86/mm: Don't disable PCID when INVLPG has been fixed by microcode
commit f24f669 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>
1 parent e551a18 commit 8031772

1 file changed

Lines changed: 14 additions & 9 deletions

File tree

arch/x86/mm/init.c

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -263,28 +263,33 @@ static void __init probe_page_size_mask(void)
263263
}
264264

265265
/*
266-
* INVLPG may not properly flush Global entries
267-
* on these CPUs when PCIDs are enabled.
266+
* INVLPG may not properly flush Global entries on
267+
* these CPUs. New microcode fixes the issue.
268268
*/
269269
static const struct x86_cpu_id invlpg_miss_ids[] = {
270-
X86_MATCH_VFM(INTEL_ALDERLAKE, 0),
271-
X86_MATCH_VFM(INTEL_ALDERLAKE_L, 0),
272-
X86_MATCH_VFM(INTEL_ATOM_GRACEMONT, 0),
273-
X86_MATCH_VFM(INTEL_RAPTORLAKE, 0),
274-
X86_MATCH_VFM(INTEL_RAPTORLAKE_P, 0),
275-
X86_MATCH_VFM(INTEL_RAPTORLAKE_S, 0),
270+
X86_MATCH_VFM(INTEL_ALDERLAKE, 0x2e),
271+
X86_MATCH_VFM(INTEL_ALDERLAKE_L, 0x42c),
272+
X86_MATCH_VFM(INTEL_ATOM_GRACEMONT, 0x11),
273+
X86_MATCH_VFM(INTEL_RAPTORLAKE, 0x118),
274+
X86_MATCH_VFM(INTEL_RAPTORLAKE_P, 0x4117),
275+
X86_MATCH_VFM(INTEL_RAPTORLAKE_S, 0x2e),
276276
{}
277277
};
278278

279279
static void setup_pcid(void)
280280
{
281+
const struct x86_cpu_id *invlpg_miss_match;
282+
281283
if (!IS_ENABLED(CONFIG_X86_64))
282284
return;
283285

284286
if (!boot_cpu_has(X86_FEATURE_PCID))
285287
return;
286288

287-
if (x86_match_cpu(invlpg_miss_ids)) {
289+
invlpg_miss_match = x86_match_cpu(invlpg_miss_ids);
290+
291+
if (invlpg_miss_match &&
292+
boot_cpu_data.microcode < invlpg_miss_match->driver_data) {
288293
pr_info("Incomplete global flushes, disabling PCID");
289294
setup_clear_cpu_cap(X86_FEATURE_PCID);
290295
return;

0 commit comments

Comments
 (0)