| From cfb52a5a09c8ae3a1dafb44ce549fde5b69e8117 Mon Sep 17 00:00:00 2001 |
| From: Borislav Petkov <bp@suse.de> |
| Date: Wed, 28 Feb 2018 11:28:45 +0100 |
| Subject: x86/microcode: Request microcode on the BSP |
| |
| From: Borislav Petkov <bp@suse.de> |
| |
| commit cfb52a5a09c8ae3a1dafb44ce549fde5b69e8117 upstream. |
| |
| ... so that any newer version can land in the cache and can later be |
| fished out by the application functions. Do that before grabbing the |
| hotplug lock. |
| |
| Signed-off-by: Borislav Petkov <bp@suse.de> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Tested-by: Tom Lendacky <thomas.lendacky@amd.com> |
| Tested-by: Ashok Raj <ashok.raj@intel.com> |
| Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> |
| Cc: Arjan Van De Ven <arjan.van.de.ven@intel.com> |
| Link: https://lkml.kernel.org/r/20180228102846.13447-7-bp@alien8.de |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/kernel/cpu/microcode/core.c | 11 +++++------ |
| 1 file changed, 5 insertions(+), 6 deletions(-) |
| |
| --- a/arch/x86/kernel/cpu/microcode/core.c |
| +++ b/arch/x86/kernel/cpu/microcode/core.c |
| @@ -499,15 +499,10 @@ static int check_online_cpus(void) |
| static enum ucode_state reload_for_cpu(int cpu) |
| { |
| struct ucode_cpu_info *uci = ucode_cpu_info + cpu; |
| - enum ucode_state ustate; |
| |
| if (!uci->valid) |
| return UCODE_OK; |
| |
| - ustate = microcode_ops->request_microcode_fw(cpu, µcode_pdev->dev, true); |
| - if (ustate != UCODE_OK) |
| - return ustate; |
| - |
| return apply_microcode_on_target(cpu); |
| } |
| |
| @@ -515,11 +510,11 @@ static ssize_t reload_store(struct devic |
| struct device_attribute *attr, |
| const char *buf, size_t size) |
| { |
| + int cpu, bsp = boot_cpu_data.cpu_index; |
| enum ucode_state tmp_ret = UCODE_OK; |
| bool do_callback = false; |
| unsigned long val; |
| ssize_t ret = 0; |
| - int cpu; |
| |
| ret = kstrtoul(buf, 0, &val); |
| if (ret) |
| @@ -528,6 +523,10 @@ static ssize_t reload_store(struct devic |
| if (val != 1) |
| return size; |
| |
| + tmp_ret = microcode_ops->request_microcode_fw(bsp, µcode_pdev->dev, true); |
| + if (tmp_ret != UCODE_OK) |
| + return size; |
| + |
| get_online_cpus(); |
| |
| ret = check_online_cpus(); |