Skip to content

Commit 260c056

Browse files
xry111gregkh
authored andcommitted
x86/mm: Don't disable PCID when INVLPG has been fixed by microcode
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 <[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 Signed-off-by: Pawan Gupta <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent de03a57 commit 260c056

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_INTEL_FAM6_MODEL(ALDERLAKE, 0),
271-
X86_MATCH_INTEL_FAM6_MODEL(ALDERLAKE_L, 0),
272-
X86_MATCH_INTEL_FAM6_MODEL(ALDERLAKE_N, 0),
273-
X86_MATCH_INTEL_FAM6_MODEL(RAPTORLAKE, 0),
274-
X86_MATCH_INTEL_FAM6_MODEL(RAPTORLAKE_P, 0),
275-
X86_MATCH_INTEL_FAM6_MODEL(RAPTORLAKE_S, 0),
270+
X86_MATCH_INTEL_FAM6_MODEL(ALDERLAKE, 0x2e),
271+
X86_MATCH_INTEL_FAM6_MODEL(ALDERLAKE_L, 0x42c),
272+
X86_MATCH_INTEL_FAM6_MODEL(ALDERLAKE_N, 0x11),
273+
X86_MATCH_INTEL_FAM6_MODEL(RAPTORLAKE, 0x118),
274+
X86_MATCH_INTEL_FAM6_MODEL(RAPTORLAKE_P, 0x4117),
275+
X86_MATCH_INTEL_FAM6_MODEL(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)