|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] x86/ucode: Fold microcode_update_cpu() and fix error handling
commit 502478bc1d9d2f1326a2fef5b73568dbb0cde908
Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Wed Nov 6 15:22:54 2024 +0000
Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Tue Nov 12 19:16:53 2024 +0000
x86/ucode: Fold microcode_update_cpu() and fix error handling
Fold microcode_update_cpu() into its single remaining caller. Explain why
we
bother grabbing the microcode revision even if we can't load microcode.
This avoids a double collect_cpu_info() call on each AP.
Furthermore, delete the -EIO path.
A hard error updating a single CPU's microcode on AP bringup or S3 resume is
definitely bad (needing special investigation), but freeing the cache is
about
the worst possible action we can take in response; it prevents subsequent
APs
from taking an update they might have accepted.
While we expect a homogeneous system with respect to microcode
applicability,
this doesn't mean that all cores behave identically when given the same
blob.
e.g. one failure mode seen in practice is a checksum failure caused by a bad
SRAM cell.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
---
xen/arch/x86/cpu/microcode/core.c | 47 ++++++++++++---------------------------
1 file changed, 14 insertions(+), 33 deletions(-)
diff --git a/xen/arch/x86/cpu/microcode/core.c
b/xen/arch/x86/cpu/microcode/core.c
index 81a772cb2b..fd4b08b453 100644
--- a/xen/arch/x86/cpu/microcode/core.c
+++ b/xen/arch/x86/cpu/microcode/core.c
@@ -263,38 +263,6 @@ static bool cf_check wait_cpu_callout(unsigned int nr)
return atomic_read(&cpu_out) >= nr;
}
-/*
- * Load a microcode update to current CPU.
- *
- * If no patch is provided, the cached patch will be loaded. Microcode update
- * during APs bringup and CPU resuming falls into this case.
- */
-static int microcode_update_cpu(const struct microcode_patch *patch,
- unsigned int flags)
-{
- int err;
-
- alternative_vcall(ucode_ops.collect_cpu_info);
-
- spin_lock(µcode_mutex);
- if ( microcode_cache )
- {
- err = alternative_call(ucode_ops.apply_microcode, microcode_cache,
- flags);
- if ( err == -EIO )
- {
- microcode_free_patch(microcode_cache);
- microcode_cache = NULL;
- }
- }
- else
- /* No patch to update */
- err = -ENOENT;
- spin_unlock(µcode_mutex);
-
- return err;
-}
-
static bool wait_for_state(typeof(loading_state) state)
{
typeof(loading_state) cur_state;
@@ -700,13 +668,26 @@ int microcode_update(XEN_GUEST_HANDLE(const_void) buf,
/* Load a cached update to current cpu */
int microcode_update_one(void)
{
+ int rc;
+
+ /*
+ * This path is used for APs and S3 resume. Read the microcode revision
+ * if possible, even if we can't load microcode.
+ */
if ( ucode_ops.collect_cpu_info )
alternative_vcall(ucode_ops.collect_cpu_info);
if ( !ucode_ops.apply_microcode )
return -EOPNOTSUPP;
- return microcode_update_cpu(NULL, 0);
+ spin_lock(µcode_mutex);
+ if ( microcode_cache )
+ rc = alternative_call(ucode_ops.apply_microcode, microcode_cache, 0);
+ else
+ rc = -ENOENT;
+ spin_unlock(µcode_mutex);
+
+ return rc;
}
/*
--
generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |