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 | |
... 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 | |
--- | |
arch/x86/kernel/cpu/microcode/core.c | 11 +++++------ | |
1 file changed, 5 insertions(+), 6 deletions(-) | |
diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c | |
index fa32cb3..5dd157d 100644 | |
--- 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 device *dev, | |
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 device *dev, | |
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(); | |
-- | |
cgit v1.1 | |