I don't want to break the community rule but somehow "git send-email" cannot
send out the V3 patch out.
To avoid reviewers spending time reviewing v2 patch, I have to send out the v3
as attachment ASAP.
Meanwhile, I will investigate what happened to my system and avoid sending
attachments in future.
Thanks,
Ray
> -Original Message-
> From: devel@edk2.groups.io On Behalf Of Ni, Ray
> Sent: Tuesday, March 9, 2021 4:58 PM
> To: devel@edk2.groups.io
> Cc: Dong, Eric ; Laszlo Ersek ;
> Kumar, Rahul1
> Subject: [edk2-devel] [PATCH v2] UefiCpuPkg/PiSmmCpu: Don't allocate
> Token for SmmStartupThisAp
>
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3199
>
> When Token points to mSmmStartupThisApToken, this routine is called
> from SmmStartupThisAp() in non-blocking mode due to
> PcdCpuSmmBlockStartupThisAp == FALSE.
>
> In this case, caller wants to startup AP procedure in non-blocking
> mode and cannot get the completion status from the Token because there
> is no way to return the Token to caller from SmmStartupThisAp().
> Caller needs to use its specific way to query the completion status.
>
> There is no need to allocate a token for such case so the 3 overheads
> can be avoided:
> 1. Call AllocateTokenBuffer() when there is no free token.
> 2. Get a free token from the token buffer.
> 3. Call ReleaseToken() in APHandler().
>
> Signed-off-by: Ray Ni
> Cc: Eric Dong
> Reviewed-by: Laszlo Ersek
> Cc: Rahul Kumar
> ---
> UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 27
> ---
> 1 file changed, 20 insertions(+), 7 deletions(-)
>
> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
> b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
> index 6227b2428a..91452ec398 100644
> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
> @@ -1,7 +1,7 @@
> /** @file
>
> SMM MP service implementation
>
>
>
> -Copyright (c) 2009 - 2020, Intel Corporation. All rights reserved.
>
> +Copyright (c) 2009 - 2021, Intel Corporation. All rights reserved.
>
> Copyright (c) 2017, AMD Incorporated. All rights reserved.
>
>
>
> SPDX-License-Identifier: BSD-2-Clause-Patent
>
> @@ -22,6 +22,7 @@ UINTN mSemaphoreSize;
> SPIN_LOCK *mPFLock = NULL;
>
> SMM_CPU_SYNC_MODE mCpuSmmSyncMode;
>
> BOOLEAN mMachineCheckSupported = FALSE;
>
> +MM_COMPLETION mSmmStartupThisApToken;
>
>
>
> extern UINTN mSmmShadowStackSize;
>
>
>
> @@ -1240,9 +1241,23 @@ InternalSmmStartupThisAp (
>mSmmMpSyncData->CpuData[CpuIndex].Procedure = Procedure;
>
>mSmmMpSyncData->CpuData[CpuIndex].Parameter = ProcArguments;
>
>if (Token != NULL) {
>
> -ProcToken= GetFreeToken (1);
>
> -mSmmMpSyncData->CpuData[CpuIndex].Token = ProcToken;
>
> -*Token = (MM_COMPLETION)ProcToken->SpinLock;
>
> +if (Token != ) {
>
> + //
>
> + // When Token points to mSmmStartupThisApToken, this routine is
> called
>
> + // from SmmStartupThisAp() in non-blocking mode
> (PcdCpuSmmBlockStartupThisAp == FALSE).
>
> + //
>
> + // In this case, caller wants to startup AP procedure in non-blocking
>
> + // mode and cannot get the completion status from the Token because
> there
>
> + // is no way to return the Token to caller from SmmStartupThisAp().
>
> + // Caller needs to use its implementation specific way to query the
> completion status.
>
> + //
>
> + // There is no need to allocate a token for such case so the overhead
> of
> SMRAM and
>
> + // the allocation operation can be avoided.
>
> + //
>
> + ProcToken= GetFreeToken (1);
>
> + mSmmMpSyncData->CpuData[CpuIndex].Token = ProcToken;
>
> + *Token = (MM_COMPLETION)ProcToken->SpinLock;
>
> +}
>
>}
>
>mSmmMpSyncData->CpuData[CpuIndex].Status= CpuStatus;
>
>if (mSmmMpSyncData->CpuData[CpuIndex].Status != NULL) {
>
> @@ -1474,8 +1489,6 @@ SmmStartupThisAp (
>IN OUT VOID *ProcArguments OPTIONAL
>
>)
>
> {
>
> - MM_COMPLETION Token;
>
> -
>
>gSmmCpuPrivate->ApWrapperFunc[CpuIndex].Procedure = Procedure;
>
>gSmmCpuPrivate->ApWrapperFunc[CpuIndex].ProcedureArgument =
> ProcArguments;
>
>
>
> @@ -1486,7 +1499,7 @@ SmmStartupThisAp (
> ProcedureWrapper,
>
> CpuIndex,
>
>