From 490bc1ed18adccb9fe412b883c78cb4fe4c4301b Mon Sep 17 00:00:00 2001 From: Junyi Ye <294572668@qq.com> Date: Sun, 28 Apr 2024 15:12:15 +0800 Subject: [PATCH 1/2] Fix uncore counting bug and perf list init problem. --- pmu/perf_counter.cpp | 7 ++++++- pmu/pfm/core.cpp | 4 ++-- pmu/pfm/pfm.cpp | 4 ++-- pmu/pfm/trace.cpp | 2 +- pmu/pfm/uncore.cpp | 2 +- pmu/pmu_event_list.cpp | 10 ++++++++-- 6 files changed, 20 insertions(+), 9 deletions(-) diff --git a/pmu/perf_counter.cpp b/pmu/perf_counter.cpp index 6262003..cc7589f 100644 --- a/pmu/perf_counter.cpp +++ b/pmu/perf_counter.cpp @@ -23,6 +23,7 @@ #include #include "pmu.h" #include "linked_list.h" +#include "pfm_event.h" #include "pmu_event.h" #include "pcerr.h" #include "log.h" @@ -103,7 +104,11 @@ int KUNPENG_PMU::PerfCounter::MapPerfAttr() * For now we set the format id bit to implement grouping logic in the future */ attr.read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | PERF_FORMAT_TOTAL_TIME_RUNNING | PERF_FORMAT_ID; - this->fd = PerfEventOpen(&attr, this->pid, this->cpu, -1, 0); + if (this->evt->pmuType == KUNPENG_PMU::UNCORE_TYPE) { + this->fd = PerfEventOpen(&attr, -1, this->cpu, -1, 0); + } else { + this->fd = PerfEventOpen(&attr, this->pid, this->cpu, -1, 0); + } DBG_PRINT("type: %d cpu: %d config: %X\n", attr.type, cpu, attr.config); if (__glibc_unlikely(this->fd < 0)) { return MapErrno(errno); diff --git a/pmu/pfm/core.cpp b/pmu/pfm/core.cpp index ad2ed04..5b0e61b 100644 --- a/pmu/pfm/core.cpp +++ b/pmu/pfm/core.cpp @@ -611,7 +611,7 @@ const KUNPENG_PMU::CORE_EVT_MAP KUNPENG_PMU::CORE_EVENT_MAP = { static struct PmuEvt* ConstructPmuEvtFromCore(KUNPENG_PMU::CoreConfig config, int collectType) { - auto* pmuEvtPtr = new PmuEvt; + auto* pmuEvtPtr = new PmuEvt {0}; pmuEvtPtr->config = config.config; pmuEvtPtr->name = config.eventName; pmuEvtPtr->type = config.type; @@ -666,7 +666,7 @@ static struct PmuEvt* ConstructPmuEvtFromKernel(const char* pmuName, int collect if (config == -1 || type == -1) { return nullptr; } - auto* pmuEvtPtr = new PmuEvt; + auto* pmuEvtPtr = new PmuEvt {0}; pmuEvtPtr->config = config; pmuEvtPtr->name = pmuName; pmuEvtPtr->type = type; diff --git a/pmu/pfm/pfm.cpp b/pmu/pfm/pfm.cpp index ba4f703..f856070 100644 --- a/pmu/pfm/pfm.cpp +++ b/pmu/pfm/pfm.cpp @@ -48,7 +48,7 @@ static struct PmuEvt* GetRawEvent(const char* pmuName, int collectType) if (*endPtr != '\0') { return nullptr; } - auto* pmuEvtPtr = new PmuEvt; + auto* pmuEvtPtr = new PmuEvt {0}; pmuEvtPtr->config = config; pmuEvtPtr->name = pmuName; pmuEvtPtr->type = PERF_TYPE_RAW; @@ -144,7 +144,7 @@ struct PmuEvt* PfmGetPmuEvent(const char* pmuName, int collectType) struct PmuEvt* PfmGetSpeEvent( unsigned long dataFilter, unsigned long eventFilter, unsigned long minLatency, int collectType) { - auto* evt = new PmuEvt{0}; + auto* evt = new PmuEvt {0}; evt->collectType = collectType; int type = GetSpeType(); if (type == -1) { diff --git a/pmu/pfm/trace.cpp b/pmu/pfm/trace.cpp index e083e59..c0c9b56 100644 --- a/pmu/pfm/trace.cpp +++ b/pmu/pfm/trace.cpp @@ -48,7 +48,7 @@ struct PmuEvt* GetKernelTraceEvent(const char* pmuName, int collectType) if (config == -1) { return nullptr; } - auto* pmuEvtPtr = new PmuEvt; + auto* pmuEvtPtr = new PmuEvt {0}; pmuEvtPtr->config = config; pmuEvtPtr->name = pmuName; pmuEvtPtr->type = PERF_TYPE_TRACEPOINT; diff --git a/pmu/pfm/uncore.cpp b/pmu/pfm/uncore.cpp index 382802d..ce2128f 100644 --- a/pmu/pfm/uncore.cpp +++ b/pmu/pfm/uncore.cpp @@ -117,7 +117,7 @@ struct PmuEvt* GetUncoreEvent(const char* pmuName, int collectType) if (config == -1) { return nullptr; } - auto* pmuEvtPtr = new PmuEvt; + auto* pmuEvtPtr = new PmuEvt {0}; pmuEvtPtr->config = config; pmuEvtPtr->name = pmuName; pmuEvtPtr->pmuType = UNCORE_TYPE; diff --git a/pmu/pmu_event_list.cpp b/pmu/pmu_event_list.cpp index b16b1d7..0512fbb 100644 --- a/pmu/pmu_event_list.cpp +++ b/pmu/pmu_event_list.cpp @@ -124,7 +124,10 @@ const char** QueryUncoreEvent(unsigned *numEvt) } DIR* dir; struct dirent* entry; - dir = opendir(SYS_DEVICES.c_str()); + if ((dir = opendir(SYS_DEVICES.c_str())) == nullptr) { + New(LIBPERF_ERR_FOLDER_PATH_INACCESSIBLE, "Could not open \"/sys/devices/\""); + return; + } while ((entry = readdir(dir)) != nullptr) { if (entry->d_type == DT_DIR) { string folderName = entry->d_name; @@ -147,7 +150,10 @@ const char** QueryTraceEvent(unsigned *numEvt) } DIR* dir; struct dirent* entry; - dir = opendir(TRACE_FOLDER.c_str()); + if (dir = opendir(TRACE_FOLDER.c_str())) == nullptr) { + New(LIBPERF_ERR_FOLDER_PATH_INACCESSIBLE, "Could not open \"/sys/kernel/tracing/events/\""); + return; + } while ((entry = readdir(dir)) != nullptr) { if (entry->d_type == DT_DIR) { string folderName = entry->d_name; -- Gitee From e9378372414e5447b87cc73e0d38ba4bbc9463a7 Mon Sep 17 00:00:00 2001 From: Junyi Ye <294572668@qq.com> Date: Sun, 28 Apr 2024 17:44:59 +0800 Subject: [PATCH 2/2] cleancode --- pmu/pfm/pfm.cpp | 3 ++ pmu/pmu.cpp | 4 +++ pmu/pmu_event_list.cpp | 71 +++++++++++++++++++++++++++--------------- 3 files changed, 53 insertions(+), 25 deletions(-) diff --git a/pmu/pfm/pfm.cpp b/pmu/pfm/pfm.cpp index f856070..fbbb93b 100644 --- a/pmu/pfm/pfm.cpp +++ b/pmu/pfm/pfm.cpp @@ -94,6 +94,9 @@ static bool CheckEventInList(enum PmuEventType eventType, const char *pmuName) { unsigned numEvt; auto eventList = PmuEventList(eventType, &numEvt); + if (eventList == nullptr) { + return false; + } for (int j=0;j& eventSplitMap) string evtName = strName.substr(devName.size() + 1, strName.size() - 1 - (devName.size() + 1)); auto numEvt = uncoreEventPair.first; auto uncoreEventList = uncoreEventPair.second; + if (uncoreEventList == nullptr) { + New(LIBPERF_ERR_INVALID_EVENT, "Invalid uncore event list"); + return; + } for (int i = 0; i < numEvt; ++i) { auto uncoreEvent = uncoreEventList[i]; if (strncmp(uncoreEvent, devName.c_str(), devName.length()) == 0 && diff --git a/pmu/pmu_event_list.cpp b/pmu/pmu_event_list.cpp index 0512fbb..5be2d87 100644 --- a/pmu/pmu_event_list.cpp +++ b/pmu/pmu_event_list.cpp @@ -39,12 +39,13 @@ static void GetEventName(const string& devName, vector& eventList) DIR* dir; struct dirent* entry; auto path = SYS_DEVICES + devName + EVENT_DIR; - if ((dir = opendir(path.c_str())) == nullptr) { - New(LIBPERF_ERR_FOLDER_PATH_INACCESSIBLE, "Could not open \"/sys/devices/\""); + dir = opendir(path.c_str()); + if (dir == nullptr) { return; } while ((entry = readdir(dir)) != nullptr) { if (entry->d_type != DT_REG) { // Check if it is a regular file + continue; } string fileName(entry->d_name); @@ -63,8 +64,8 @@ static void GetTraceSubFolder(const string& devName, vector& eventL DIR* dir; struct dirent* entry; auto path = TRACE_FOLDER + devName; - if ((dir = opendir(path.c_str())) == nullptr) { - New(LIBPERF_ERR_FOLDER_PATH_INACCESSIBLE, "Could not open " + path); + dir = opendir(path.c_str()); + if (dir == nullptr) { return; } while ((entry = readdir(dir)) != nullptr) { @@ -99,8 +100,8 @@ const char** QueryCoreEvent(unsigned *numEvt) 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); + dir = opendir(path.c_str()); + if (dir == nullptr) { return nullptr; } while ((entry = readdir(dir)) != nullptr) { @@ -124,9 +125,9 @@ const char** QueryUncoreEvent(unsigned *numEvt) } DIR* dir; struct dirent* entry; - if ((dir = opendir(SYS_DEVICES.c_str())) == nullptr) { - New(LIBPERF_ERR_FOLDER_PATH_INACCESSIBLE, "Could not open \"/sys/devices/\""); - return; + dir = opendir(SYS_DEVICES.c_str()); + if (dir == nullptr) { + return nullptr; } while ((entry = readdir(dir)) != nullptr) { if (entry->d_type == DT_DIR) { @@ -150,9 +151,9 @@ const char** QueryTraceEvent(unsigned *numEvt) } DIR* dir; struct dirent* entry; - if (dir = opendir(TRACE_FOLDER.c_str())) == nullptr) { - New(LIBPERF_ERR_FOLDER_PATH_INACCESSIBLE, "Could not open \"/sys/kernel/tracing/events/\""); - return; + dir = opendir(TRACE_FOLDER.c_str()); + if (dir == nullptr) { + return nullptr; } while ((entry = readdir(dir)) != nullptr) { if (entry->d_type == DT_DIR) { @@ -168,19 +169,39 @@ const char** QueryTraceEvent(unsigned *numEvt) return traceEventList.data(); } -const char** QueryAllEvent(unsigned *numEvt) -{ - unsigned coreNum; - unsigned uncoreNum; - unsigned traceNum; - auto coreList = QueryCoreEvent(&coreNum); - auto uncoreList = QueryUncoreEvent(&uncoreNum); - auto traceList = QueryTraceEvent(&traceNum); - *numEvt = coreNum + uncoreNum + traceNum; - const char** combinedList = new const char* [*numEvt]; - memcpy(combinedList, coreList, coreNum * sizeof(char*)); - memcpy(combinedList + coreNum, uncoreList, uncoreNum * sizeof(char*)); - memcpy(combinedList + coreNum + uncoreNum, traceList, traceNum * sizeof(char*)); +const char** QueryAllEvent(unsigned *numEvt) { + unsigned coreNum, uncoreNum, traceNum; + const char** coreList = QueryCoreEvent(&coreNum); + const char** uncoreList = QueryUncoreEvent(&uncoreNum); + const char** traceList = QueryTraceEvent(&traceNum); + + unsigned totalSize = 0; + if (coreList != nullptr) { + totalSize += coreNum; + } + if (uncoreList != nullptr) { + totalSize += uncoreNum; + } + if (traceList != nullptr) { + totalSize += traceNum; + } + + const char** combinedList = new const char*[totalSize]; + unsigned index = 0; + + if (coreList != nullptr) { + memcpy(combinedList, coreList, coreNum * sizeof(const char*)); + index += coreNum; + } + if (uncoreList != nullptr) { + memcpy(combinedList + index, uncoreList, uncoreNum * sizeof(const char*)); + index += uncoreNum; + } + if (traceList != nullptr) { + memcpy(combinedList + index, traceList, traceNum * sizeof(const char*)); + } + + *numEvt = totalSize; return combinedList; } -- Gitee