diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c index 93cac5e4fa..305bffa9bc 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c @@ -441,7 +441,6 @@ ResetTokens ( ProcToken = PROCEDURE_TOKEN_FROM_LINK (Link); ProcToken->RunningApCount = 0; - ProcToken->Used = FALSE; // // Check the spinlock status and release it if not released yet. @@ -1049,10 +1048,13 @@ IsTokenInUse ( } Link = GetFirstNode (&gSmmCpuPrivate->TokenList); - while (!IsNull (&gSmmCpuPrivate->TokenList, Link)) { + // + // Only search used tokens. + // + while (Link != gSmmCpuPrivate->FirstFreeToken) { ProcToken = PROCEDURE_TOKEN_FROM_LINK (Link); - if (ProcToken->Used && ProcToken->SpinLock == Token) { + if (ProcToken->SpinLock == Token) { return TRUE; } @@ -1104,7 +1106,6 @@ AllocateTokenBuffer ( ProcTokens[Index].Signature = PROCEDURE_TOKEN_SIGNATURE; ProcTokens[Index].SpinLock = SpinLock; - ProcTokens[Index].Used = FALSE; ProcTokens[Index].RunningApCount = 0; InsertTailList (&gSmmCpuPrivate->TokenList, &ProcTokens[Index].Link); @@ -1140,7 +1141,6 @@ GetFreeToken ( NewToken = PROCEDURE_TOKEN_FROM_LINK (gSmmCpuPrivate->FirstFreeToken); gSmmCpuPrivate->FirstFreeToken = GetNextNode (&gSmmCpuPrivate->TokenList, gSmmCpuPrivate->FirstFreeToken); - NewToken->Used = TRUE; NewToken->RunningApCount = RunningApsCount; AcquireSpinLock (NewToken->SpinLock); diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h index c9b3b739f3..7fb3a2d9e4 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h @@ -214,7 +214,6 @@ typedef struct { SPIN_LOCK *SpinLock; volatile UINT32 RunningApCount; - BOOLEAN Used; } PROCEDURE_TOKEN; #define PROCEDURE_TOKEN_FROM_LINK(a) CR (a, PROCEDURE_TOKEN, Link, PROCEDURE_TOKEN_SIGNATURE)