From nobody Fri Apr 19 06:48:57 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+51437+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+51437+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1574909900; cv=none; d=zohomail.com; s=zohoarc; b=iigGQA7IYIFA/ceVk9KPKkIDUuPDbX5ob7SzMcdbh+F1u/7NoGMNF4R+CLAMlJxgt2fhsFPZxSdMvmqq3jSD3T3JwAs3oBro/IaWJ/uhPWruL9zqz600LSN5viaEEka13/u7kvy81J0nh5LSJiytuaZFWKV/xN+m5dSYlsJ3tGU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574909900; h=Content-Transfer-Encoding:Cc:Date:From:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Sender:Subject:To; bh=L26Yw7AWTxOPQPfIDGJV0kaqEROW2OMs9zGAbs1PHCI=; b=ltmGiNzS19yWLRMiKyr99ITl7iPlOPEgIr+Bf7NdOl4/kAcWQcHt7K4d+6tylZ3IPJ+GP5vid3LXElojSmFI9cmMcWmwOOIYPhSYkFgYSOWu0fdx3WJZbfe8JGTfvJ1Dv0RjfbwUbsUCahp9UVgXNyuK8KaU/rVz3j7XWPTPFnQ= 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+51437+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 1574909899896597.1800534566178; Wed, 27 Nov 2019 18:58:19 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id dgYhYY1788612xw2Z3MGzfkY; Wed, 27 Nov 2019 18:58:18 -0800 X-Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by mx.groups.io with SMTP id smtpd.web10.1848.1574909898458535067 for ; Wed, 27 Nov 2019 18:58:18 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Nov 2019 18:58:18 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,251,1571727600"; d="scan'208";a="221181461" X-Received: from ydong10-desktop.ccr.corp.intel.com ([10.239.158.133]) by orsmga002.jf.intel.com with ESMTP; 27 Nov 2019 18:58:16 -0800 From: "Dong, Eric" To: devel@edk2.groups.io Cc: Laszlo Ersek Subject: [edk2-devel] [PATCH] UefiCpuPkg/PiSmmCpuDxeSmm: Avoid allocate Token every time. Date: Thu, 28 Nov 2019 10:58:14 +0800 Message-Id: <20191128025814.417-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: 6l7Gs2TUVhciQzYRMLK0gJAQx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1574909898; bh=bhW9irm1zlc7o32HwcPia72YI3T7LCVxT432EgyvsZk=; h=Cc:Date:From:Reply-To:Subject:To; b=MYrqYZ+OHqDYb1EdWjvcQ5N90KOXUjZmqbOUymTNahBNh5DrFCvArE8WBswDL0soxpd wXWx2RnCXqfCaZBdkx9AmICig2dNJLLeac1cIZ7mLNkETmNqKtOIwv2lwZ6unbJla8oXz G7lB07U4o6M0ARa38xQD8zjNeHwXi/R51GE= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" 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: Eric Dong Cc: Laszlo Ersek --- UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 56 +++++++++++++++++++--- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 16 +++++++ 2 files changed, 66 insertions(+), 6 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxe= Smm/MpService.c index d8d2b6f444..702bbcd095 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; + + // + // Only reset current used Token buffer, not free this buffer. + // + gSmmCpuPrivate->UsedTokenNum =3D 0; + + Link =3D GetFirstNode (&gSmmCpuPrivate->OldTokenBufList); + while (!IsNull (&gSmmCpuPrivate->OldTokenBufList, Link)) { + TokenBuf =3D TOKEN_BUFFER_FROM_LINK (Link); + + Link =3D GetNextNode (&gSmmCpuPrivate->OldTokenBufList, Link); + + RemoveEntryList (&TokenBuf->Link); + =20 + 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,32 @@ CreateToken ( VOID ) { - PROCEDURE_TOKEN *ProcToken; + PROCEDURE_TOKEN *ProcToken; SPIN_LOCK *CpuToken; - UINTN SpinLockSize; + TOKEN_BUFFER *TokenBuf; + + if (gSmmCpuPrivate->UsedTokenNum >=3D MAX_TOKEN_COUND_NUMBER - 1) { + DEBUG((DEBUG_INFO, "Token buffer not enough, allocate new buffer[Token= Num=3D0x%x]!\n", gSmmCpuPrivate->UsedTokenNum)); + + // + // Save Current Token Buffer to the 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 AllocateZeroPool (gSmmCpuPrivate= ->TokenSize * MAX_TOKEN_COUND_NUMBER); + ASSERT (gSmmCpuPrivate->CurrentTokenBuf !=3D NULL); + gSmmCpuPrivate->UsedTokenNum =3D 0; + } + + CpuToken =3D (SPIN_LOCK *)(gSmmCpuPrivate->CurrentTokenBuf + gSmmCpuPriv= ate->TokenSize * gSmmCpuPrivate->UsedTokenNum); + gSmmCpuPrivate->UsedTokenNum++; + //DEBUG((DEBUG_INFO, "Token Address =3D 0x%x, Token Number =3D 0x%x\n", = CpuToken, gSmmCpuPrivate->UsedTokenNum)); =20 - SpinLockSize =3D GetSpinLockProperties (); - CpuToken =3D AllocatePool (SpinLockSize); - ASSERT (CpuToken !=3D NULL); InitializeSpinLock (CpuToken); AcquireSpinLock (CpuToken); =20 @@ -1737,10 +1773,18 @@ InitializeDataForMmMp ( VOID ) { + gSmmCpuPrivate->TokenSize =3D (UINT32)GetSpinLockProperties (); + DEBUG((DEBUG_INFO, "gSmmCpuPrivate->TokenSize =3D 0x%x\n", gSmmCpuPrivat= e->TokenSize)); + + gSmmCpuPrivate->CurrentTokenBuf =3D AllocateZeroPool (gSmmCpuPrivate->= TokenSize * MAX_TOKEN_COUND_NUMBER); + 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..c197aad288 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 #define ARRIVAL_EXCEPTION_SMI_DISABLED 0x4 =20 +#define MAX_TOKEN_COUND_NUMBER 0x512 // // Wrapper used to convert EFI_AP_PROCEDURE2 and EFI_AP_PROCEDURE. // @@ -217,6 +218,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 +255,10 @@ typedef struct { PROCEDURE_WRAPPER *ApWrapperFunc; LIST_ENTRY TokenList; =20 + LIST_ENTRY OldTokenBufList; + UINT8 *CurrentTokenBuf; + UINTN UsedTokenNum; // Only record tokens = used in CurrentTokenBuf. + UINT32 TokenSize; } SMM_CPU_PRIVATE_DATA; =20 extern SMM_CPU_PRIVATE_DATA *gSmmCpuPrivate; --=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 (#51437): https://edk2.groups.io/g/devel/message/51437 Mute This Topic: https://groups.io/mt/63641247/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-