UefiCpuPkg/CpuSmm: Add perf-logging for MP procedures
MP procedures are those procedures that run in every CPU thread. The EDKII perf infra is not MP safe so it doesn't support to be called from those MP procedures. The patch adds SMM MP perf-logging support in SmmMpPerf.c. The following procedures are perf-logged: * SmmInitHandler * SmmCpuFeaturesRendezvousEntry * PlatformValidSmi * SmmCpuFeaturesRendezvousExit Signed-off-by: Ray Ni <ray.ni@intel.com> Cc: Eric Dong <eric.dong@intel.com> Cc: Rahul Kumar <rahul1.kumar@intel.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: Jiaxin Wu <jiaxin.wu@intel.com> Reviewed-by: Jiaxin Wu <jiaxin.wu@intel.com> Reviewed-by: Eric Dong <eric.dong@intel.com>
This commit is contained in:
81
UefiCpuPkg/PiSmmCpuDxeSmm/SmmMpPerf.h
Normal file
81
UefiCpuPkg/PiSmmCpuDxeSmm/SmmMpPerf.h
Normal file
@@ -0,0 +1,81 @@
|
||||
/** @file
|
||||
SMM MP perf-logging implementation
|
||||
|
||||
Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
|
||||
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
||||
#ifndef MP_PERF_H_
|
||||
#define MP_PERF_H_
|
||||
|
||||
//
|
||||
// The list of all MP procedures that need to be perf-logged.
|
||||
//
|
||||
#define SMM_MP_PERF_PROCEDURE_LIST(_) \
|
||||
_(SmmInitHandler), \
|
||||
_(SmmRendezvousEntry), \
|
||||
_(PlatformValidSmi), \
|
||||
_(SmmRendezvousExit), \
|
||||
_(SmmMpProcedureMax) // Add new entries above this line
|
||||
|
||||
//
|
||||
// To perf-log MP procedures, call MpPerfBegin()/MpPerfEnd() with CpuIndex
|
||||
// and SMM_MP_PERF_PROCEDURE_ID with entry name defined in the SMM_MP_PERF_PROCEDURE_LIST.
|
||||
//
|
||||
#define SMM_MP_PERF_PROCEDURE_ID(procedure) SmmMpProcedureId ## procedure
|
||||
enum {
|
||||
SMM_MP_PERF_PROCEDURE_LIST (SMM_MP_PERF_PROCEDURE_ID)
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
UINT64 Begin[SMM_MP_PERF_PROCEDURE_ID (SmmMpProcedureMax)];
|
||||
UINT64 End[SMM_MP_PERF_PROCEDURE_ID (SmmMpProcedureMax)];
|
||||
} SMM_PERF_AP_PROCEDURE_PERFORMANCE;
|
||||
|
||||
/**
|
||||
Initialize the perf-logging feature for APs.
|
||||
|
||||
@param NumberofCpus Number of processors in the platform.
|
||||
**/
|
||||
VOID
|
||||
InitializeMpPerf (
|
||||
UINTN NumberofCpus
|
||||
);
|
||||
|
||||
/**
|
||||
Migrate MP performance data to standardized performance database.
|
||||
|
||||
@param NumberofCpus Number of processors in the platform.
|
||||
**/
|
||||
VOID
|
||||
MigrateMpPerf (
|
||||
UINTN NumberofCpus
|
||||
);
|
||||
|
||||
/**
|
||||
Save the performance counter value before running the MP procedure.
|
||||
|
||||
@param CpuIndex The index of the CPU.
|
||||
@param MpProcedureId The ID of the MP procedure.
|
||||
**/
|
||||
VOID
|
||||
MpPerfBegin (
|
||||
IN UINTN CpuIndex,
|
||||
IN UINTN MpProcedureId
|
||||
);
|
||||
|
||||
/**
|
||||
Save the performance counter value after running the MP procedure.
|
||||
|
||||
@param CpuIndex The index of the CPU.
|
||||
@param MpProcedureId The ID of the MP procedure.
|
||||
**/
|
||||
VOID
|
||||
MpPerfEnd (
|
||||
IN UINTN CpuIndex,
|
||||
IN UINTN MpProcedureId
|
||||
);
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user