From 4d722ac91608d3c4fbe807b418b77f2a6e279117 Mon Sep 17 00:00:00 2001 From: Yanbo Huang Date: Fri, 5 Jul 2024 18:17:57 +0800 Subject: [PATCH] [CHERRY-PICK] UefiCpuPkg/PiSmmCpuDxeSmm: Consume PcdCpuSmmApSyncTimeout2 This patch is to consume the PcdCpuSmmApSyncTimeout2 to enhance the flexibility of timeout configuration. In some cases, certain processors may not be able to enter SMI, and prolonged waiting could lead to kernel soft/hard lockup. We have now defined two timeouts. The first timeout can be set to a smaller value to reduce the waiting period. Processors that are unable to enter SMI will be woken up through SMIIPL to enter SMI, followed by a second waiting period. The second timeout can be set to a larger value to prevent delays in processors entering SMI case due to the long instruction execution. This patch adjust the location of PcdCpuSmmApSyncTimeout2 to avoid conflict. Signed-off-by: Yanbo Huang Cc: Ray Ni Cc: Rahul Kumar Cc: Gerd Hoffmann --- UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 10 +++++----- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 11 ++++++++--- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf | 1 + UefiCpuPkg/PiSmmCpuDxeSmm/SyncTimer.c | 19 ++++++++++++++----- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c index c1e81c2d84..616b8ce337 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c @@ -1,7 +1,7 @@ /** @file SMM MP service implementation -Copyright (c) 2009 - 2023, Intel Corporation. All rights reserved.
+Copyright (c) 2009 - 2024, Intel Corporation. All rights reserved.
Copyright (c) 2017, AMD Incorporated. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -270,7 +270,7 @@ SmmWaitForApArrival ( // Sync with APs 1st timeout // for (Timer = StartSyncTimer (); - !IsSyncTimerTimeout (Timer) && !(LmceEn && LmceSignal); + !IsSyncTimerTimeout (Timer, mTimeoutTicker) && !(LmceEn && LmceSignal); ) { mSmmMpSyncData->AllApArrivedWithException = AllCpusInSmmExceptBlockedDisabled (); @@ -311,7 +311,7 @@ SmmWaitForApArrival ( // Sync with APs 2nd timeout. // for (Timer = StartSyncTimer (); - !IsSyncTimerTimeout (Timer); + !IsSyncTimerTimeout (Timer, mTimeoutTicker2); ) { mSmmMpSyncData->AllApArrivedWithException = AllCpusInSmmExceptBlockedDisabled (); @@ -738,7 +738,7 @@ APHandler ( // Timeout BSP // for (Timer = StartSyncTimer (); - !IsSyncTimerTimeout (Timer) && + !IsSyncTimerTimeout (Timer, mTimeoutTicker) && !(*mSmmMpSyncData->InsideSmm); ) { @@ -766,7 +766,7 @@ APHandler ( // Now clock BSP for the 2nd time // for (Timer = StartSyncTimer (); - !IsSyncTimerTimeout (Timer) && + !IsSyncTimerTimeout (Timer, mTimeoutTicker2) && !(*mSmmMpSyncData->InsideSmm); ) { diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h index 467521ef09..5916124401 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h @@ -482,6 +482,9 @@ extern BOOLEAN mSmmDebugAgentSupport; // extern UINT64 mAddressEncMask; +extern UINT64 mTimeoutTicker; +extern UINT64 mTimeoutTicker2; + /** Create 4G PageTable in SMRAM. @@ -544,15 +547,17 @@ StartSyncTimer ( ); /** - Check if the SMM AP Sync timer is timeout. + Check if the SMM AP Sync Timer is timeout specified by Timeout. - @param Timer The start timer from the begin. + @param Timer The start timer from the begin. + @param Timeout The timeout ticker to wait. **/ BOOLEAN EFIAPI IsSyncTimerTimeout ( - IN UINT64 Timer + IN UINT64 Timer, + IN UINT64 Timeout ); /** diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf index 50f6e232b6..74ae7b79f7 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf @@ -138,6 +138,7 @@ gUefiCpuPkgTokenSpaceGuid.PcdSmmApPerfLogEnable [Pcd] + gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmApSyncTimeout2 ## CONSUMES gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber ## SOMETIMES_CONSUMES gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmProfileSize ## SOMETIMES_CONSUMES gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmStackSize ## CONSUMES diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/SyncTimer.c b/UefiCpuPkg/PiSmmCpuDxeSmm/SyncTimer.c index 0c070c5736..8d29ba7326 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/SyncTimer.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/SyncTimer.c @@ -1,7 +1,7 @@ /** @file SMM Timer feature support -Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.
+Copyright (c) 2009 - 2024, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -9,6 +9,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include "PiSmmCpuDxeSmm.h" UINT64 mTimeoutTicker = 0; + +UINT64 mTimeoutTicker2 = 0; + // // Number of counts in a roll-over cycle of the performance counter. // @@ -36,6 +39,10 @@ InitializeSmmTimer ( MultU64x64 (TimerFrequency, PcdGet64 (PcdCpuSmmApSyncTimeout)), 1000 * 1000 ); + mTimeoutTicker2 = DivU64x32 ( + MultU64x64 (TimerFrequency, PcdGet64 (PcdCpuSmmApSyncTimeout2)), + 1000 * 1000 + ); if (End < Start) { mCountDown = TRUE; mCycle = Start - End; @@ -59,15 +66,17 @@ StartSyncTimer ( } /** - Check if the SMM AP Sync timer is timeout. + Check if the SMM AP Sync Timer is timeout specified by Timeout. - @param Timer The start timer from the begin. + @param Timer The start timer from the begin. + @param Timeout The timeout ticker to wait. **/ BOOLEAN EFIAPI IsSyncTimerTimeout ( - IN UINT64 Timer + IN UINT64 Timer, + IN UINT64 Timeout ) { UINT64 CurrentTimer; @@ -105,5 +114,5 @@ IsSyncTimerTimeout ( } } - return (BOOLEAN)(Delta >= mTimeoutTicker); + return (BOOLEAN)(Delta >= Timeout); }