From nobody Tue May 7 01:11:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+51721+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+51721+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1575446742; cv=none; d=zohomail.com; s=zohoarc; b=D+ygiT3ug2JPHRDUuDNMVUOTKDrxNhrzPVvdOawLpoL5nEOIMgQ4xPic/A6wgUrXlNoeNIBZX8+lcqxu0MDDpwcj20rqCO1FJSwQrrPqc9/jSyWpbzwKFccCQHQi9UnWqU5HWRBHg0B6nRoGUOOVhC85xorTmJfRhUrVnurWr5s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1575446742; h=Content-Transfer-Encoding:Cc:Date:From:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Sender:Subject:To; bh=rOKZcL+uiQYbGGG5XtR7vRpYJ9J0or7bD7L/BqSD8Oo=; b=CJKPM4fTpRTKBRZ+WFZaVrgrvR5rTpUstcQ2V2X/6ws59erR9+fgxtkfGe4ipAJEsJSGooDTGI+8ApKqex1tLwv00LVrSD9bTVIQII3f7rkbnwrQF/si5UBmKDDMOVGRYz8+2Mv5ad+mUur2GEkXSdd8SA4m6wk8MOFXHxX2c6I= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+51721+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1575446742575617.95723460806; Wed, 4 Dec 2019 00:05:42 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id J5NZYY1788612xuwPtTlA6xJ; Wed, 04 Dec 2019 00:05:42 -0800 X-Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by mx.groups.io with SMTP id smtpd.web09.959.1575446741413969633 for ; Wed, 04 Dec 2019 00:05:41 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Dec 2019 00:05:35 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,276,1571727600"; d="scan'208";a="208722506" X-Received: from ydong10-desktop.ccr.corp.intel.com ([10.239.158.133]) by fmsmga008.fm.intel.com with ESMTP; 04 Dec 2019 00:05:34 -0800 From: "Dong, Eric" To: devel@edk2.groups.io Cc: Ray Ni , Laszlo Ersek Subject: [edk2-devel] [PATCH] UefiCpuPkg/PiSmmCpuDxeSmm: Avoid allocate Token every time Date: Wed, 4 Dec 2019 16:05:07 +0800 Message-Id: <20191204080507.1316-1-eric.dong@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,eric.dong@intel.com X-Gm-Message-State: tBg2vWCvLJzCO22vt52cyBmYx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1575446742; bh=RAcywWAzzEmpyydA0ooqa33xX21gGynmF4err1exFkw=; h=Cc:Date:From:Reply-To:Subject:To; b=Qdu9yzPz5YDeVX0hRqxS3FfTTH0LTM8hS69Ju3Xx3MhpU5IUz2h2d1pJavjIkPvYNwn pBkKfjFDxL2wjVdQ64TBKpA3St+dFktWRrlQgjAF3t9Iq3x2pRfbZhBlnGAD6gqcCg5KW uraqqo0uJjz5oNEHrJnYjb9M2znalQ13uCc= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2388 Token is new introduced by MM MP Protocol. 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 Acked-by: Laszlo Ersek --- V3 changes: Introduce PCD to control the pre allocated toke buffer size. v2 changes: Minor update based on comments. UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 67 ++++++++++++++++++-- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 15 +++++ UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf | 1 + UefiCpuPkg/UefiCpuPkg.dec | 4 ++ UefiCpuPkg/UefiCpuPkg.uni | 1 + 5 files changed, 84 insertions(+), 4 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxe= Smm/MpService.c index d8d2b6f444..33aad3f3e9 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c @@ -492,6 +492,24 @@ FreeTokens ( { LIST_ENTRY *Link; PROCEDURE_TOKEN *ProcToken; + TOKEN_BUFFER *TokenBuf; + + // + // Not free the buffer, just clear the UsedTokenNum. In order to + // avoid triggering allocate action when we need to use the token, + // do not free the buffer. + // + gSmmCpuPrivate->UsedTokenNum =3D 0; + + Link =3D GetFirstNode (&gSmmCpuPrivate->OldTokenBufList); + while (!IsNull (&gSmmCpuPrivate->OldTokenBufList, Link)) { + TokenBuf =3D TOKEN_BUFFER_FROM_LINK (Link); + + Link =3D RemoveEntryList (&TokenBuf->Link); + + FreePool (TokenBuf->Buffer); + FreePool (TokenBuf); + } =20 while (!IsListEmpty (&gSmmCpuPrivate->TokenList)) { Link =3D GetFirstNode (&gSmmCpuPrivate->TokenList); @@ -499,7 +517,6 @@ FreeTokens ( =20 RemoveEntryList (&ProcToken->Link); =20 - FreePool ((VOID *)ProcToken->ProcedureToken); FreePool (ProcToken); } } @@ -1115,13 +1132,37 @@ CreateToken ( VOID ) { - PROCEDURE_TOKEN *ProcToken; + PROCEDURE_TOKEN *ProcToken; SPIN_LOCK *CpuToken; UINTN SpinLockSize; + TOKEN_BUFFER *TokenBuf; + UINT32 TokenCountPerChunk; =20 SpinLockSize =3D GetSpinLockProperties (); - CpuToken =3D AllocatePool (SpinLockSize); - ASSERT (CpuToken !=3D NULL); + TokenCountPerChunk =3D PcdGet32 (PcdTokenCountPerChunk); + + if (gSmmCpuPrivate->UsedTokenNum =3D=3D TokenCountPerChunk) { + DEBUG ((DEBUG_VERBOSE, "CpuSmm: No free token buffer, allocate new buf= fer!\n")); + + // + // Record current token buffer for later free action usage. + // Current used token buffer not in this list. + // + TokenBuf =3D AllocatePool (sizeof (TOKEN_BUFFER)); + ASSERT (TokenBuf !=3D NULL); + TokenBuf->Signature =3D TOKEN_BUFFER_SIGNATURE; + TokenBuf->Buffer =3D gSmmCpuPrivate->CurrentTokenBuf; + + InsertTailList (&gSmmCpuPrivate->OldTokenBufList, &TokenBuf->Link); + + gSmmCpuPrivate->CurrentTokenBuf =3D AllocatePool (SpinLockSize * Token= CountPerChunk); + ASSERT (gSmmCpuPrivate->CurrentTokenBuf !=3D NULL); + gSmmCpuPrivate->UsedTokenNum =3D 0; + } + + CpuToken =3D (SPIN_LOCK *)(gSmmCpuPrivate->CurrentTokenBuf + SpinLockSiz= e * gSmmCpuPrivate->UsedTokenNum); + gSmmCpuPrivate->UsedTokenNum++; + InitializeSpinLock (CpuToken); AcquireSpinLock (CpuToken); =20 @@ -1737,10 +1778,28 @@ InitializeDataForMmMp ( VOID ) { + UINTN SpinLockSize; + UINT32 TokenCountPerChunk; + + SpinLockSize =3D GetSpinLockProperties (); + TokenCountPerChunk =3D PcdGet32 (PcdTokenCountPerChunk); + ASSERT_EFI_ERROR (TokenCountPerChunk !=3D 0); + if (TokenCountPerChunk =3D=3D 0) { + DEBUG ((EFI_D_ERROR, "PcdTokenCountPerChunk should not be Zero!\n")); + CpuDeadLoop (); + } + DEBUG ((DEBUG_INFO, "CpuSmm: SpinLock Size =3D 0x%x, PreAllocateTokenNum= =3D 0x%x\n", SpinLockSize, TokenCountPerChunk)); + + gSmmCpuPrivate->CurrentTokenBuf =3D AllocatePool (SpinLockSize * TokenCo= untPerChunk); + ASSERT (gSmmCpuPrivate->CurrentTokenBuf !=3D NULL); + + gSmmCpuPrivate->UsedTokenNum =3D 0; + gSmmCpuPrivate->ApWrapperFunc =3D AllocatePool (sizeof (PROCEDURE_WRAPPE= R) * gSmmCpuPrivate->SmmCoreEntryContext.NumberOfCpus); ASSERT (gSmmCpuPrivate->ApWrapperFunc !=3D NULL); =20 InitializeListHead (&gSmmCpuPrivate->TokenList); + InitializeListHead (&gSmmCpuPrivate->OldTokenBufList); } =20 /** diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h b/UefiCpuPkg/PiSmmC= puDxeSmm/PiSmmCpuDxeSmm.h index 8c29f1a558..08ef8d2e15 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h @@ -217,6 +217,17 @@ typedef struct { =20 #define PROCEDURE_TOKEN_FROM_LINK(a) CR (a, PROCEDURE_TOKEN, Link, PROCED= URE_TOKEN_SIGNATURE) =20 +#define TOKEN_BUFFER_SIGNATURE SIGNATURE_32 ('T', 'K', 'B', 'S') + +typedef struct { + UINTN Signature; + LIST_ENTRY Link; + + UINT8 *Buffer; +} TOKEN_BUFFER; + +#define TOKEN_BUFFER_FROM_LINK(a) CR (a, TOKEN_BUFFER, Link, TOKEN_BUFFER= _SIGNATURE) + // // Private structure for the SMM CPU module that is stored in DXE Runtime = memory // Contains the SMM Configuration Protocols that is produced. @@ -243,6 +254,10 @@ typedef struct { PROCEDURE_WRAPPER *ApWrapperFunc; LIST_ENTRY TokenList; =20 + LIST_ENTRY OldTokenBufList; + + UINT8 *CurrentTokenBuf; + UINTN UsedTokenNum; // Only record tokens = used in CurrentTokenBuf. } SMM_CPU_PRIVATE_DATA; =20 extern SMM_CPU_PRIVATE_DATA *gSmmCpuPrivate; diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf b/UefiCpuPkg/PiSm= mCpuDxeSmm/PiSmmCpuDxeSmm.inf index 851a8cb258..8b6c71b697 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf @@ -140,6 +140,7 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetectionPropertyMask ##= CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdHeapGuardPropertyMask ##= CONSUMES gEfiMdePkgTokenSpaceGuid.PcdControlFlowEnforcementPropertyMask ##= CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdTokenCountPerChunk ##= CONSUMES =20 [Depex] gEfiMpServiceProtocolGuid diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec index 83acd33612..8ec2153459 100644 --- a/UefiCpuPkg/UefiCpuPkg.dec +++ b/UefiCpuPkg/UefiCpuPkg.dec @@ -147,6 +147,10 @@ # @Prompt Specify size of good stack of exception which need switching s= tack. gUefiCpuPkgTokenSpaceGuid.PcdCpuKnownGoodStackSize|2048|UINT32|0x30002001 =20 + ## Size of pre allocated token count per chunk. + # @Prompt Specify the size of pre allocated token count per chunk. + gUefiCpuPkgTokenSpaceGuid.PcdTokenCountPerChunk|64|UINT32|0x30002002 + [PcdsFixedAtBuild, PcdsPatchableInModule] ## This value is the CPU Local APIC base address, which aligns the addre= ss on a 4-KByte boundary. # @Prompt Configure base address of CPU Local APIC diff --git a/UefiCpuPkg/UefiCpuPkg.uni b/UefiCpuPkg/UefiCpuPkg.uni index fbf7680726..3bb951cc72 100644 --- a/UefiCpuPkg/UefiCpuPkg.uni +++ b/UefiCpuPkg/UefiCpuPkg.uni @@ -252,3 +252,4 @@ = "24000000 - 6th and 7th generation Intel Core processor= s and Intel Xeon W Processor Family(24MHz).
\n" = "19200000 - Intel Atom processors based on Goldmont Mic= roarchitecture with CPUID signature 06_5CH(19.2MHz).
\n" =20 +#string STR_gUefiCpuPkgTokenSpaceGuid_PcdTokenCountPerChunk_PROMPT #langu= age en-US "Specify the size of pre allocated token count per chunk.\n" \ No newline at end of file --=20 2.23.0.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#51721): https://edk2.groups.io/g/devel/message/51721 Mute This Topic: https://groups.io/mt/66393846/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-