| From f602940dde8cafbe9518143dc1cfca3c17c17478 Mon Sep 17 00:00:00 2001 |
| From: "Chang S. Bae" <chang.seok.bae@intel.com> |
| Date: Tue, 1 Oct 2024 09:10:36 -0700 |
| Subject: x86/microcode/intel: Remove unnecessary cache writeback and invalidation |
| |
| From: "Chang S. Bae" <chang.seok.bae@intel.com> |
| |
| commit 9a819753b0209c6edebdea447a1aa53e8c697653 upstream |
| |
| Currently, an unconditional cache flush is performed during every |
| microcode update. Although the original changelog did not mention |
| a specific erratum, this measure was primarily intended to address |
| a specific microcode bug, the load of which has already been blocked by |
| is_blacklisted(). Therefore, this cache flush is no longer necessary. |
| |
| Additionally, the side effects of doing this have been overlooked. It |
| increases CPU rendezvous time during late loading, where the cache flush |
| takes between 1x to 3.5x longer than the actual microcode update. |
| |
| Remove native_wbinvd() and update the erratum name to align with the |
| latest errata documentation, document ID 334163 Version 022US. |
| |
| [ bp: Zap the flaky documentation URL. ] |
| |
| Fixes: 91df9fdf5149 ("x86/microcode/intel: Writeback and invalidate caches before updating microcode") |
| Reported-by: Yan Hua Wu <yanhua1.wu@intel.com> |
| Reported-by: William Xie <william.xie@intel.com> |
| Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com> |
| Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> |
| Acked-by: Ashok Raj <ashok.raj@intel.com> |
| Tested-by: Yan Hua Wu <yanhua1.wu@intel.com> |
| Link: https://lore.kernel.org/r/20241001161042.465584-2-chang.seok.bae@intel.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/x86/kernel/cpu/microcode/intel.c | 10 ++-------- |
| 1 file changed, 2 insertions(+), 8 deletions(-) |
| |
| --- a/arch/x86/kernel/cpu/microcode/intel.c |
| +++ b/arch/x86/kernel/cpu/microcode/intel.c |
| @@ -319,12 +319,6 @@ static enum ucode_state __apply_microcod |
| return UCODE_OK; |
| } |
| |
| - /* |
| - * Writeback and invalidate caches before updating microcode to avoid |
| - * internal issues depending on what the microcode is updating. |
| - */ |
| - native_wbinvd(); |
| - |
| /* write microcode via MSR 0x79 */ |
| native_wrmsrl(MSR_IA32_UCODE_WRITE, (unsigned long)mc->bits); |
| |
| @@ -551,7 +545,7 @@ static bool is_blacklisted(unsigned int |
| /* |
| * Late loading on model 79 with microcode revision less than 0x0b000021 |
| * and LLC size per core bigger than 2.5MB may result in a system hang. |
| - * This behavior is documented in item BDF90, #334165 (Intel Xeon |
| + * This behavior is documented in item BDX90, #334165 (Intel Xeon |
| * Processor E7-8800/4800 v4 Product Family). |
| */ |
| if (c->x86 == 6 && |
| @@ -559,7 +553,7 @@ static bool is_blacklisted(unsigned int |
| c->x86_stepping == 0x01 && |
| llc_size_per_core > 2621440 && |
| c->microcode < 0x0b000021) { |
| - pr_err_once("Erratum BDF90: late loading with revision < 0x0b000021 (0x%x) disabled.\n", c->microcode); |
| + pr_err_once("Erratum BDX90: late loading with revision < 0x0b000021 (0x%x) disabled.\n", c->microcode); |
| pr_err_once("Please consider either early loading through initrd/built-in or a potential BIOS update.\n"); |
| return true; |
| } |