From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by mx.groups.io with SMTP id smtpd.web11.3375.1574921840839820554 for ; Wed, 27 Nov 2019 22:17:21 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.88, mailfrom: eric.dong@intel.com) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Nov 2019 22:17:20 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,252,1571727600"; d="scan'208";a="234340508" Received: from ydong10-desktop.ccr.corp.intel.com ([10.239.158.133]) by fmsmga004.fm.intel.com with ESMTP; 27 Nov 2019 22:17:18 -0800 From: "Dong, Eric" To: devel@edk2.groups.io Cc: Ray Ni , Laszlo Ersek Subject: [PATCH v2] UefiCpuPkg/PiSmmCpuDxeSmm: Avoid allocate Token every time. Date: Thu, 28 Nov 2019 14:17:16 +0800 Message-Id: <20191128061716.196-1-eric.dong@intel.com> X-Mailer: git-send-email 2.23.0.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable v2 changes:=0D Minor update based on comments.=0D =0D v1 changes: REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2388 Current logic allocate Token every time when need to use it. The logic caused SMI latency raised to very high. Update logic to allocate Token buffer at driver's entry point. Later use the token from the allocated token buffer. Only when all the buffer have been used, then need to allocate new buffer. Signed-off-by: Eric Dong Cc: Ray Ni Cc: Laszlo Ersek --- UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 56 ++++++++++++++++++++-- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 16 +++++++ 2 files changed, 68 insertions(+), 4 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxe= Smm/MpService.c index d8d2b6f444..4632e5b0c2 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c @@ -492,6 +492,23 @@ FreeTokens ( {=0D LIST_ENTRY *Link;=0D PROCEDURE_TOKEN *ProcToken;=0D + TOKEN_BUFFER *TokenBuf;=0D +=0D + //=0D + // Not free the buffer, just clear the UsedTokenNum. In order to=0D + // avoid later trig allcate action again when need to use token.=0D + //=0D + gSmmCpuPrivate->UsedTokenNum =3D 0;=0D +=0D + Link =3D GetFirstNode (&gSmmCpuPrivate->OldTokenBufList);=0D + while (!IsNull (&gSmmCpuPrivate->OldTokenBufList, Link)) {=0D + TokenBuf =3D TOKEN_BUFFER_FROM_LINK (Link);=0D +=0D + Link =3D RemoveEntryList (&TokenBuf->Link);=0D + =0D + FreePool (TokenBuf->Buffer);=0D + FreePool (TokenBuf);=0D + }=0D =0D while (!IsListEmpty (&gSmmCpuPrivate->TokenList)) {=0D Link =3D GetFirstNode (&gSmmCpuPrivate->TokenList);=0D @@ -499,7 +516,6 @@ FreeTokens ( =0D RemoveEntryList (&ProcToken->Link);=0D =0D - FreePool ((VOID *)ProcToken->ProcedureToken);=0D FreePool (ProcToken);=0D }=0D }=0D @@ -1115,13 +1131,35 @@ CreateToken ( VOID=0D )=0D {=0D - PROCEDURE_TOKEN *ProcToken;=0D + PROCEDURE_TOKEN *ProcToken;=0D SPIN_LOCK *CpuToken;=0D UINTN SpinLockSize;=0D + TOKEN_BUFFER *TokenBuf;=0D =0D SpinLockSize =3D GetSpinLockProperties ();=0D - CpuToken =3D AllocatePool (SpinLockSize);=0D - ASSERT (CpuToken !=3D NULL);=0D +=0D + if (gSmmCpuPrivate->UsedTokenNum =3D=3D MAX_PRE_RESERVE_TOKEN_COUNT) {=0D + DEBUG((DEBUG_INFO, "CpuSmm: No free token buffer, allocate new buffer!= \n"));=0D +=0D + //=0D + // Record current token buffer for later free action usage.=0D + // Current used token buffer not in this list.=0D + //=0D + TokenBuf =3D AllocatePool (sizeof (TOKEN_BUFFER));=0D + ASSERT (TokenBuf !=3D NULL);=0D + TokenBuf->Signature =3D TOKEN_BUFFER_SIGNATURE;=0D + TokenBuf->Buffer =3D gSmmCpuPrivate->CurrentTokenBuf;=0D +=0D + InsertTailList (&gSmmCpuPrivate->OldTokenBufList, &TokenBuf->Link);=0D +=0D + gSmmCpuPrivate->CurrentTokenBuf =3D AllocateZeroPool (SpinLockSize *= MAX_PRE_RESERVE_TOKEN_COUNT);=0D + ASSERT (gSmmCpuPrivate->CurrentTokenBuf !=3D NULL);=0D + gSmmCpuPrivate->UsedTokenNum =3D 0;=0D + }=0D +=0D + CpuToken =3D (SPIN_LOCK *)(gSmmCpuPrivate->CurrentTokenBuf + SpinLockSiz= e * gSmmCpuPrivate->UsedTokenNum);=0D + gSmmCpuPrivate->UsedTokenNum++;=0D +=0D InitializeSpinLock (CpuToken);=0D AcquireSpinLock (CpuToken);=0D =0D @@ -1737,10 +1775,20 @@ InitializeDataForMmMp ( VOID=0D )=0D {=0D + UINTN SpinLockSize;=0D +=0D + SpinLockSize =3D GetSpinLockProperties ();=0D + DEBUG((DEBUG_INFO, "CpuSmm: SpinLock Size =3D 0x%x\n", SpinLockSize));=0D +=0D + gSmmCpuPrivate->CurrentTokenBuf =3D AllocateZeroPool (SpinLockSize * MAX= _PRE_RESERVE_TOKEN_COUNT);=0D + ASSERT (gSmmCpuPrivate->CurrentTokenBuf !=3D NULL);=0D + gSmmCpuPrivate->UsedTokenNum =3D 0;=0D +=0D gSmmCpuPrivate->ApWrapperFunc =3D AllocatePool (sizeof (PROCEDURE_WRAPPE= R) * gSmmCpuPrivate->SmmCoreEntryContext.NumberOfCpus);=0D ASSERT (gSmmCpuPrivate->ApWrapperFunc !=3D NULL);=0D =0D InitializeListHead (&gSmmCpuPrivate->TokenList);=0D + InitializeListHead (&gSmmCpuPrivate->OldTokenBufList);=0D }=0D =0D /**=0D diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h b/UefiCpuPkg/PiSmmC= puDxeSmm/PiSmmCpuDxeSmm.h index 8c29f1a558..36fd0dae92 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h @@ -198,6 +198,7 @@ typedef UINT32 SMM_CPU_ARR= IVAL_EXCEPTIONS; #define ARRIVAL_EXCEPTION_DELAYED 0x2=0D #define ARRIVAL_EXCEPTION_SMI_DISABLED 0x4=0D =0D +#define MAX_PRE_RESERVE_TOKEN_COUNT 0x512=0D //=0D // Wrapper used to convert EFI_AP_PROCEDURE2 and EFI_AP_PROCEDURE.=0D //=0D @@ -217,6 +218,17 @@ typedef struct { =0D #define PROCEDURE_TOKEN_FROM_LINK(a) CR (a, PROCEDURE_TOKEN, Link, PROCED= URE_TOKEN_SIGNATURE)=0D =0D +#define TOKEN_BUFFER_SIGNATURE SIGNATURE_32 ('T', 'K', 'B', 'S')=0D +=0D +typedef struct {=0D + UINTN Signature;=0D + LIST_ENTRY Link;=0D +=0D + UINT8 *Buffer;=0D +} TOKEN_BUFFER;=0D +=0D +#define TOKEN_BUFFER_FROM_LINK(a) CR (a, TOKEN_BUFFER, Link, TOKEN_BUFFER= _SIGNATURE)=0D +=0D //=0D // Private structure for the SMM CPU module that is stored in DXE Runtime = memory=0D // Contains the SMM Configuration Protocols that is produced.=0D @@ -243,6 +255,10 @@ typedef struct { PROCEDURE_WRAPPER *ApWrapperFunc;=0D LIST_ENTRY TokenList;=0D =0D + LIST_ENTRY OldTokenBufList;=0D +=0D + UINT8 *CurrentTokenBuf;=0D + UINTN UsedTokenNum; // Only record tokens = used in CurrentTokenBuf.=0D } SMM_CPU_PRIVATE_DATA;=0D =0D extern SMM_CPU_PRIVATE_DATA *gSmmCpuPrivate;=0D --=20 2.23.0.windows.1