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>
This commit is contained in:
Damian Nikodem 2019-09-11 16:23:01 +08:00 committed by Eric Dong
parent d7bf973e43
commit 832c4c7ad6
1 changed files with 2 additions and 7 deletions

View File

@ -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 ();
}