From 33ebaa6f0d476008ca6ba264657ac37faf63b723 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 29 Aug 2024 09:20:29 +0200 Subject: [PATCH 1/2] OvmfPkg/CpuHotplugSmm: delay SMM exit RH-Author: Gerd Hoffmann RH-MergeRequest: 74: OvmfPkg/CpuHotplugSmm: delay SMM exit RH-Jira: RHEL-56974 RH-Acked-by: Oliver Steffen RH-Commit: [1/1] e1fb3f4db68457ec9f59ca5db47606bf4c34e6c5 (kraxel.rh/centos-src-edk2) Let APs wait until the BSP has completed the register updates to remove the CPU. This makes sure all APs stay in SMM mode until the CPU hot-unplug operation is complete, which in turn makes sure the ACPI lock is released only after the CPU hot-unplug operation is complete. Some background: The CPU hotplug SMI is triggered from an ACPI function which is protected by an ACPI lock. The ACPI function is in the ACPI tables generated by qemu. Signed-off-by: Gerd Hoffmann upstream: submitted (https://github.com/tianocore/edk2/pull/6138) --- OvmfPkg/CpuHotplugSmm/CpuHotplug.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/OvmfPkg/CpuHotplugSmm/CpuHotplug.c b/OvmfPkg/CpuHotplugSmm/CpuHotplug.c index d504163026..5af78211d3 100644 --- a/OvmfPkg/CpuHotplugSmm/CpuHotplug.c +++ b/OvmfPkg/CpuHotplugSmm/CpuHotplug.c @@ -355,6 +355,11 @@ EjectCpu ( // QemuSelector = mCpuHotEjectData->QemuSelectorMap[ProcessorNum]; if (QemuSelector == CPU_EJECT_QEMU_SELECTOR_INVALID) { + /* wait until BSP is done */ + while (mCpuHotEjectData->Handler != NULL) { + CpuPause (); + } + return; } -- 2.39.3