| From bcdf3a18c00f084fe58ca11dc7c2e58c7ee1ae49 Mon Sep 17 00:00:00 2001 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Tue, 17 Oct 2023 23:23:49 +0200 |
| Subject: x86/microcode: Remove pointless apply() invocation |
| |
| From: Thomas Gleixner <tglx@linutronix.de> |
| |
| commit b48b26f992a3828b4ae274669f99ce68451d4904 upstream |
| |
| Microcode is applied on the APs during early bringup. There is no point |
| in trying to apply the microcode again during the hotplug operations and |
| neither at the point where the microcode device is initialized. |
| |
| Collect CPU info and microcode revision in setup_online_cpu() for now. |
| This will move to the CPU hotplug callback later. |
| |
| [ bp: Leave the starting notifier for the following scenario: |
| |
| - boot, late load, suspend to disk, resume |
| |
| without the starting notifier, only the last core manages to update the |
| microcode upon resume: |
| |
| # rdmsr -a 0x8b |
| 10000bf |
| 10000bf |
| 10000bf |
| 10000bf |
| 10000bf |
| 10000dc <---- |
| |
| This is on an AMD F10h machine. |
| |
| For the future, one should check whether potential unification of |
| the CPU init path could cover the resume path too so that this can |
| be simplified even more. |
| |
| tglx: This is caused by the odd handling of APs which try to find the |
| microcode blob in builtin or initrd instead of caching the microcode |
| blob during early init before the APs are brought up. Will be cleaned |
| up in a later step. ] |
| |
| Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Link: https://lore.kernel.org/r/20231017211723.018821624@linutronix.de |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/x86/kernel/cpu/microcode/core.c | 23 ++++++----------------- |
| 1 file changed, 6 insertions(+), 17 deletions(-) |
| |
| --- a/arch/x86/kernel/cpu/microcode/core.c |
| +++ b/arch/x86/kernel/cpu/microcode/core.c |
| @@ -493,17 +493,6 @@ static void microcode_fini_cpu(int cpu) |
| microcode_ops->microcode_fini_cpu(cpu); |
| } |
| |
| -static enum ucode_state microcode_init_cpu(int cpu) |
| -{ |
| - struct ucode_cpu_info *uci = ucode_cpu_info + cpu; |
| - |
| - memset(uci, 0, sizeof(*uci)); |
| - |
| - microcode_ops->collect_cpu_info(cpu, &uci->cpu_sig); |
| - |
| - return microcode_ops->apply_microcode(cpu); |
| -} |
| - |
| /** |
| * microcode_bsp_resume - Update boot CPU microcode during resume. |
| */ |
| @@ -558,14 +547,14 @@ static int mc_cpu_down_prep(unsigned int |
| static void setup_online_cpu(struct work_struct *work) |
| { |
| int cpu = smp_processor_id(); |
| - enum ucode_state err; |
| + struct ucode_cpu_info *uci = ucode_cpu_info + cpu; |
| |
| - err = microcode_init_cpu(cpu); |
| - if (err == UCODE_ERROR) { |
| - pr_err("Error applying microcode on CPU%d\n", cpu); |
| - return; |
| - } |
| + memset(uci, 0, sizeof(*uci)); |
| |
| + microcode_ops->collect_cpu_info(cpu, &uci->cpu_sig); |
| + cpu_data(cpu).microcode = uci->cpu_sig.rev; |
| + if (!cpu) |
| + boot_cpu_data.microcode = uci->cpu_sig.rev; |
| mc_cpu_online(cpu); |
| } |
| |