MdeModulePkg/SmmCorePerformanceLib: Disable perf-logging at runtime

Because SMM perf-logging is migrated to non-SMRAM at ReadyToBoot
by DxeCorePerformanceLib, the perf-logging after ExitBS is useless and
impact the SMI latency at runtime.
Hence the SmmCorePerformanceLib is updated to disable perf-logging
after ExitBS.

Signed-off-by: Ray Ni <ray.ni@intel.com>
Cc: Jiaxin Wu <jiaxin.wu@intel.com>
Cc: Dandan Bi <dandan.bi@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Jian J Wang <jian.j.wang@intel.com>
Reviewed-by: Jiaxin Wu <jiaxin.wu@intel.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
This commit is contained in:
Ray Ni 2023-05-31 19:29:31 +08:00 committed by mergify[bot]
parent 92759eeb0c
commit 2d3974a351
2 changed files with 47 additions and 3 deletions

View File

@ -16,7 +16,7 @@
SmmPerformanceHandlerEx(), SmmPerformanceHandler() will receive untrusted input and do basic validation. SmmPerformanceHandlerEx(), SmmPerformanceHandler() will receive untrusted input and do basic validation.
Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR> Copyright (c) 2011 - 2023, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
@ -48,6 +48,7 @@ SPIN_LOCK mSmmFpdtLock;
PERFORMANCE_PROPERTY mPerformanceProperty; PERFORMANCE_PROPERTY mPerformanceProperty;
UINT32 mCachedLength = 0; UINT32 mCachedLength = 0;
UINT32 mBootRecordSize = 0; UINT32 mBootRecordSize = 0;
BOOLEAN mPerformanceMeasurementEnabled;
// //
// Interfaces for SMM PerformanceMeasurement Protocol. // Interfaces for SMM PerformanceMeasurement Protocol.
@ -929,6 +930,35 @@ FpdtSmiHandler (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/**
This is the Event call back function is triggered in SMM to notify the Library
the system is entering runtime phase.
@param[in] Protocol Points to the protocol's unique identifier
@param[in] Interface Points to the interface instance
@param[in] Handle The handle on which the interface was installed
@retval EFI_SUCCESS SmmAtRuntimeCallBack runs successfully
**/
EFI_STATUS
EFIAPI
SmmCorePerformanceLibExitBootServicesCallback (
IN CONST EFI_GUID *Protocol,
IN VOID *Interface,
IN EFI_HANDLE Handle
)
{
//
// Disable performance measurement after ExitBootServices because
// 1. Performance measurement might impact SMI latency at runtime;
// 2. Performance log is copied to non SMRAM at ReadyToBoot so runtime performance
// log is not useful.
//
mPerformanceMeasurementEnabled = FALSE;
return EFI_SUCCESS;
}
/** /**
SmmBase2 protocol notify callback function, when SMST and SMM memory service get initialized SmmBase2 protocol notify callback function, when SMST and SMM memory service get initialized
this function is callbacked to initialize the Smm Performance Lib this function is callbacked to initialize the Smm Performance Lib
@ -948,6 +978,7 @@ InitializeSmmCorePerformanceLib (
EFI_HANDLE SmiHandle; EFI_HANDLE SmiHandle;
EFI_STATUS Status; EFI_STATUS Status;
PERFORMANCE_PROPERTY *PerformanceProperty; PERFORMANCE_PROPERTY *PerformanceProperty;
VOID *Registration;
// //
// Initialize spin lock // Initialize spin lock
@ -987,6 +1018,16 @@ InitializeSmmCorePerformanceLib (
Status = gBS->InstallConfigurationTable (&gPerformanceProtocolGuid, &mPerformanceProperty); Status = gBS->InstallConfigurationTable (&gPerformanceProtocolGuid, &mPerformanceProperty);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
} }
//
// Register callback function for ExitBootServices event.
//
Status = gSmst->SmmRegisterProtocolNotify (
&gEdkiiSmmExitBootServicesProtocolGuid,
SmmCorePerformanceLibExitBootServicesCallback,
&Registration
);
ASSERT_EFI_ERROR (Status);
} }
/** /**
@ -1011,6 +1052,8 @@ SmmCorePerformanceLibConstructor (
EFI_EVENT Event; EFI_EVENT Event;
VOID *Registration; VOID *Registration;
mPerformanceMeasurementEnabled = (BOOLEAN)((PcdGet8 (PcdPerformanceLibraryPropertyMask) & PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED) != 0);
if (!PerformanceMeasurementEnabled ()) { if (!PerformanceMeasurementEnabled ()) {
// //
// Do not initialize performance infrastructure if not required. // Do not initialize performance infrastructure if not required.
@ -1383,7 +1426,7 @@ PerformanceMeasurementEnabled (
VOID VOID
) )
{ {
return (BOOLEAN)((PcdGet8 (PcdPerformanceLibraryPropertyMask) & PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED) != 0); return mPerformanceMeasurementEnabled;
} }
/** /**

View File

@ -8,7 +8,7 @@
# This library is mainly used by SMM Core to start performance logging to ensure that # This library is mainly used by SMM Core to start performance logging to ensure that
# SMM Performance and PerformanceEx Protocol are installed at the very beginning of SMM phase. # SMM Performance and PerformanceEx Protocol are installed at the very beginning of SMM phase.
# #
# Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2011 - 2023, Intel Corporation. All rights reserved.<BR>
# SPDX-License-Identifier: BSD-2-Clause-Patent # SPDX-License-Identifier: BSD-2-Clause-Patent
# #
## ##
@ -58,6 +58,7 @@
[Protocols] [Protocols]
gEfiSmmBase2ProtocolGuid ## CONSUMES gEfiSmmBase2ProtocolGuid ## CONSUMES
gEdkiiSmmExitBootServicesProtocolGuid ## CONSUMES
[Guids] [Guids]
## PRODUCES ## SystemTable ## PRODUCES ## SystemTable