x86/ucode: Fix error paths control_thread_fn()

These two early exits skipped re-enabling the watchdog, restoring the NMI
callback, and clearing the nmi_patch global pointer.  Always execute the tail
of the function on the way out.

Fixes: 8dd4dfa92d ("x86/microcode: Synchronize late microcode loading")
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Sergey Dyasli <sergey.dyasli@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
master commit: fc2e1f3aad
master date: 2023-03-28 11:57:56 +0100
This commit is contained in:
Andrew Cooper authored and Jan Beulich committed 2023-03-31 08:40:56 +02:00
1 parent b1022b65de
commit 0f81c5a2c8
1 file changed
+3 -6
+3 -6
View File
@@ -488,10 +488,7 @@ static int control_thread_fn(const struct microcode_patch *patch)
ret = wait_for_condition(wait_cpu_callin, num_online_cpus(),
MICROCODE_CALLIN_TIMEOUT_US);
if ( ret )
{
set_state(LOADING_EXIT);
return ret;
}
goto out;
/* Control thread loads ucode first while others are in NMI handler. */
ret = microcode_ops->apply_microcode(patch);
@@ -503,8 +500,7 @@ static int control_thread_fn(const struct microcode_patch *patch)
{
printk(XENLOG_ERR
"Late loading aborted: CPU%u failed to update ucode\n", cpu);
set_state(LOADING_EXIT);
return ret;
goto out;
}
/* Let primary threads load the given ucode update */
@@ -535,6 +531,7 @@ static int control_thread_fn(const struct microcode_patch *patch)
}
}
out:
/* Mark loading is done to unblock other threads */
set_state(LOADING_EXIT);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.