libkperf/0005-pmu-event.patch
2024-11-19 20:29:04 +08:00

148 lines
4.7 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From 4a084d12ceb0129c8b901798282ef89f3df13bf2 Mon Sep 17 00:00:00 2001
From: ganlixiong <ganli2012@gmail.com>
Date: Fri, 11 Oct 2024 10:50:07 +0800
Subject: [PATCH 05/20] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9C=A8=E6=9F=90?=
=?UTF-8?q?=E4=BA=9B=E7=8E=AF=E5=A2=83=E4=B8=8A=E6=97=A0=E6=B3=95=E8=AF=BB?=
=?UTF-8?q?=E5=8F=96=E5=88=B0pmu=20event=E7=9A=84=E9=97=AE=E9=A2=98?=
=?UTF-8?q?=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
问题:
在某些环境上调用PmuEventList返回的事件列表为空。
原因:
该环境上的arm core设备名称为armv8_pmuv3而在查询事件列表时搜索了armv8_pmuv3_0设备的事件。
解决方法:
动态寻找arm core设备而不是用硬编码。参考perf
tool的实现查询devices下面的所有设备如果设备下面包含文件cpus那么认为该设备为arm
core设备。
---
pmu/pfm/core.cpp | 44 +++++++++++++++++++++++++++++++++++++++---
pmu/pfm/core.h | 2 ++
pmu/pmu_event_list.cpp | 10 ++++++++--
3 files changed, 51 insertions(+), 5 deletions(-)
diff --git a/pmu/pfm/core.cpp b/pmu/pfm/core.cpp
index 80d5e0b..0ab4607 100644
--- a/pmu/pfm/core.cpp
+++ b/pmu/pfm/core.cpp
@@ -15,6 +15,7 @@
#include <vector>
#include <unordered_map>
#include <fstream>
+#include <dirent.h>
#include "pmu_event.h"
#include "core.h"
#include "common.h"
@@ -22,7 +23,7 @@
using namespace std;
using PMU_PAIR = std::pair<std::string, KUNPENG_PMU::CoreConfig>;
static CHIP_TYPE g_chipType = UNDEFINED_TYPE;
-
+static string pmuDevice = "";
namespace SOFTWARE_EVENT {
PMU_PAIR ALIGNMENT_FAULTS = {
@@ -853,7 +854,11 @@ static struct PmuEvt* ConstructPmuEvtFromCore(KUNPENG_PMU::CoreConfig config, in
static int64_t GetKernelCoreEventConfig(const string &name)
{
- string eventPath = "/sys/devices/armv8_pmuv3_0/events/" + name;
+ auto pmuDevicePath = GetPmuDevicePath();
+ if (pmuDevicePath.empty()) {
+ return -1;
+ }
+ string eventPath = pmuDevicePath + "/events/" + name;
string realPath = GetRealPath(eventPath);
if (!IsValidPath(realPath)) {
return -1;
@@ -874,7 +879,11 @@ static int64_t GetKernelCoreEventConfig(const string &name)
static int64_t GetKernelCoreEventType()
{
- string eventPath = "/sys/devices/armv8_pmuv3_0/type";
+ auto pmuDevicePath = GetPmuDevicePath();
+ if (pmuDevicePath.empty()) {
+ return -1;
+ }
+ string eventPath = pmuDevicePath + "/type";
string realPath = GetRealPath(eventPath);
if (!IsValidPath(realPath)) {
return -1;
@@ -917,4 +926,33 @@ struct PmuEvt* GetCoreEvent(const char* pmuName, int collectType)
return ConstructPmuEvtFromCore(KUNPENG_PMU::CORE_EVENT_MAP.at(g_chipType).at(pmuName), collectType);
}
return ConstructPmuEvtFromKernel(pmuName, collectType);
+}
+
+std::string GetPmuDevicePath()
+{
+ if (!pmuDevice.empty()) {
+ return pmuDevice;
+ }
+
+ static const string DEVICE_PATH = "/sys/bus/event_source/devices/";
+ DIR *dir = opendir(DEVICE_PATH.c_str());
+ if (dir == nullptr) {
+ return "";
+ }
+ struct dirent *dent;
+ while (dent = readdir(dir)) {
+ if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, "..") || !strcmp(dent->d_name, "cpu")) {
+ continue;
+ }
+
+ // look for devices like /sys/bus/event_source/devices/armv8_pmuv3_0/cpus.
+ // Refer to function <is_arm_pmu_core> in kernel.
+ string armPmuPath = DEVICE_PATH + dent->d_name + "/cpus";
+ if (ExistPath(armPmuPath)) {
+ pmuDevice = DEVICE_PATH + dent->d_name;
+ break;
+ }
+ }
+
+ return pmuDevice;
}
\ No newline at end of file
diff --git a/pmu/pfm/core.h b/pmu/pfm/core.h
index 0df6a25..4ecf3fe 100644
--- a/pmu/pfm/core.h
+++ b/pmu/pfm/core.h
@@ -24,5 +24,7 @@ namespace KUNPENG_PMU {
struct PmuEvt* GetCoreEvent(const char* pmuName, int collectType);
+std::string GetPmuDevicePath();
+
#endif
diff --git a/pmu/pmu_event_list.cpp b/pmu/pmu_event_list.cpp
index 2007561..c4cf226 100644
--- a/pmu/pmu_event_list.cpp
+++ b/pmu/pmu_event_list.cpp
@@ -127,10 +127,16 @@ const char** QueryCoreEvent(unsigned *numEvt)
}
DIR* dir;
struct dirent* entry;
- string path = "/sys/devices/armv8_pmuv3_0/events/";
+ auto pmuDevPath = GetPmuDevicePath();
+ if (pmuDevPath.empty()) {
+ *numEvt = coreEventList.size();
+ return coreEventList.data();
+ }
+ string path = pmuDevPath + "/events/";
dir = opendir(path.c_str());
if (dir == nullptr) {
- return nullptr;
+ *numEvt = coreEventList.size();
+ return coreEventList.data();
}
while ((entry = readdir(dir)) != nullptr) {
if (entry->d_type == DT_REG) {
--
2.43.0