x86/microcode: Clarify the late load logic

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Thomas Gleixner <tglx@xxxxxxxxxxxxx>

commit 6f059e634dcd0d725854514c94c114bbdd83950d upstream

reload_store() is way too complicated. Split the inner workings out and
make the following enhancements:

 - Taint the kernel only when the microcode was actually updated. If. e.g.
   the rendezvous fails, then nothing happened and there is no reason for
   tainting.

 - Return useful error codes

Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
Signed-off-by: Borislav Petkov (AMD) <bp@xxxxxxxxx>
Reviewed-by: Nikolay Borisov <nik.borisov@xxxxxxxx>
Link: https://lore.kernel.org/r/20231002115903.145048840@xxxxxxxxxxxxx
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
---
 arch/x86/kernel/cpu/microcode/core.c |   41 ++++++++++++++++-------------------
 1 file changed, 19 insertions(+), 22 deletions(-)

--- a/arch/x86/kernel/cpu/microcode/core.c
+++ b/arch/x86/kernel/cpu/microcode/core.c
@@ -362,11 +362,11 @@ static int microcode_reload_late(void)
 		pr_info("Reload succeeded, microcode revision: 0x%x -> 0x%x\n",
 			old, boot_cpu_data.microcode);
 		microcode_check(&prev_info);
+		add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_STILL_OK);
 	} else {
 		pr_info("Reload failed, current microcode revision: 0x%x\n",
 			boot_cpu_data.microcode);
 	}
-
 	return ret;
 }
 
@@ -399,40 +399,37 @@ static bool ensure_cpus_are_online(void)
 	return true;
 }
 
+static int ucode_load_late_locked(void)
+{
+	if (!ensure_cpus_are_online())
+		return -EBUSY;
+
+	switch (microcode_ops->request_microcode_fw(0, &microcode_pdev->dev)) {
+	case UCODE_NEW:
+		return microcode_reload_late();
+	case UCODE_NFOUND:
+		return -ENOENT;
+	default:
+		return -EBADFD;
+	}
+}
+
 static ssize_t reload_store(struct device *dev,
 			    struct device_attribute *attr,
 			    const char *buf, size_t size)
 {
-	enum ucode_state tmp_ret = UCODE_OK;
-	int bsp = boot_cpu_data.cpu_index;
 	unsigned long val;
-	ssize_t ret = 0;
+	ssize_t ret;
 
 	ret = kstrtoul(buf, 0, &val);
 	if (ret || val != 1)
 		return -EINVAL;
 
 	cpus_read_lock();
-
-	if (!ensure_cpus_are_online()) {
-		ret = -EBUSY;
-		goto put;
-	}
-
-	tmp_ret = microcode_ops->request_microcode_fw(bsp, &microcode_pdev->dev);
-	if (tmp_ret != UCODE_NEW)
-		goto put;
-
-	ret = microcode_reload_late();
-put:
+	ret = ucode_load_late_locked();
 	cpus_read_unlock();
 
-	if (ret == 0)
-		ret = size;
-
-	add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_STILL_OK);
-
-	return ret;
+	return ret ? : size;
 }
 
 static DEVICE_ATTR_WO(reload);


Patches currently in stable-queue which might be from tglx@xxxxxxxxxxxxx are

queue-6.6/x86-microcode-intel-cleanup-code-further.patch
queue-6.6/x86-microcode-intel-simplify-scan_microcode.patch
queue-6.6/x86-microcode-mop-up-early-loading-leftovers.patch
queue-6.6/x86-microcode-provide-new-control-functions.patch
queue-6.6/x86-microcode-intel-save-the-microcode-only-after-a-successful-late-load.patch
queue-6.6/x86-microcode-32-move-early-loading-after-paging-enable.patch
queue-6.6/x86-microcode-intel-simplify-early-loading.patch
queue-6.6/x86-microcode-add-per-cpu-control-field.patch
queue-6.6/x86-microcode-add-per-cpu-result-state.patch
queue-6.6/x86-microcode-prepare-for-minimal-revision-check.patch
queue-6.6/x86-microcode-intel-simplify-and-rename-generic_load_microcode.patch
queue-6.6/x86-microcode-amd-get-rid-of-the-_load_microcode_amd-forward-declaration.patch
queue-6.6/x86-microcode-handle-offline-cpus-correctly.patch
queue-6.6/x86-microcode-get-rid-of-the-schedule-work-indirection.patch
queue-6.6/x86-microcode-intel-rework-intel_cpu_collect_info.patch
queue-6.6/x86-microcode-amd-use-cached-microcode-for-ap-load.patch
queue-6.6/x86-microcode-replace-the-all-in-one-rendevous-handler.patch
queue-6.6/x86-microcode-amd-add-get_patch_level.patch
queue-6.6/x86-apic-provide-apic_force_nmi_on_cpu.patch
queue-6.6/sched-core-prevent-rescheduling-when-interrupts-are-disabled.patch
queue-6.6/x86-cpu-fix-warm-boot-hang-regression-on-amd-sc1100-.patch
queue-6.6/x86-microcode-intel-rework-intel_find_matching_signature.patch
queue-6.6/x86-microcode-remove-pointless-apply-invocation.patch
queue-6.6/x86-microcode-intel-reuse-intel_cpu_collect_info.patch
queue-6.6/x86-microcode-amd-use-correct-per-cpu-ucode_cpu_info.patch
queue-6.6/x86-microcode-amd-cache-builtin-initrd-microcode-early.patch
queue-6.6/x86-microcode-protect-against-instrumentation.patch
queue-6.6/x86-microcode-clean-up-mc_cpu_down_prep.patch
queue-6.6/x86-microcode-amd-cache-builtin-microcode-too.patch
queue-6.6/x86-microcode-amd-merge-early_apply_microcode-into-its-single-callsite.patch
queue-6.6/x86-microcode-rendezvous-and-load-in-nmi.patch
queue-6.6/x86-microcode-intel-rip-out-mixed-stepping-support-for-intel-cpus.patch
queue-6.6/x86-microcode-intel-unify-microcode-apply-functions.patch
queue-6.6/intel_idle-handle-older-cpus-which-stop-the-tsc-in-deeper-c-states-correctly.patch
queue-6.6/x86-microcode-intel-switch-to-kvmalloc.patch
queue-6.6/x86-microcode-clarify-the-late-load-logic.patch
queue-6.6/x86-microcode-sanitize-__wait_for_cpus.patch
queue-6.6/x86-microcode-rework-early-revisions-reporting.patch
queue-6.6/rcuref-plug-slowpath-race-in-rcuref_put.patch
queue-6.6/x86-microcode-handle-nosmt-correctly.patch




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux