Skip to content

Commit f24f669

Browse files
xry111hansendc
authored andcommitted
x86/mm: Don't disable PCID when INVLPG has been fixed by microcode
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 <[email protected]> Signed-off-by: Dave Hansen <[email protected]> Acked-by: Pawan Gupta <[email protected]> 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
1 parent 9852d85 commit f24f669

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

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)