diff --git a/pmu/pfm/pfm.cpp b/pmu/pfm/pfm.cpp index f2ff9caa3f8995534af9e2bf94eebd6c1c8a5dc4..82f9c5b5ea8e0b8e27a787106866362eda491707 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 f5c7cb90f618af390013de1a4caa1bb9d573ba94..0fb61a8125bb374d14ac7f30d15fc874a52cc58e 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 8ae1b4c2de6e0132e3ba3a3fbd7199e3d00b34e1..ae05b17db0db9512aa7783fa94f85dec030c0a08 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