125 lines
4.0 KiB
Diff
125 lines
4.0 KiB
Diff
From 837ab95c606351cf258959cd33f9b2a7d3c0b5f9 Mon Sep 17 00:00:00 2001
|
|
From: John Garry <john.garry@huawei.com>
|
|
Date: Fri, 28 Jun 2019 22:35:49 +0800
|
|
Subject: [PATCH 024/201] perf pmu: Support more complex PMU event aliasing
|
|
|
|
mainline inclusion
|
|
from mainline-v5.3-rc1
|
|
commit 730670b1d108c4a8aa1924762738ca38593ee44c
|
|
category: feature
|
|
bugzilla: https://gitee.com/openeuler/kernel/issues/I8C0CX
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=730670b1d108c4a8aa1924762738ca38593ee44c
|
|
|
|
------------------------------------------------------------------------
|
|
|
|
The jevent "Unit" field is used for uncore PMU alias definition.
|
|
|
|
The form uncore_pmu_example_X is supported, where "X" is a wildcard, to
|
|
support multiple instances of the same PMU in a system.
|
|
|
|
Unfortunately this format not suitable for all uncore PMUs; take the
|
|
Hisi DDRC uncore PMU for example, where the name is in the form
|
|
hisi_scclX_ddrcY.
|
|
|
|
For for current jevent parsing, we would be required to hardcode an
|
|
uncore alias translation for each possible value of X. This is not
|
|
scalable.
|
|
|
|
Instead, add support for "Unit" field in the form "hisi_sccl,ddrc",
|
|
where we can match by hisi_scclX and ddrcY. Tokens in Unit field are
|
|
delimited by ','.
|
|
|
|
Signed-off-by: John Garry <john.garry@huawei.com>
|
|
Acked-by: Jiri Olsa <jolsa@kernel.org>
|
|
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
|
|
Cc: Andi Kleen <ak@linux.intel.com>
|
|
Cc: Ben Hutchings <ben@decadent.org.uk>
|
|
Cc: Hendrik Brueckner <brueckner@linux.ibm.com>
|
|
Cc: Kan Liang <kan.liang@linux.intel.com>
|
|
Cc: Mark Rutland <mark.rutland@arm.com>
|
|
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
|
|
Cc: Namhyung Kim <namhyung@kernel.org>
|
|
Cc: Peter Zijlstra <peterz@infradead.org>
|
|
Cc: Shaokun Zhang <zhangshaokun@hisilicon.com>
|
|
Cc: Thomas Richter <tmricht@linux.ibm.com>
|
|
Cc: Will Deacon <will.deacon@arm.com>
|
|
Cc: linux-arm-kernel@lists.infradead.org
|
|
Cc: linuxarm@huawei.com
|
|
Link: http://lkml.kernel.org/r/1561732552-143038-2-git-send-email-john.garry@huawei.com
|
|
[ Shut up older gcc complianing about the last arg to strtok_r() being uninitialized, set that tmp to NULL ]
|
|
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
|
|
Signed-off-by: hongrongxuan <hongrongxuan@huawei.com>
|
|
---
|
|
tools/perf/util/pmu.c | 46 ++++++++++++++++++++++++++++++++++++++-----
|
|
1 file changed, 41 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
|
|
index 256a9792bd7e..147989e2bff0 100644
|
|
--- a/tools/perf/util/pmu.c
|
|
+++ b/tools/perf/util/pmu.c
|
|
@@ -741,6 +741,46 @@ struct pmu_events_map *perf_pmu__find_map(struct perf_pmu *pmu)
|
|
return map;
|
|
}
|
|
|
|
+static bool pmu_uncore_alias_match(const char *pmu_name, const char *name)
|
|
+{
|
|
+ char *tmp = NULL, *tok, *str;
|
|
+ bool res;
|
|
+
|
|
+ str = strdup(pmu_name);
|
|
+ if (!str)
|
|
+ return false;
|
|
+
|
|
+ /*
|
|
+ * uncore alias may be from different PMU with common prefix
|
|
+ */
|
|
+ tok = strtok_r(str, ",", &tmp);
|
|
+ if (strncmp(pmu_name, tok, strlen(tok))) {
|
|
+ res = false;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Match more complex aliases where the alias name is a comma-delimited
|
|
+ * list of tokens, orderly contained in the matching PMU name.
|
|
+ *
|
|
+ * Example: For alias "socket,pmuname" and PMU "socketX_pmunameY", we
|
|
+ * match "socket" in "socketX_pmunameY" and then "pmuname" in
|
|
+ * "pmunameY".
|
|
+ */
|
|
+ for (; tok; name += strlen(tok), tok = strtok_r(NULL, ",", &tmp)) {
|
|
+ name = strstr(name, tok);
|
|
+ if (!name) {
|
|
+ res = false;
|
|
+ goto out;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ res = true;
|
|
+out:
|
|
+ free(str);
|
|
+ return res;
|
|
+}
|
|
+
|
|
/*
|
|
* From the pmu_events_map, find the table of PMU events that corresponds
|
|
* to the current running CPU. Then, add all PMU events from that table
|
|
@@ -771,12 +811,8 @@ static void pmu_add_cpu_aliases(struct list_head *head, struct perf_pmu *pmu)
|
|
break;
|
|
}
|
|
|
|
- /*
|
|
- * uncore alias may be from different PMU
|
|
- * with common prefix
|
|
- */
|
|
if (pmu_is_uncore(name) &&
|
|
- !strncmp(pname, name, strlen(pname)))
|
|
+ pmu_uncore_alias_match(pname, name))
|
|
goto new_alias;
|
|
|
|
if (strcmp(pname, name))
|
|
--
|
|
2.27.0
|
|
|