diff --git a/pmu/perf_counter.cpp b/pmu/perf_counter.cpp index 6262003f699b7ecca854fb58be7f21ff88d6cb7d..cc7589f88f548c8a8ba702c6d99dc4931a4f94d6 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 ad2ed043b09915d557ba03e56ff753ca68cc7ddc..5b0e61b13834a13ab5a5705febb23bb363d48443 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 ba4f7039432e805c0525ab9f77725b3f7f71d6fe..fbbb93bf3393780dd3d86197dc23f1b91427c49a 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; @@ -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;jcollectType = collectType; int type = GetSpeType(); if (type == -1) { diff --git a/pmu/pfm/trace.cpp b/pmu/pfm/trace.cpp index e083e5921cf0a5ef021a993e591264f221ba9bc4..c0c9b56ad0699641eaffcf699712cc7fa0edb24b 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 382802d8a0feece548f1aa989f3abb81eed61a69..ce2128f035e4eeea012b6139450d6f80f366b74e 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.cpp b/pmu/pmu.cpp index 5c8d888938dafb17eb83925da2a9d592233ca755..185db0f0fa54bb7356536446233f4c20777ea7c8 100644 --- a/pmu/pmu.cpp +++ b/pmu/pmu.cpp @@ -129,6 +129,10 @@ void AppendChildEvents(char* evt, unordered_map& 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 b16b1d7d17aa94ef14b6be9296a6a53feaf8c59d..5be2d87afe6f4aaf0cba5990c417b8193f4b527d 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) { @@ -125,6 +126,9 @@ const char** QueryUncoreEvent(unsigned *numEvt) DIR* dir; struct dirent* entry; dir = opendir(SYS_DEVICES.c_str()); + if (dir == nullptr) { + return nullptr; + } while ((entry = readdir(dir)) != nullptr) { if (entry->d_type == DT_DIR) { string folderName = entry->d_name; @@ -148,6 +152,9 @@ const char** QueryTraceEvent(unsigned *numEvt) DIR* dir; struct dirent* entry; dir = opendir(TRACE_FOLDER.c_str()); + if (dir == nullptr) { + return nullptr; + } while ((entry = readdir(dir)) != nullptr) { if (entry->d_type == DT_DIR) { string folderName = entry->d_name; @@ -162,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; }