From 686d4f54d74b7a07fcf83ca4235ec96922302617 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 | 58 +++++++++++++++++++++++++++++++++++------- pmu/pmu_event_list.h | 2 +- 3 files changed, 52 insertions(+), 11 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 a1577cc..af7aa4b 100644 --- a/pmu/pmu_event_list.cpp +++ b/pmu/pmu_event_list.cpp @@ -35,6 +35,7 @@ static const string COLON = ":"; static const string EVENT_DIR = "/events/"; static std::mutex pmuEventListMtx; +static volatile bool eventCheck; #ifdef IS_X86 static vector supportDevPrefixs = {"uncore_iio", "uncore_imc", "cpu"}; @@ -45,6 +46,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) { @@ -100,31 +102,59 @@ static void GetTraceSubFolder(const std::string& traceFolder, const string& devN closedir(dir); } +static bool PerfEventSupported(__u64 type, __u64 config) +{ + perf_event_attr attr{}; + memset(&attr, 0, sizeof(attr)); + attr.size = sizeof(struct perf_event_attr); + attr.type = type; + attr.config = config; + attr.disabled = 1; + attr.inherit = 1; + attr.read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | PERF_FORMAT_TOTAL_TIME_RUNNING | PERF_FORMAT_ID; + int fd = KUNPENG_PMU::PerfEventOpen(&attr, -1, 0, -1, 0); + if (fd < 0) { + return false; + } + close(fd); + return true; +} + +const char **GetCoreEventList(unsigned *numEvt) +{ + if (eventCheck) { + *numEvt = checkCoreEventList.size(); + return checkCoreEventList.data(); + } + *numEvt = coreEventList.size(); + return coreEventList.data(); +} + const char** QueryCoreEvent(unsigned *numEvt) { if (!coreEventList.empty()) { - *numEvt = coreEventList.size(); - return coreEventList.data(); + return GetCoreEventList(numEvt); } auto coreEventMap = KUNPENG_PMU::CORE_EVENT_MAP.at(GetCpuType()); for (auto& pair : coreEventMap) { auto eventName = pair.first; char* eventNameCopy = new char[eventName.length() + 1]; strcpy(eventNameCopy, eventName.c_str()); + if (PerfEventSupported(pair.second.type, pair.second.config)) { + checkCoreEventList.emplace_back(eventNameCopy); + } coreEventList.emplace_back(eventNameCopy); } DIR* dir; struct dirent* entry; auto pmuDevPath = GetPmuDevicePath(); if (pmuDevPath.empty()) { - *numEvt = coreEventList.size(); - return coreEventList.data(); + return GetCoreEventList(numEvt); } string path = pmuDevPath + "/events/"; dir = opendir(path.c_str()); if (dir == nullptr) { - *numEvt = coreEventList.size(); - return coreEventList.data(); + return GetCoreEventList(numEvt); } while ((entry = readdir(dir)) != nullptr) { if (entry->d_type == DT_REG) { @@ -132,11 +162,11 @@ const char** QueryCoreEvent(unsigned *numEvt) char* eventNameCopy = new char[evtName.length() + 1]; strcpy(eventNameCopy, evtName.c_str()); coreEventList.emplace_back(eventNameCopy); + checkCoreEventList.emplace_back(eventNameCopy); } } closedir(dir); - *numEvt = coreEventList.size(); - return coreEventList.data(); + return GetCoreEventList(numEvt); } const char** QueryUncoreEvent(unsigned *numEvt) @@ -250,24 +280,33 @@ 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); + eventCheck = eventNeedCheck; const char** eventList; if (QueryMap.find(eventType) == QueryMap.end()) { New(LIBPERF_ERR_QUERY_EVENT_TYPE_INVALID, "Event type is invalid."); + eventCheck = false; return nullptr; } try { eventList = QueryMap.at(eventType)(numEvt); } catch (...) { New(LIBPERF_ERR_QUERY_EVENT_LIST_FAILED, "Query event failed."); + eventCheck = false; return nullptr; } + eventCheck = false; return eventList; } +const char** PmuEventList(enum PmuEventType eventType, unsigned *numEvt) +{ + return PmuEventList(eventType, numEvt, true); +} + static void PmuEventListFreeSingle(vector& eventList) { for (auto evt : eventList) { @@ -283,5 +322,6 @@ void PmuEventListFree() PmuEventListFreeSingle(coreEventList); PmuEventListFreeSingle(uncoreEventList); PmuEventListFreeSingle(traceEventList); + checkCoreEventList.clear(); 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