]> git.baikalelectronics.ru Git - kernel.git/commitdiff
x86/microcode: Request microcode on the BSP
authorBorislav Petkov <bp@suse.de>
Wed, 28 Feb 2018 10:28:45 +0000 (11:28 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 8 Mar 2018 09:19:26 +0000 (10:19 +0100)
... 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

index fa32cb3dcca5ab474cc490048e093cea0e97cf69..5dd157d48606cc157513badc818df9ce6269a695 100644 (file)
@@ -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, &microcode_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, &microcode_pdev->dev, true);
+       if (tmp_ret != UCODE_OK)
+               return size;
+
        get_online_cpus();
 
        ret = check_online_cpus();