From 0ef772cdd73cae19b8f1ecd0de34663d53c92ba9 Mon Sep 17 00:00:00 2001 From: "lijindong (C)" <2220386943@qq.com> Date: Fri, 12 Sep 2025 11:46:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DPmuEventList=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=9C=A8=E9=83=A8=E5=88=86=E7=8E=AF=E5=A2=83=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=88=B0=E6=97=A0=E6=B3=95=E9=87=87=E9=9B=86=E7=9A=84?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pmu/pfm/pfm.cpp | 3 +- pmu/pmu_event_list.cpp | 69 ++++++++++++++++++++++++++++-------------- pmu/pmu_event_list.h | 2 +- 3 files changed, 50 insertions(+), 24 deletions(-) diff --git a/pmu/pfm/pfm.cpp b/pmu/pfm/pfm.cpp index f2ff9ca..82f9c5b 100644 --- a/pmu/pfm/pfm.cpp +++ b/pmu/pfm/pfm.cpp @@ -26,6 +26,7 @@ #include "cpu_map.h" #include "pfm_event.h" #include "pmu_event.h" +#include "pmu_event_list.h" #include "pmu.h" #include "pcerr.h" #include "pfm.h" @@ -93,7 +94,7 @@ static const std::unordered_map EvtMap{ static bool CheckEventInList(enum PmuEventType eventType, const char *pmuName) { unsigned numEvt; - auto eventList = PmuEventList(eventType, &numEvt); + auto eventList = PmuEventList(eventType, &numEvt, false); if (eventList == nullptr) { return false; } diff --git a/pmu/pmu_event_list.cpp b/pmu/pmu_event_list.cpp index f5c7cb9..0fb61a8 100644 --- a/pmu/pmu_event_list.cpp +++ b/pmu/pmu_event_list.cpp @@ -28,7 +28,7 @@ using namespace pcerr; using namespace std; -using EvtQueryer = function; +using EvtQueryer = function; static const string SLASH = "/"; static const string COLON = ":"; @@ -45,6 +45,7 @@ static vector supportDevPrefixs = {"hisi", "smmuv3", "hns3", "armv8 static vector uncoreEventList; static vector traceEventList; static vector coreEventList; +static vector checkCoreEventList; static void GetEventName(const string& devName, vector& eventList) { @@ -118,49 +119,67 @@ static bool PerfEventSupported(__u64 type, __u64 config) return true; } -const char** QueryCoreEvent(unsigned *numEvt) +const char **GetCoreEventList(unsigned *numEvt, bool eventCheck) { - if (!coreEventList.empty()) { + if (eventCheck) { + *numEvt = checkCoreEventList.size(); + return checkCoreEventList.data(); + } + *numEvt = coreEventList.size(); + return coreEventList.data(); +} + +const char** QueryCoreEvent(unsigned *numEvt, bool eventCheck) +{ + if (!coreEventList.empty() && !eventCheck) { *numEvt = coreEventList.size(); return coreEventList.data(); } + + if (!checkCoreEventList.empty() && eventCheck) { + *numEvt = checkCoreEventList.size(); + return checkCoreEventList.data(); + } + auto coreEventMap = KUNPENG_PMU::CORE_EVENT_MAP.at(GetCpuType()); for (auto& pair : coreEventMap) { auto eventName = pair.first; - if (!PerfEventSupported(pair.second.type, pair.second.config)) { - continue; - } char* eventNameCopy = new char[eventName.length() + 1]; strcpy(eventNameCopy, eventName.c_str()); - coreEventList.emplace_back(eventNameCopy); + if (eventCheck && PerfEventSupported(pair.second.type, pair.second.config)) { + checkCoreEventList.emplace_back(eventNameCopy); + } else { + coreEventList.emplace_back(eventNameCopy); + } } DIR* dir; struct dirent* entry; auto pmuDevPath = GetPmuDevicePath(); if (pmuDevPath.empty()) { - *numEvt = coreEventList.size(); - return coreEventList.data(); + return GetCoreEventList(numEvt, eventCheck); } string path = pmuDevPath + "/events/"; dir = opendir(path.c_str()); if (dir == nullptr) { - *numEvt = coreEventList.size(); - return coreEventList.data(); + return GetCoreEventList(numEvt, eventCheck); } while ((entry = readdir(dir)) != nullptr) { if (entry->d_type == DT_REG) { string evtName = entry->d_name; char* eventNameCopy = new char[evtName.length() + 1]; strcpy(eventNameCopy, evtName.c_str()); - coreEventList.emplace_back(eventNameCopy); + if (eventCheck) { + checkCoreEventList.emplace_back(eventNameCopy); + } else { + coreEventList.emplace_back(eventNameCopy); + } } } closedir(dir); - *numEvt = coreEventList.size(); - return coreEventList.data(); + return GetCoreEventList(numEvt, eventCheck); } -const char** QueryUncoreEvent(unsigned *numEvt) +const char** QueryUncoreEvent(unsigned *numEvt, bool eventCheck) { if (!uncoreEventList.empty()) { *numEvt = uncoreEventList.size(); @@ -189,7 +208,7 @@ const char** QueryUncoreEvent(unsigned *numEvt) return uncoreEventList.data(); } -const char** QueryTraceEvent(unsigned *numEvt) +const char** QueryTraceEvent(unsigned *numEvt, bool eventCheck) { #ifdef IS_X86 *numEvt = 0; @@ -228,11 +247,11 @@ const char** QueryTraceEvent(unsigned *numEvt) #endif } -const char** QueryAllEvent(unsigned *numEvt) { +const char** QueryAllEvent(unsigned *numEvt, bool eventCheck) { unsigned coreNum, uncoreNum, traceNum; - const char** coreList = QueryCoreEvent(&coreNum); - const char** uncoreList = QueryUncoreEvent(&uncoreNum); - const char** traceList = QueryTraceEvent(&traceNum); + const char** coreList = QueryCoreEvent(&coreNum, eventCheck); + const char** uncoreList = QueryUncoreEvent(&uncoreNum, eventCheck); + const char** traceList = QueryTraceEvent(&traceNum, eventCheck); unsigned totalSize = 0; if (coreList != nullptr) { @@ -271,7 +290,7 @@ static const unordered_map QueryMap{ {PmuEventType::ALL_EVENT, QueryAllEvent}, }; -const char** PmuEventList(enum PmuEventType eventType, unsigned *numEvt) +const char** PmuEventList(enum PmuEventType eventType, unsigned *numEvt, bool eventNeedCheck) { lock_guard lg(pmuEventListMtx); SetWarn(SUCCESS); @@ -281,7 +300,7 @@ const char** PmuEventList(enum PmuEventType eventType, unsigned *numEvt) return nullptr; } try { - eventList = QueryMap.at(eventType)(numEvt); + eventList = QueryMap.at(eventType)(numEvt, eventNeedCheck); } catch (...) { New(LIBPERF_ERR_QUERY_EVENT_LIST_FAILED, "Query event failed."); return nullptr; @@ -289,6 +308,11 @@ const char** PmuEventList(enum PmuEventType eventType, unsigned *numEvt) return eventList; } +const char** PmuEventList(enum PmuEventType eventType, unsigned *numEvt) +{ + return PmuEventList(eventType, numEvt, true); +} + static void PmuEventListFreeSingle(vector& eventList) { for (auto evt : eventList) { @@ -302,6 +326,7 @@ void PmuEventListFree() { lock_guard lg(pmuEventListMtx); PmuEventListFreeSingle(coreEventList); + PmuEventListFreeSingle(checkCoreEventList); PmuEventListFreeSingle(uncoreEventList); PmuEventListFreeSingle(traceEventList); New(SUCCESS); diff --git a/pmu/pmu_event_list.h b/pmu/pmu_event_list.h index 8ae1b4c..ae05b17 100644 --- a/pmu/pmu_event_list.h +++ b/pmu/pmu_event_list.h @@ -16,5 +16,5 @@ #define PMU_EVENT_LIST_H void PmuEventListFree(); - +const char** PmuEventList(enum PmuEventType eventType, unsigned *numEvt, bool eventNeedCheck); #endif // PMU_EVENT_LIST_H -- Gitee