From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id 505197803DE for ; Wed, 9 Aug 2023 09:04:41 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=Sspqn8izk7FmxlDW5u9jJlNl8yRdQuYFUd5E3Fk7ujU=; c=relaxed/simple; d=groups.io; h=From:To:Cc:Subject:Date:Message-Id:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe; s=20140610; t=1691571879; v=1; b=R08n4PvMbbeMPTMn+2+yubLrNcOa6Llhv1CkI+r+IfUEn/hyvL1dfA4kvVqX5h8p94GN1UKQ qmL6/K9cPpDGuL+bHqgFq6IhcQSrDG3vj/881G9CjJwPjdFvcK0KY9YdHpIrueTeaunG9cYmAqF qxgRT5AYygk3jzri3nsXcPwM= X-Received: by 127.0.0.2 with SMTP id HkeHYY7687511xzzZkw9nvrr; Wed, 09 Aug 2023 02:04:39 -0700 X-Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.115]) by mx.groups.io with SMTP id smtpd.web10.84108.1691571879028426517 for ; Wed, 09 Aug 2023 02:04:39 -0700 X-IronPort-AV: E=McAfee;i="6600,9927,10795"; a="371063074" X-IronPort-AV: E=Sophos;i="6.01,158,1684825200"; d="scan'208";a="371063074" X-Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Aug 2023 02:04:15 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10795"; a="734922834" X-IronPort-AV: E=Sophos;i="6.01,158,1684825200"; d="scan'208";a="734922834" X-Received: from sh1gapp1009.ccr.corp.intel.com ([10.239.189.219]) by fmsmga007.fm.intel.com with ESMTP; 09 Aug 2023 02:04:13 -0700 From: "Wu, Jiaxin" To: devel@edk2.groups.io Cc: Eric Dong , Ray Ni , Zeng Star , Rahul Kumar , Gerd Hoffmann Subject: [edk2-devel] [PATCH v1] UefiCpuPkg/SmmCpu: Refine semaphore sync between BSP and AP Date: Wed, 9 Aug 2023 17:04:10 +0800 Message-Id: <20230809090410.12428-1-jiaxin.wu@intel.com> Precedence: Bulk List-Subscribe: List-Help: 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,jiaxin.wu@intel.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: 6mBoAoDS2j52QT48GEigWu6hx7686176AA= X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=R08n4PvM; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=intel.com (policy=none); spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io For SMM CPU semaphore sync, there is no need atomic semaphore operation, just use the flag to indicate it has complete the wait/release. Based on this, this patch is to refine 2 functions (WaitForAllAPs & ReleaseAllAPs) and define 2 new functions (WaitForBsp & ReleaseBsp) used for the semaphore sync between BSP & AP. Sync flow like below: 1. BSP to Release All APs ---> 1. AP to Wait BSP ReleaseAllAPs () WaitForBsp 2. BSP to Wait All APs <--- 2. AP to Release BSP WaitForAllAPs () ReleaseBsp With this change, SMM CPU semaphore sync for SMI exit performance will be significant improved. Cc: Eric Dong Cc: Ray Ni Cc: Zeng Star Cc: Rahul Kumar Cc: Gerd Hoffmann Signed-off-by: Jiaxin Wu --- UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 68 ++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 17 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c index 25d058c5b9..0bf460e81c 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c @@ -120,11 +120,11 @@ LockdownSemaphore ( return Value; } /** - Wait all APs to performs an atomic compare exchange operation to release semaphore. + Used for BSP to wait all APs. @param NumberOfAPs AP number **/ VOID @@ -133,18 +133,19 @@ WaitForAllAPs ( ) { UINTN BspIndex; BspIndex = mSmmMpSyncData->BspIndex; - while (NumberOfAPs-- > 0) { - WaitForSemaphore (mSmmMpSyncData->CpuData[BspIndex].Run); + while (NumberOfAPs != *mSmmMpSyncData->CpuData[BspIndex].Run) { + CpuPause (); } + + *mSmmMpSyncData->CpuData[BspIndex].Run = 0; } /** - Performs an atomic compare exchange operation to release semaphore - for each AP. + Used for BSP to release all APs. **/ VOID ReleaseAllAPs ( VOID @@ -152,15 +153,48 @@ ReleaseAllAPs ( { UINTN Index; for (Index = 0; Index < mMaxNumberOfCpus; Index++) { if (IsPresentAp (Index)) { - ReleaseSemaphore (mSmmMpSyncData->CpuData[Index].Run); + ASSERT (*mSmmMpSyncData->CpuData[Index].Run == 0); + *mSmmMpSyncData->CpuData[Index].Run = 1; } } } +/** + Used for Ap to wait BSP. + + @param ApSem IN: 32-bit unsigned integer + OUT: original integer 0 +**/ +VOID +WaitForBsp ( + IN OUT volatile UINT32 *ApSem + ) +{ + while (*ApSem == 0) { + CpuPause (); + } + + *ApSem = 0; +} + +/** + Used for Ap to release BSP. + + @param BspSem IN: 32-bit unsigned integer + OUT: original integer + 1 +**/ +VOID +ReleaseBsp ( + IN OUT volatile UINT32 *BspSem + ) +{ + InterlockedIncrement (BspSem); +} + /** Check whether the index of CPU perform the package level register programming during System Management Mode initialization. The index of Processor specified by mPackageFirstThreadIndex[PackageIndex] @@ -898,50 +932,50 @@ APHandler ( if ((SyncMode == SmmCpuSyncModeTradition) || SmmCpuFeaturesNeedConfigureMtrrs ()) { // // Notify BSP of arrival at this point // - ReleaseSemaphore (mSmmMpSyncData->CpuData[BspIndex].Run); + ReleaseBsp (mSmmMpSyncData->CpuData[BspIndex].Run); } if (SmmCpuFeaturesNeedConfigureMtrrs ()) { // // Wait for the signal from BSP to backup MTRRs // - WaitForSemaphore (mSmmMpSyncData->CpuData[CpuIndex].Run); + WaitForBsp (mSmmMpSyncData->CpuData[CpuIndex].Run); // // Backup OS MTRRs // MtrrGetAllMtrrs (&Mtrrs); // // Signal BSP the completion of this AP // - ReleaseSemaphore (mSmmMpSyncData->CpuData[BspIndex].Run); + ReleaseBsp (mSmmMpSyncData->CpuData[BspIndex].Run); // // Wait for BSP's signal to program MTRRs // - WaitForSemaphore (mSmmMpSyncData->CpuData[CpuIndex].Run); + WaitForBsp (mSmmMpSyncData->CpuData[CpuIndex].Run); // // Replace OS MTRRs with SMI MTRRs // ReplaceOSMtrrs (CpuIndex); // // Signal BSP the completion of this AP // - ReleaseSemaphore (mSmmMpSyncData->CpuData[BspIndex].Run); + ReleaseBsp (mSmmMpSyncData->CpuData[BspIndex].Run); } while (TRUE) { // // Wait for something to happen // - WaitForSemaphore (mSmmMpSyncData->CpuData[CpuIndex].Run); + WaitForBsp (mSmmMpSyncData->CpuData[CpuIndex].Run); // // Check if BSP wants to exit SMM // if (!(*mSmmMpSyncData->InsideSmm)) { @@ -977,16 +1011,16 @@ APHandler ( if (SmmCpuFeaturesNeedConfigureMtrrs ()) { // // Notify BSP the readiness of this AP to program MTRRs // - ReleaseSemaphore (mSmmMpSyncData->CpuData[BspIndex].Run); + ReleaseBsp (mSmmMpSyncData->CpuData[BspIndex].Run); // // Wait for the signal from BSP to program MTRRs // - WaitForSemaphore (mSmmMpSyncData->CpuData[CpuIndex].Run); + WaitForBsp (mSmmMpSyncData->CpuData[CpuIndex].Run); // // Restore OS MTRRs // SmmCpuFeaturesReenableSmrr (); @@ -994,26 +1028,26 @@ APHandler ( } // // Notify BSP the readiness of this AP to Reset states/semaphore for this processor // - ReleaseSemaphore (mSmmMpSyncData->CpuData[BspIndex].Run); + ReleaseBsp (mSmmMpSyncData->CpuData[BspIndex].Run); // // Wait for the signal from BSP to Reset states/semaphore for this processor // - WaitForSemaphore (mSmmMpSyncData->CpuData[CpuIndex].Run); + WaitForBsp (mSmmMpSyncData->CpuData[CpuIndex].Run); // // Reset states/semaphore for this processor // *(mSmmMpSyncData->CpuData[CpuIndex].Present) = FALSE; // // Notify BSP the readiness of this AP to exit SMM // - ReleaseSemaphore (mSmmMpSyncData->CpuData[BspIndex].Run); + ReleaseBsp (mSmmMpSyncData->CpuData[BspIndex].Run); } /** Checks whether the input token is the current used token. -- 2.16.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#107652): https://edk2.groups.io/g/devel/message/107652 Mute This Topic: https://groups.io/mt/100639360/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-