Blame linux-kernel-patches/13-09e182d17e8891dd73baba961a0f5a82e9274c97.patch

Packit Service c9fe53
From 09e182d17e8891dd73baba961a0f5a82e9274c97 Mon Sep 17 00:00:00 2001
Packit Service c9fe53
From: Borislav Petkov <bp@suse.de>
Packit Service c9fe53
Date: Sat, 21 Apr 2018 10:19:30 +0200
Packit Service c9fe53
Subject: x86/microcode: Do not exit early from __reload_late()
Packit Service c9fe53

Packit Service c9fe53
Vitezslav reported a case where the
Packit Service c9fe53

Packit Service c9fe53
  "Timeout during microcode update!"
Packit Service c9fe53

Packit Service c9fe53
panic would hit. After a deeper look, it turned out that his .config had
Packit Service c9fe53
CONFIG_HOTPLUG_CPU disabled which practically made save_mc_for_early() a
Packit Service c9fe53
no-op.
Packit Service c9fe53

Packit Service c9fe53
When that happened, the discovered microcode patch wasn't saved into the
Packit Service c9fe53
cache and the late loading path wouldn't find any.
Packit Service c9fe53

Packit Service c9fe53
This, then, lead to early exit from __reload_late() and thus CPUs waiting
Packit Service c9fe53
until the timeout is reached, leading to the panic.
Packit Service c9fe53

Packit Service c9fe53
In hindsight, that function should have been written so it does not return
Packit Service c9fe53
before the post-synchronization. Oh well, I know better now...
Packit Service c9fe53

Packit Service c9fe53
Fixes: bb8c13d61a62 ("x86/microcode: Fix CPU synchronization routine")
Packit Service c9fe53
Reported-by: Vitezslav Samel <vitezslav@samel.cz>
Packit Service c9fe53
Signed-off-by: Borislav Petkov <bp@suse.de>
Packit Service c9fe53
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Packit Service c9fe53
Tested-by: Vitezslav Samel <vitezslav@samel.cz>
Packit Service c9fe53
Tested-by: Ashok Raj <ashok.raj@intel.com>
Packit Service c9fe53
Cc: stable@vger.kernel.org
Packit Service c9fe53
Link: http://lkml.kernel.org/r/20180418081140.GA2439@pc11.op.pod.cz
Packit Service c9fe53
Link: https://lkml.kernel.org/r/20180421081930.15741-2-bp@alien8.de
Packit Service c9fe53
---
Packit Service c9fe53
 arch/x86/kernel/cpu/microcode/core.c | 6 ++----
Packit Service c9fe53
 1 file changed, 2 insertions(+), 4 deletions(-)
Packit Service c9fe53

Packit Service c9fe53
diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c
Packit Service c9fe53
index 10c4fc2..77e2013 100644
Packit Service c9fe53
--- a/arch/x86/kernel/cpu/microcode/core.c
Packit Service c9fe53
+++ b/arch/x86/kernel/cpu/microcode/core.c
Packit Service c9fe53
@@ -564,14 +564,12 @@ static int __reload_late(void *info)
Packit Service c9fe53
 	apply_microcode_local(&err;;
Packit Service c9fe53
 	spin_unlock(&update_lock);
Packit Service c9fe53
 
Packit Service c9fe53
+	/* siblings return UCODE_OK because their engine got updated already */
Packit Service c9fe53
 	if (err > UCODE_NFOUND) {
Packit Service c9fe53
 		pr_warn("Error reloading microcode on CPU %d\n", cpu);
Packit Service c9fe53
-		return -1;
Packit Service c9fe53
-	/* siblings return UCODE_OK because their engine got updated already */
Packit Service c9fe53
+		ret = -1;
Packit Service c9fe53
 	} else if (err == UCODE_UPDATED || err == UCODE_OK) {
Packit Service c9fe53
 		ret = 1;
Packit Service c9fe53
-	} else {
Packit Service c9fe53
-		return ret;
Packit Service c9fe53
 	}
Packit Service c9fe53
 
Packit Service c9fe53
 	/*
Packit Service c9fe53
-- 
Packit Service c9fe53
cgit v1.1
Packit Service c9fe53