On 09/03/19 16:57, Damian Nikodem wrote:
> Race condition between APHandler's release of Busy spinlock and
> user-triggered SmmStartupThisAP's acquisition attempt of the Busy spinlock 
> (non-blocking mode).
> 
> UserProc is the user's procedure to execute on an AP.
> UserProcCompletion is the user procedure's completion spinlock.
> All other variables are from EDK2.
> 
> BSP                                          AP
> =====================================================================================
>                                                                               
>          APHandler ()
>                                                                               
>            WaitForSemaphore (Run)
> 
>                                                                  << initial 
> state >>
> 
> AcquireSpinLock (UserProcCompletion)
> SmmStartupThisAp (Procedure)
>   AcquireSpinLockOrFail (Busy)
>   ReleaseSemaphore (Run)
>                                                                               
>            UserProc ()
> DoStuff()                                        DoSomeOtherStuff ()
> 
> AcquireSpinLockOrFail (UserProcCompletion) AcquireSpinLockOrFail 
> (UserProcCompletion)
> 
> ^^ waiting in a loop for user procedure's
>    completion == these fail
> ReleaseSpinLock (UserProcCompletion)       AcquireSpinLockOrFail 
> (UserProcCompletion)
> 
> ^^ this succeeds
> 
> ReleaseSpinLock (UserProcCompletion)
> 
> << return control to the caller and
>    reenter the flow >>>
> 
> AcquireSpinLock (UserProcCompletion)
> SmmStartupThisAp (Procedure)
>   AcquireSpinLockOrFail (Busy)
>   ^^ this wins the race with AP's
>        ReleaseSpinLock and fails;
>                                                                               
>            ReleaseSpinLock (Busy)
>       return EFI_INVALID_PARAMETER;

Sorry, I can't make any sense of this sequence diagram. It seems to have
fallen apart due to formatting or other email issues. For example, if we
have "AP" and "BSP" columns, I would expect every function name to show
up in either.  But APHandler() is to the right of *both* columns.

Please clean up the commit message:
- subject line should be no longer than 74 chars
- continuous text paragraphs should be properly filled, and wrapped at
  74 chars
- the diagram can extend more widely, but it should be a diagram please.

(I'm not as familiar with this code as other UefiCpuPkg reviewers, so I
absolutely depend on the commit message to guide me.)

Thanks
Laszlo

> 
> To remedy, if AcquireSpinLockOrFail (of the Busy spinlock) fails, perform 
> regular AcquireSpinLock -- this eliminates the race condition.
> 
> Signed-off-by: Damian Nikodem <damian.niko...@intel.com>
> Cc: Eric Dong <eric.d...@intel.com>
> Cc: Ray Ni <ray...@intel.com>
> Cc: Benjamin You <benjamin....@intel.com>
> Cc: Laszlo Ersek <ler...@redhat.com>
> Cc: Krzysztof Rusocki <krzysztof.ruso...@intel.com>
> 
> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c 
> b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
> index d8d2b6f444..206e196a76 100644
> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
> @@ -1239,8 +1239,16 @@ InternalSmmStartupThisAp (
>      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;
> +      DEBUG ((DEBUG_INFO, "BSP[%d] finds AP[%d] busy at proc 0x%llX (param 
> 0x%llX), ",
> +        mSmmMpSyncData->BspIndex,
> +        CpuIndex,
> +        *mSmmMpSyncData->CpuData[CpuIndex].Procedure,
> +        (VOID*)mSmmMpSyncData->CpuData[CpuIndex].Parameter));
> +      DEBUG ((DEBUG_INFO, "new proc 0x%llX (param 0x%llX). Waiting for the 
> previous AP procedure to complete...\n",
> +        Procedure,
> +        ProcArguments));
> +
> +      AcquireSpinLock (mSmmMpSyncData->CpuData[CpuIndex].Busy);
>      }
>  
>      *Token = (MM_COMPLETION) CreateToken ();
> --------------------------------------------------------------------
> 
> Intel Technology Poland sp. z o.o.
> ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII 
> Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 
> 957-07-52-316 | Kapital zakladowy 200.000 PLN.
> 
> Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i 
> moze zawierac informacje poufne. W razie przypadkowego otrzymania tej 
> wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; 
> jakiekolwiek
> przegladanie lub rozpowszechnianie jest zabronione.
> This e-mail and any attachments may contain confidential material for the 
> sole use of the intended recipient(s). If you are not the intended recipient, 
> please contact the sender and delete all copies; any review or distribution by
> others is strictly prohibited.
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#46721): https://edk2.groups.io/g/devel/message/46721
Mute This Topic: https://groups.io/mt/33128825/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to