P-SEAMLDR requires every CPU to call SEAMLDR.INSTALL during updates. So, every CPU should be online during updates. Check if all CPUs are online and abort the update if any CPU is offline at the very beginning. Without this check, P-SEAMLDR will report failure at a later phase where the old TDX module is gone and TDs have to be killed. Hold cpus_read_lock to avoid races between CPU hotplug and TDX Module updates. Signed-off-by: Chao Gao Reviewed-by: Xu Yilun Reviewed-by: Tony Lindgren --- arch/x86/virt/vmx/tdx/seamldr.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arch/x86/virt/vmx/tdx/seamldr.c b/arch/x86/virt/vmx/tdx/seamldr.c index 4d40b08f9bed..694243f1f220 100644 --- a/arch/x86/virt/vmx/tdx/seamldr.c +++ b/arch/x86/virt/vmx/tdx/seamldr.c @@ -6,6 +6,8 @@ */ #define pr_fmt(fmt) "seamldr: " fmt +#include +#include #include #include @@ -53,6 +55,12 @@ int seamldr_install_module(const u8 *data, u32 size) if (WARN_ON_ONCE(!is_vmalloc_addr(data))) return -EINVAL; + guard(cpus_read_lock)(); + if (!cpumask_equal(cpu_online_mask, cpu_present_mask)) { + pr_err("Cannot update the TDX Module if any CPU is offline\n"); + return -EBUSY; + } + /* TODO: Update TDX Module here */ return 0; } -- 2.47.3