diff options
author | Damian Nikodem <damian.nikodem@intel.com> | 2019-09-11 16:23:01 +0800 |
---|---|---|
committer | Eric Dong <eric.dong@intel.com> | 2019-09-20 14:37:42 +0800 |
commit | 832c4c7ad6109847b2e7fdcca6bf539106523c61 (patch) | |
tree | 3e27ee777af5cedc800024e6e495a67fc3031a92 | |
parent | d7bf973e43ad949706f936f61cd6be8e63ce136f (diff) | |
download | edk2-832c4c7ad6109847b2e7fdcca6bf539106523c61.tar.gz edk2-832c4c7ad6109847b2e7fdcca6bf539106523c61.tar.bz2 edk2-832c4c7ad6109847b2e7fdcca6bf539106523c61.zip |
UefiCpuPkg: Fix potential spinLock issue in SmmStartupThisAp
Due to needs a tackling the deficiency of the AP API, it's necessary to
ensure that in non-blocking mode previous AP executed command is
finished before starting new one.
To remedy above:
1) execute AcquireSpinLock instead AcquireSpinLockOrFail - this will
ensure time "window" to eliminate potential race condition between
BSP and AP spinLock release in non-blocking mode.
This also will eliminate possibility to start executing new AP
function before last is finished.
2) remove returns EFI_STATUS - EFI_NOT_READY - in new scenario returned
status is not necessary to caller.
Signed-off-by: Damian Nikodem <damian.nikodem@intel.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Cc: Benjamin You <benjamin.you@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Krzysztof Rusocki <krzysztof.rusocki@intel.com>
-rw-r--r-- | UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 9 |
1 files changed, 2 insertions, 7 deletions
diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c index d8d2b6f444..0685637c2b 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c @@ -1235,14 +1235,9 @@ InternalSmmStartupThisAp ( return EFI_INVALID_PARAMETER;
}
- if (Token == NULL) {
- AcquireSpinLock (mSmmMpSyncData->CpuData[CpuIndex].Busy);
- } else {
- if (!AcquireSpinLockOrFail (mSmmMpSyncData->CpuData[CpuIndex].Busy)) {
- DEBUG((DEBUG_ERROR, "Can't acquire mSmmMpSyncData->CpuData[%d].Busy\n", CpuIndex));
- return EFI_NOT_READY;
- }
+ AcquireSpinLock (mSmmMpSyncData->CpuData[CpuIndex].Busy);
+ if (Token != NULL) {
*Token = (MM_COMPLETION) CreateToken ();
}
|