diff --git a/include/pmu.h b/include/pmu.h index 92c1c54df4afd27c3b4961c82d27345bdc231336..45508c3c216980b2313bad6dcf1cd6d1f0a6a16f 100644 --- a/include/pmu.h +++ b/include/pmu.h @@ -143,7 +143,7 @@ const char** PmuEventList(enum PmuEventType eventType, unsigned *numEvt); * @param eventList event list * @param numEvt length of event list */ -void PmuEventListFree(const char** eventList, unsigned *numEvt); +void PmuEventListFree(); /** * @brief diff --git a/pmu/pfm/core.cpp b/pmu/pfm/core.cpp index aa7dd54354d26fcdd797017dd1ed07652acc5254..c3174d4ed6fa1ddfce88daa7f9c0e05af6155563 100644 --- a/pmu/pfm/core.cpp +++ b/pmu/pfm/core.cpp @@ -14,15 +14,19 @@ ******************************************************************************/ #include #include -#include -#include "pmu.h" +#include +#include "pmu_event.h" #include "core.h" +#include "common.h" + +using namespace std; +static CHIP_TYPE g_chipType = UNDEFINED_TYPE; const std::unordered_map HIP_A_CORE_PMU_MAP{ { KUNPENG_PMU::HIP_A::CORE::BRANCH_MISSES, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x5, KUNPENG_PMU::HIP_A::CORE::BRANCH_MISSES } @@ -30,7 +34,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::BUS_CYCLES, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x6, KUNPENG_PMU::HIP_A::CORE::BUS_CYCLES } @@ -38,7 +42,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::CACHE_MISSES, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x3, KUNPENG_PMU::HIP_A::CORE::CACHE_MISSES } @@ -46,7 +50,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::CACHE_REFERENCES, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x2, KUNPENG_PMU::HIP_A::CORE::CACHE_REFERENCES } @@ -54,7 +58,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::CPU_CYCLES, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x11, KUNPENG_PMU::HIP_A::CORE::CPU_CYCLES } @@ -62,7 +66,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::CYCLES, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x11, KUNPENG_PMU::HIP_A::CORE::CYCLES } @@ -70,7 +74,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::INSTRUCTIONS, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x1, KUNPENG_PMU::HIP_A::CORE::INSTRUCTIONS } @@ -78,7 +82,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::STALLED_CYCLES_BACKEND, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x8, KUNPENG_PMU::HIP_A::CORE::STALLED_CYCLES_BACKEND } @@ -86,7 +90,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::STALLED_CYCLES_FRONTEND, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x7, KUNPENG_PMU::HIP_A::CORE::STALLED_CYCLES_FRONTEND } @@ -94,7 +98,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::L1_DCACHE_LOAD_MISSES, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x10000, KUNPENG_PMU::HIP_A::CORE::L1_DCACHE_LOAD_MISSES } @@ -102,7 +106,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::IDLE_CYCLES_BACKEND, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x8, KUNPENG_PMU::HIP_A::CORE::IDLE_CYCLES_BACKEND } @@ -110,7 +114,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::L1_ICACHE_LOAD_MISSES, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x10001, KUNPENG_PMU::HIP_A::CORE::L1_ICACHE_LOAD_MISSES } @@ -118,7 +122,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::IDLE_CYCLES_FRONTEND, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x7, KUNPENG_PMU::HIP_A::CORE::IDLE_CYCLES_FRONTEND } @@ -126,7 +130,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::L1_ICACHE_LOADS, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x1, KUNPENG_PMU::HIP_A::CORE::L1_ICACHE_LOADS } @@ -134,7 +138,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::LLC_LOAD_MISSES, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x10002, KUNPENG_PMU::HIP_A::CORE::LLC_LOAD_MISSES } @@ -142,7 +146,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::LLC_LOADS, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x2, KUNPENG_PMU::HIP_A::CORE::LLC_LOADS } @@ -150,7 +154,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::BRANCH_LOAD_MISSES, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x10005, KUNPENG_PMU::HIP_A::CORE::BRANCH_LOAD_MISSES } @@ -158,7 +162,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::BRANCH_LOADS, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x5, KUNPENG_PMU::HIP_A::CORE::BRANCH_LOADS } @@ -166,7 +170,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::DTLB_LOAD_MISSES, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x10003, KUNPENG_PMU::HIP_A::CORE::DTLB_LOAD_MISSES } @@ -174,7 +178,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::DTLB_LOADS, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x3, KUNPENG_PMU::HIP_A::CORE::DTLB_LOADS } @@ -182,7 +186,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::ITLB_LOAD_MISSES, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x10004, KUNPENG_PMU::HIP_A::CORE::ITLB_LOAD_MISSES } @@ -190,7 +194,7 @@ const std::unordered_map HIP_A_CORE_PMU_MA { KUNPENG_PMU::HIP_A::CORE::ITLB_LOADS, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x4, KUNPENG_PMU::HIP_A::CORE::ITLB_LOADS } @@ -433,7 +437,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::BRANCH_MISSES, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x5, KUNPENG_PMU::HIP_B::CORE::BRANCH_MISSES } @@ -441,7 +445,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::CACHE_MISSES, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x3, KUNPENG_PMU::HIP_B::CORE::CACHE_MISSES } @@ -449,7 +453,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::CACHE_REFERENCES, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x2, KUNPENG_PMU::HIP_B::CORE::CACHE_REFERENCES } @@ -457,7 +461,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::CPU_CYCLES, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x11, KUNPENG_PMU::HIP_B::CORE::CPU_CYCLES } @@ -465,7 +469,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::CYCLES, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x11, KUNPENG_PMU::HIP_B::CORE::CYCLES } @@ -473,7 +477,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::INSTRUCTIONS, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x1, KUNPENG_PMU::HIP_B::CORE::INSTRUCTIONS } @@ -481,7 +485,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::STALLED_CYCLES_BACKEND, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x8, KUNPENG_PMU::HIP_B::CORE::STALLED_CYCLES_BACKEND } @@ -489,7 +493,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::STALLED_CYCLES_FRONTEND, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x7, KUNPENG_PMU::HIP_B::CORE::STALLED_CYCLES_FRONTEND } @@ -497,7 +501,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::L1_DCACHE_LOAD_MISSES, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x10000, KUNPENG_PMU::HIP_B::CORE::L1_DCACHE_LOAD_MISSES } @@ -505,7 +509,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::IDLE_CYCLES_BACKEND, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x8, KUNPENG_PMU::HIP_B::CORE::IDLE_CYCLES_BACKEND } @@ -513,7 +517,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::L1_ICACHE_LOAD_MISSES, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x10001, KUNPENG_PMU::HIP_B::CORE::L1_ICACHE_LOAD_MISSES } @@ -521,7 +525,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::IDLE_CYCLES_FRONTEND, { - PERF_TYPE_RAW, + PERF_TYPE_HARDWARE, 0x7, KUNPENG_PMU::HIP_B::CORE::IDLE_CYCLES_FRONTEND } @@ -529,7 +533,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::L1_ICACHE_LOADS, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x1, KUNPENG_PMU::HIP_B::CORE::L1_ICACHE_LOADS } @@ -537,7 +541,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::LLC_LOAD_MISSES, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x10002, KUNPENG_PMU::HIP_B::CORE::LLC_LOAD_MISSES } @@ -545,7 +549,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::LLC_LOADS, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x2, KUNPENG_PMU::HIP_B::CORE::LLC_LOADS } @@ -553,7 +557,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::BRANCH_LOAD_MISSES, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x10005, KUNPENG_PMU::HIP_B::CORE::BRANCH_LOAD_MISSES } @@ -561,7 +565,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::BRANCH_LOADS, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x5, KUNPENG_PMU::HIP_B::CORE::BRANCH_LOADS } @@ -569,7 +573,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::DTLB_LOAD_MISSES, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x10003, KUNPENG_PMU::HIP_B::CORE::DTLB_LOAD_MISSES } @@ -577,7 +581,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::DTLB_LOADS, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x3, KUNPENG_PMU::HIP_B::CORE::DTLB_LOADS } @@ -585,7 +589,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::ITLB_LOAD_MISSES, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x10004, KUNPENG_PMU::HIP_B::CORE::ITLB_LOAD_MISSES } @@ -593,7 +597,7 @@ const std::unordered_map HIP_B_CORE_PMU_MA { KUNPENG_PMU::HIP_B::CORE::ITLB_LOADS, { - PERF_TYPE_RAW, + PERF_TYPE_HW_CACHE, 0x4, KUNPENG_PMU::HIP_B::CORE::ITLB_LOADS } @@ -603,4 +607,84 @@ const std::unordered_map HIP_B_CORE_PMU_MA const KUNPENG_PMU::CORE_EVT_MAP KUNPENG_PMU::CORE_EVENT_MAP = { {CHIP_TYPE::HIPA, HIP_A_CORE_PMU_MAP}, {CHIP_TYPE::HIPB, HIP_B_CORE_PMU_MAP}, -}; \ No newline at end of file +}; + +static struct PmuEvt* ConstructPmuEvtFromCore(KUNPENG_PMU::CoreConfig config, int collectType) +{ + auto* pmuEvtPtr = new PmuEvt; + pmuEvtPtr->config = config.config; + pmuEvtPtr->name = config.eventName; + pmuEvtPtr->type = config.type; + pmuEvtPtr->pmuType = KUNPENG_PMU::CORE_TYPE; + pmuEvtPtr->collectType = collectType; + pmuEvtPtr->cpumask = -1; + return pmuEvtPtr; +} + +static int64_t GetKernelCoreEventConfig(const string &name) +{ + string eventPath = "/sys/devices/armv8_pmuv3_0/events/" + name; + string realPath = GetRealPath(eventPath); + if (!IsValidPath(realPath)) { + return -1; + } + ifstream evtIn(realPath); + if (!evtIn.is_open()) { + return -1; + } + string configStr; + evtIn >> configStr; + auto findEq = configStr.find('='); + if (findEq == string::npos) { + return -1; + } + auto subStr = configStr.substr(findEq + 1, configStr.size() - findEq); + return stoi(subStr, nullptr, 16); +} + +static int64_t GetKernelCoreEventType() +{ + string eventPath = "/sys/devices/armv8_pmuv3_0/type"; + string realPath = GetRealPath(eventPath); + if (!IsValidPath(realPath)) { + return -1; + } + ifstream typeIn(realPath); + if (!typeIn.is_open()) { + return -1; + } + string typeStr; + typeIn >> typeStr; + + return stoi(typeStr); +} + +static struct PmuEvt* ConstructPmuEvtFromKernel(const char* pmuName, int collectType) +{ + int64_t config = GetKernelCoreEventConfig(pmuName); + int64_t type = GetKernelCoreEventType(); + if (config == -1 || type == -1) { + return nullptr; + } + auto* pmuEvtPtr = new PmuEvt; + pmuEvtPtr->config = config; + pmuEvtPtr->name = pmuName; + pmuEvtPtr->type = type; + pmuEvtPtr->pmuType = KUNPENG_PMU::CORE_TYPE; + pmuEvtPtr->collectType = collectType; + pmuEvtPtr->cpumask = -1; + return pmuEvtPtr; +} + +struct PmuEvt* GetCoreEvent(const char* pmuName, int collectType) +{ + g_chipType = GetCpuType(); + if (g_chipType == UNDEFINED_TYPE) { + return nullptr; + } + auto coreMap = KUNPENG_PMU::CORE_EVENT_MAP.at(g_chipType); + if (coreMap.find(pmuName) != coreMap.end()) { + return ConstructPmuEvtFromCore(KUNPENG_PMU::CORE_EVENT_MAP.at(g_chipType).at(pmuName), collectType); + } + return ConstructPmuEvtFromKernel(pmuName, collectType); +} \ No newline at end of file diff --git a/pmu/pfm/core.h b/pmu/pfm/core.h index 1e0ca229310c91d42d913269cd1325bae964632b..4c7809bf24b26b0cb31bfb074be70b6b50db7997 100644 --- a/pmu/pfm/core.h +++ b/pmu/pfm/core.h @@ -22,5 +22,7 @@ namespace KUNPENG_PMU { extern const CORE_EVT_MAP CORE_EVENT_MAP; } +struct PmuEvt* GetCoreEvent(const char* pmuName, int collectType); + #endif diff --git a/pmu/pfm/pfm.cpp b/pmu/pfm/pfm.cpp index 4b46838a289888d2e0994686df036a43c1088a7e..ba4f7039432e805c0525ab9f77725b3f7f71d6fe 100644 --- a/pmu/pfm/pfm.cpp +++ b/pmu/pfm/pfm.cpp @@ -38,7 +38,6 @@ using namespace pcerr; using namespace KUNPENG_PMU; static constexpr int MAX_STRING_LEN = 2048; -static CHIP_TYPE g_chipType = UNDEFINED_TYPE; static struct PmuEvt* GetRawEvent(const char* pmuName, int collectType) { @@ -49,35 +48,14 @@ static struct PmuEvt* GetRawEvent(const char* pmuName, int collectType) if (*endPtr != '\0') { return nullptr; } - struct PmuEvt* pmuEvtPtr = new PmuEvt; + auto* pmuEvtPtr = new PmuEvt; pmuEvtPtr->config = config; pmuEvtPtr->name = pmuName; pmuEvtPtr->type = PERF_TYPE_RAW; pmuEvtPtr->pmuType = CORE_TYPE; pmuEvtPtr->collectType = collectType; pmuEvtPtr->cpumask = -1; - return std::move(pmuEvtPtr); -} - -static struct PmuEvt* ConstructPmuEvtFromCore(KUNPENG_PMU::CoreConfig config, int collectType) -{ - struct PmuEvt* pmuEvtPtr = new PmuEvt; - pmuEvtPtr->config = config.config; - pmuEvtPtr->name = config.eventName; - pmuEvtPtr->type = config.type; - pmuEvtPtr->pmuType = CORE_TYPE; - pmuEvtPtr->collectType = collectType; - pmuEvtPtr->cpumask = -1; - return std::move(pmuEvtPtr); -} - -static struct PmuEvt* GetCoreEvent(const char* pmuName, int collectType) -{ - return KUNPENG_PMU::CORE_EVENT_MAP.at(g_chipType).find(pmuName) != - KUNPENG_PMU::CORE_EVENT_MAP.at(g_chipType).end() - ? ConstructPmuEvtFromCore( - KUNPENG_PMU::CORE_EVENT_MAP.at(g_chipType).at(pmuName), collectType) - : nullptr; + return pmuEvtPtr; } static int GetSpeType(void) @@ -112,37 +90,36 @@ static const std::unordered_map EvtMap{ {KUNPENG_PMU::TRACE_TYPE, GetKernelTraceEvent}, }; -static int GetEventType(const char *pmuName, string &evtName) +static bool CheckEventInList(enum PmuEventType eventType, const char *pmuName) +{ + unsigned numEvt; + auto eventList = PmuEventList(eventType, &numEvt); + for (int j=0;jcollectType = collectType; return evt; } - string evtName; - g_chipType = GetCpuType(); - if (g_chipType == UNDEFINED_TYPE) { - return nullptr; - } - auto type = GetEventType(pmuName, evtName); + auto type = GetEventType(pmuName); if (type == -1) { return nullptr; } struct PmuEvt* evt = (EvtMap.find(type) != EvtMap.end()) ? - EvtMap.at(type)(evtName.c_str(), collectType) : nullptr; + EvtMap.at(type)(pmuName, collectType) : nullptr; if (evt == nullptr) { return evt; } diff --git a/pmu/pfm/trace.cpp b/pmu/pfm/trace.cpp index 9e2c77addb50ee5675a8ba82bcfacc3200c13a97..e083e5921cf0a5ef021a993e591264f221ba9bc4 100644 --- a/pmu/pfm/trace.cpp +++ b/pmu/pfm/trace.cpp @@ -14,6 +14,7 @@ ******************************************************************************/ #include #include "common.h" +#include "pfm_event.h" #include "pmu_event.h" #include "trace.h" @@ -51,6 +52,7 @@ struct PmuEvt* GetKernelTraceEvent(const char* pmuName, int collectType) pmuEvtPtr->config = config; pmuEvtPtr->name = pmuName; pmuEvtPtr->type = PERF_TYPE_TRACEPOINT; + pmuEvtPtr->pmuType = TRACE_TYPE; pmuEvtPtr->collectType = collectType; pmuEvtPtr->cpumask = -1; return pmuEvtPtr; diff --git a/pmu/pmu_event_list.cpp b/pmu/pmu_event_list.cpp index 7088388a8027bfed55a84069a747645c8d5489f3..b16b1d7d17aa94ef14b6be9296a6a53feaf8c59d 100644 --- a/pmu/pmu_event_list.cpp +++ b/pmu/pmu_event_list.cpp @@ -11,9 +11,11 @@ #include #include #include +#include #include "core.h" #include "pcerr.h" #include "pmu.h" +#include "common.h" using namespace pcerr; using namespace std; @@ -30,6 +32,7 @@ static std::mutex pmuEventListMtx; static vector uncoreEventList; static vector traceEventList; +static vector coreEventList; static void GetEventName(const string& devName, vector& eventList) { @@ -50,7 +53,7 @@ static void GetEventName(const string& devName, vector& eventList) eventName += SLASH; char* eventNameCopy = new char[eventName.length() + 1]; strcpy(eventNameCopy, eventName.c_str()); - eventList.push_back(eventNameCopy); + eventList.emplace_back(eventNameCopy); } closedir(dir); } @@ -74,7 +77,7 @@ static void GetTraceSubFolder(const string& devName, vector& eventL eventName += COLON + folderName; char* eventNameCopy = new char[eventName.length() + 1]; strcpy(eventNameCopy, eventName.c_str()); - eventList.push_back(eventNameCopy); + eventList.emplace_back(eventNameCopy); } } closedir(dir); @@ -82,20 +85,43 @@ static void GetTraceSubFolder(const string& devName, vector& eventL const char** QueryCoreEvent(unsigned *numEvt) { - static vector eventList; + if (!coreEventList.empty()) { + *numEvt = coreEventList.size(); + return coreEventList.data(); + } 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()); - eventList.push_back(eventNameCopy); + coreEventList.emplace_back(eventNameCopy); + } + DIR* dir; + struct dirent* entry; + string path = "/sys/devices/armv8_pmuv3_0/events/"; + if ((dir = opendir(path.c_str())) == nullptr) { + New(LIBPERF_ERR_FOLDER_PATH_INACCESSIBLE, "Could not open " + path); + return nullptr; + } + 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); + } } - *numEvt = eventList.size(); - return eventList.data(); + closedir(dir); + *numEvt = coreEventList.size(); + return coreEventList.data(); } const char** QueryUncoreEvent(unsigned *numEvt) { + if (!uncoreEventList.empty()) { + *numEvt = uncoreEventList.size(); + return uncoreEventList.data(); + } DIR* dir; struct dirent* entry; dir = opendir(SYS_DEVICES.c_str()); @@ -115,6 +141,10 @@ const char** QueryUncoreEvent(unsigned *numEvt) const char** QueryTraceEvent(unsigned *numEvt) { + if (!traceEventList.empty()) { + *numEvt = traceEventList.size(); + return traceEventList.data(); + } DIR* dir; struct dirent* entry; dir = opendir(TRACE_FOLDER.c_str()); @@ -173,13 +203,20 @@ const char** PmuEventList(enum PmuEventType eventType, unsigned *numEvt) return eventList; } -void PmuEventListFree(const char** eventList, unsigned *numEvt) +static void PmuEventListFreeSingle(vector& eventList) { - lock_guard lg(pmuEventListMtx); - for (unsigned i = 0; i < *numEvt; i++) { - delete[] eventList[i]; + for (auto evt : eventList) { + if (evt != nullptr && evt[0] != '\0') + delete[] evt; } - uncoreEventList.clear(); - traceEventList.clear(); + eventList.clear(); +} + +void PmuEventListFree() +{ + lock_guard lg(pmuEventListMtx); + PmuEventListFreeSingle(coreEventList); + PmuEventListFreeSingle(uncoreEventList); + PmuEventListFreeSingle(traceEventList); New(SUCCESS); } \ No newline at end of file diff --git a/pmu/pmu_list.cpp b/pmu/pmu_list.cpp index acdaab02d7ac8cf56cfe77deb15c03e6e6d33901..2db23f939cb10dcf7c324321404b060f50aa49c1 100644 --- a/pmu/pmu_list.cpp +++ b/pmu/pmu_list.cpp @@ -232,6 +232,7 @@ namespace KUNPENG_PMU { EraseSpeCpu(pd); EraseParentEventMap(); SymResolverDestroy(); + PmuEventListFree(); } int PmuList::NewPd()