* [PATCH v7 0/8] perf vendor events: Add JSON metrics for Arm CMN
@ 2023-08-21 8:36 Jing Zhang
2023-08-21 8:36 ` [PATCH v7 1/8] perf pmu: "Compat" supports matching multiple identifiers Jing Zhang
` (8 more replies)
0 siblings, 9 replies; 27+ messages in thread
From: Jing Zhang @ 2023-08-21 8:36 UTC (permalink / raw)
To: John Garry, Ian Rogers
Cc: Will Deacon, James Clark, Arnaldo Carvalho de Melo, Mark Rutland,
Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra, Ingo Molnar,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-kernel,
linux-arm-kernel, linux-perf-users, linux-doc, Zhuo Song,
Jing Zhang, Shuai Xue
Changes since v6:
- Supplement the omitted EventCode;
- Keep the original way of ConfigCode;
- Supplement the test in empty-pmu-events.c, so that the pmu event test
can succeed when build with NO_JEVENT=1.
- Link: https://lore.kernel.org/all/1691394685-61240-1-git-send-email-renyu.zj@linux.alibaba.com/
Jing Zhang (8):
perf pmu: "Compat" supports matching multiple identifiers
perf metric: "Compat" supports matching multiple identifiers
perf vendor events: Supplement the omitted EventCode
perf jevents: Support more event fields
perf test: Make matching_pmu effective
perf test: Add pmu-event test for "Compat" and new event_field.
perf jevents: Add support for Arm CMN PMU aliasing
perf vendor events: Add JSON metrics for Arm CMN
.../pmu-events/arch/arm64/arm/cmn/sys/cmn.json | 266 +++++++++++++++++++++
.../pmu-events/arch/arm64/arm/cmn/sys/metric.json | 74 ++++++
.../pmu-events/arch/test/test_soc/sys/uncore.json | 8 +
.../pmu-events/arch/x86/alderlake/pipeline.json | 9 +
.../pmu-events/arch/x86/alderlaken/pipeline.json | 3 +
.../pmu-events/arch/x86/broadwell/pipeline.json | 4 +
.../pmu-events/arch/x86/broadwellde/pipeline.json | 4 +
.../arch/x86/broadwellde/uncore-cache.json | 2 +
.../arch/x86/broadwellde/uncore-interconnect.json | 1 +
.../arch/x86/broadwellde/uncore-memory.json | 1 +
.../arch/x86/broadwellde/uncore-power.json | 1 +
.../pmu-events/arch/x86/broadwellx/pipeline.json | 4 +
.../arch/x86/broadwellx/uncore-cache.json | 2 +
.../arch/x86/broadwellx/uncore-interconnect.json | 13 +
.../arch/x86/broadwellx/uncore-memory.json | 2 +
.../arch/x86/broadwellx/uncore-power.json | 1 +
.../pmu-events/arch/x86/cascadelakex/pipeline.json | 4 +
.../arch/x86/cascadelakex/uncore-cache.json | 2 +
.../arch/x86/cascadelakex/uncore-interconnect.json | 1 +
.../arch/x86/cascadelakex/uncore-io.json | 1 +
.../arch/x86/cascadelakex/uncore-memory.json | 1 +
.../arch/x86/cascadelakex/uncore-power.json | 1 +
.../pmu-events/arch/x86/elkhartlake/pipeline.json | 2 +
.../pmu-events/arch/x86/goldmont/pipeline.json | 3 +
.../pmu-events/arch/x86/goldmontplus/pipeline.json | 3 +
.../pmu-events/arch/x86/grandridge/pipeline.json | 3 +
.../arch/x86/graniterapids/pipeline.json | 4 +
.../perf/pmu-events/arch/x86/haswell/pipeline.json | 4 +
.../pmu-events/arch/x86/haswellx/pipeline.json | 4 +
.../pmu-events/arch/x86/haswellx/uncore-cache.json | 2 +
.../arch/x86/haswellx/uncore-interconnect.json | 14 ++
.../arch/x86/haswellx/uncore-memory.json | 2 +
.../pmu-events/arch/x86/haswellx/uncore-power.json | 1 +
.../perf/pmu-events/arch/x86/icelake/pipeline.json | 4 +
.../pmu-events/arch/x86/icelakex/pipeline.json | 4 +
.../pmu-events/arch/x86/icelakex/uncore-cache.json | 1 +
.../arch/x86/icelakex/uncore-interconnect.json | 1 +
.../arch/x86/icelakex/uncore-memory.json | 1 +
.../pmu-events/arch/x86/icelakex/uncore-power.json | 1 +
.../pmu-events/arch/x86/ivybridge/pipeline.json | 3 +
.../perf/pmu-events/arch/x86/ivytown/pipeline.json | 4 +
.../pmu-events/arch/x86/ivytown/uncore-cache.json | 2 +
.../arch/x86/ivytown/uncore-interconnect.json | 11 +
.../pmu-events/arch/x86/ivytown/uncore-memory.json | 1 +
.../pmu-events/arch/x86/ivytown/uncore-power.json | 1 +
.../pmu-events/arch/x86/jaketown/pipeline.json | 4 +
.../pmu-events/arch/x86/jaketown/uncore-cache.json | 2 +
.../arch/x86/jaketown/uncore-interconnect.json | 12 +
.../arch/x86/jaketown/uncore-memory.json | 1 +
.../pmu-events/arch/x86/jaketown/uncore-power.json | 2 +
.../arch/x86/knightslanding/pipeline.json | 3 +
.../arch/x86/knightslanding/uncore-cache.json | 1 +
.../arch/x86/knightslanding/uncore-memory.json | 4 +
.../pmu-events/arch/x86/meteorlake/pipeline.json | 8 +
.../pmu-events/arch/x86/sandybridge/pipeline.json | 4 +
.../arch/x86/sapphirerapids/pipeline.json | 5 +
.../pmu-events/arch/x86/sierraforest/pipeline.json | 4 +
.../pmu-events/arch/x86/silvermont/pipeline.json | 3 +
.../perf/pmu-events/arch/x86/skylake/pipeline.json | 4 +
.../pmu-events/arch/x86/skylakex/pipeline.json | 4 +
.../pmu-events/arch/x86/skylakex/uncore-cache.json | 2 +
.../arch/x86/skylakex/uncore-interconnect.json | 1 +
.../pmu-events/arch/x86/skylakex/uncore-io.json | 1 +
.../arch/x86/skylakex/uncore-memory.json | 1 +
.../pmu-events/arch/x86/skylakex/uncore-power.json | 1 +
.../pmu-events/arch/x86/snowridgex/pipeline.json | 2 +
.../arch/x86/snowridgex/uncore-cache.json | 1 +
.../arch/x86/snowridgex/uncore-interconnect.json | 1 +
.../arch/x86/snowridgex/uncore-memory.json | 1 +
.../arch/x86/snowridgex/uncore-power.json | 1 +
.../pmu-events/arch/x86/tigerlake/pipeline.json | 5 +
tools/perf/pmu-events/empty-pmu-events.c | 8 +
tools/perf/pmu-events/jevents.py | 21 +-
tools/perf/tests/pmu-events.c | 64 ++++-
tools/perf/util/metricgroup.c | 2 +-
tools/perf/util/pmu.c | 33 ++-
tools/perf/util/pmu.h | 1 +
77 files changed, 679 insertions(+), 9 deletions(-)
create mode 100644 tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
create mode 100644 tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json
--
1.8.3.1
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v7 1/8] perf pmu: "Compat" supports matching multiple identifiers
2023-08-21 8:36 [PATCH v7 0/8] perf vendor events: Add JSON metrics for Arm CMN Jing Zhang
@ 2023-08-21 8:36 ` Jing Zhang
2023-08-24 15:05 ` Robin Murphy
2023-08-25 4:11 ` Ian Rogers
2023-08-21 8:36 ` [PATCH v7 2/8] perf metric: " Jing Zhang
` (7 subsequent siblings)
8 siblings, 2 replies; 27+ messages in thread
From: Jing Zhang @ 2023-08-21 8:36 UTC (permalink / raw)
To: John Garry, Ian Rogers
Cc: Will Deacon, James Clark, Arnaldo Carvalho de Melo, Mark Rutland,
Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra, Ingo Molnar,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-kernel,
linux-arm-kernel, linux-perf-users, linux-doc, Zhuo Song,
Jing Zhang, Shuai Xue
The jevent "Compat" is used for uncore PMU alias or metric definitions.
The same PMU driver has different PMU identifiers due to different
hardware versions and types, but they may have some common PMU event.
Since a Compat value can only match one identifier, when adding the
same event alias to PMUs with different identifiers, each identifier
needs to be defined once, which is not streamlined enough.
So let "Compat" supports matching multiple identifiers for uncore PMU
alias. For example, the Compat value {43401;436*} can match the PMU
identifier "43401", that is, CMN600_r0p0, and the PMU identifier with
the prefix "436", that is, all CMN650, where "*" is a wildcard.
Tokens in Unit field are delimited by ';' with no spaces.
Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
Reviewed-by: John Garry <john.g.garry@oracle.com>
---
tools/perf/util/pmu.c | 33 +++++++++++++++++++++++++++++++--
tools/perf/util/pmu.h | 1 +
2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index ad209c8..6402423 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -776,6 +776,35 @@ static bool pmu_uncore_alias_match(const char *pmu_name, const char *name)
return res;
}
+bool pmu_uncore_identifier_match(const char *id, const char *compat)
+{
+ char *tmp = NULL, *tok, *str;
+ bool res;
+ int n;
+
+ /*
+ * The strdup() call is necessary here because "compat" is a const str*
+ * type and cannot be used as an argument to strtok_r().
+ */
+ str = strdup(compat);
+ if (!str)
+ return false;
+
+ tok = strtok_r(str, ";", &tmp);
+ for (; tok; tok = strtok_r(NULL, ";", &tmp)) {
+ n = strlen(tok);
+ if ((tok[n - 1] == '*' && !strncmp(id, tok, n - 1)) ||
+ !strcmp(id, tok)) {
+ res = true;
+ goto out;
+ }
+ }
+ res = false;
+out:
+ free(str);
+ return res;
+}
+
struct pmu_add_cpu_aliases_map_data {
struct list_head *head;
const char *name;
@@ -847,8 +876,8 @@ static int pmu_add_sys_aliases_iter_fn(const struct pmu_event *pe,
if (!pe->compat || !pe->pmu)
return 0;
- if (!strcmp(pmu->id, pe->compat) &&
- pmu_uncore_alias_match(pe->pmu, pmu->name)) {
+ if (pmu_uncore_alias_match(pe->pmu, pmu->name) &&
+ pmu_uncore_identifier_match(pmu->id, pe->compat)) {
__perf_pmu__new_alias(idata->head, -1,
(char *)pe->name,
(char *)pe->desc,
diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h
index b9a02de..9d4385d 100644
--- a/tools/perf/util/pmu.h
+++ b/tools/perf/util/pmu.h
@@ -241,6 +241,7 @@ void pmu_add_cpu_aliases_table(struct list_head *head, struct perf_pmu *pmu,
char *perf_pmu__getcpuid(struct perf_pmu *pmu);
const struct pmu_events_table *pmu_events_table__find(void);
const struct pmu_metrics_table *pmu_metrics_table__find(void);
+bool pmu_uncore_identifier_match(const char *id, const char *compat);
void perf_pmu_free_alias(struct perf_pmu_alias *alias);
int perf_pmu__convert_scale(const char *scale, char **end, double *sval);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v7 2/8] perf metric: "Compat" supports matching multiple identifiers
2023-08-21 8:36 [PATCH v7 0/8] perf vendor events: Add JSON metrics for Arm CMN Jing Zhang
2023-08-21 8:36 ` [PATCH v7 1/8] perf pmu: "Compat" supports matching multiple identifiers Jing Zhang
@ 2023-08-21 8:36 ` Jing Zhang
2023-08-25 4:16 ` Ian Rogers
2023-08-21 8:36 ` [PATCH v7 4/8] perf jevents: Support more event fields Jing Zhang
` (6 subsequent siblings)
8 siblings, 1 reply; 27+ messages in thread
From: Jing Zhang @ 2023-08-21 8:36 UTC (permalink / raw)
To: John Garry, Ian Rogers
Cc: Will Deacon, James Clark, Arnaldo Carvalho de Melo, Mark Rutland,
Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra, Ingo Molnar,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-kernel,
linux-arm-kernel, linux-perf-users, linux-doc, Zhuo Song,
Jing Zhang, Shuai Xue
The jevent "Compat" is used for uncore PMU alias or metric definitions.
The same PMU driver has different PMU identifiers due to different
hardware versions and types, but they may have some common PMU metric.
Since a Compat value can only match one identifier, when adding the
same metric to PMUs with different identifiers, each identifier needs
to be defined once, which is not streamlined enough.
So let "Compat" supports matching multiple identifiers for uncore PMU
metric.
Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
Reviewed-by: John Garry <john.g.garry@oracle.com>
---
tools/perf/util/metricgroup.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
index 5e9c657..ff81bc5 100644
--- a/tools/perf/util/metricgroup.c
+++ b/tools/perf/util/metricgroup.c
@@ -477,7 +477,7 @@ static int metricgroup__sys_event_iter(const struct pmu_metric *pm,
while ((pmu = perf_pmu__scan(pmu))) {
- if (!pmu->id || strcmp(pmu->id, pm->compat))
+ if (!pmu->id || !pmu_uncore_identifier_match(pmu->id, pm->compat))
continue;
return d->fn(pm, table, d->data);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v7 4/8] perf jevents: Support more event fields
2023-08-21 8:36 [PATCH v7 0/8] perf vendor events: Add JSON metrics for Arm CMN Jing Zhang
2023-08-21 8:36 ` [PATCH v7 1/8] perf pmu: "Compat" supports matching multiple identifiers Jing Zhang
2023-08-21 8:36 ` [PATCH v7 2/8] perf metric: " Jing Zhang
@ 2023-08-21 8:36 ` Jing Zhang
2023-08-23 9:12 ` Robin Murphy
2023-08-21 8:36 ` [PATCH v7 5/8] perf test: Make matching_pmu effective Jing Zhang
` (5 subsequent siblings)
8 siblings, 1 reply; 27+ messages in thread
From: Jing Zhang @ 2023-08-21 8:36 UTC (permalink / raw)
To: John Garry, Ian Rogers
Cc: Will Deacon, James Clark, Arnaldo Carvalho de Melo, Mark Rutland,
Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra, Ingo Molnar,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-kernel,
linux-arm-kernel, linux-perf-users, linux-doc, Zhuo Song,
Jing Zhang, Shuai Xue
The previous code assumes an event has either an "event=" or "config"
field at the beginning. For CMN neither of these may be present, as an
event is typically "type=xx,eventid=xxx".
If EventCode and ConfigCode is not added in the alias JSON file, the
event description will add "event=0" by default. So, even if the event
field is added "eventid=xxx" and "type=xxx", the CMN events final
parsing result will be "event=0, eventid=xxx, type=xxx".
Therefore, when EventCode and ConfigCode are missing in JSON, "event=0"
is no longer added by default. And add EventIdCode and Type to the event
field.
I compared pmu_event.c before and after compiling with JEVENT_ARCH=all,
they are consistent.
Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
---
tools/perf/pmu-events/jevents.py | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jevents.py
index f57a8f2..369c8bf 100755
--- a/tools/perf/pmu-events/jevents.py
+++ b/tools/perf/pmu-events/jevents.py
@@ -275,11 +275,14 @@ class JsonEvent:
}
return table[unit] if unit in table else f'uncore_{unit.lower()}'
- eventcode = 0
+ eventcode = None
if 'EventCode' in jd:
eventcode = int(jd['EventCode'].split(',', 1)[0], 0)
if 'ExtSel' in jd:
- eventcode |= int(jd['ExtSel']) << 8
+ if eventcode is None:
+ eventcode = int(jd['ExtSel']) << 8
+ else:
+ eventcode |= int(jd['ExtSel']) << 8
configcode = int(jd['ConfigCode'], 0) if 'ConfigCode' in jd else None
self.name = jd['EventName'].lower() if 'EventName' in jd else None
self.topic = ''
@@ -317,7 +320,11 @@ class JsonEvent:
if precise and self.desc and '(Precise Event)' not in self.desc:
extra_desc += ' (Must be precise)' if precise == '2' else (' (Precise '
'event)')
- event = f'config={llx(configcode)}' if configcode is not None else f'event={llx(eventcode)}'
+ event = None
+ if eventcode is not None:
+ event = f'event={llx(eventcode)}'
+ elif configcode is not None:
+ event = f'config={llx(configcode)}'
event_fields = [
('AnyThread', 'any='),
('PortMask', 'ch_mask='),
@@ -327,10 +334,15 @@ class JsonEvent:
('Invert', 'inv='),
('SampleAfterValue', 'period='),
('UMask', 'umask='),
+ ('NodeType', 'type='),
+ ('EventIdCode', 'eventid='),
]
for key, value in event_fields:
if key in jd and jd[key] != '0':
- event += ',' + value + jd[key]
+ if event:
+ event += ',' + value + jd[key]
+ else:
+ event = value + jd[key]
if filter:
event += f',{filter}'
if msr:
--
1.8.3.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v7 5/8] perf test: Make matching_pmu effective
2023-08-21 8:36 [PATCH v7 0/8] perf vendor events: Add JSON metrics for Arm CMN Jing Zhang
` (2 preceding siblings ...)
2023-08-21 8:36 ` [PATCH v7 4/8] perf jevents: Support more event fields Jing Zhang
@ 2023-08-21 8:36 ` Jing Zhang
2023-08-25 4:27 ` Ian Rogers
2023-08-21 8:36 ` [PATCH v7 6/8] perf test: Add pmu-event test for "Compat" and new event_field Jing Zhang
` (4 subsequent siblings)
8 siblings, 1 reply; 27+ messages in thread
From: Jing Zhang @ 2023-08-21 8:36 UTC (permalink / raw)
To: John Garry, Ian Rogers
Cc: Will Deacon, James Clark, Arnaldo Carvalho de Melo, Mark Rutland,
Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra, Ingo Molnar,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-kernel,
linux-arm-kernel, linux-perf-users, linux-doc, Zhuo Song,
Jing Zhang, Shuai Xue
The perf_pmu_test_event.matching_pmu didn't work. No matter what its
value is, it does not affect the test results. So let matching_pmu be
used for matching perf_pmu_test_pmu.pmu.name.
Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
Reviewed-by: John Garry <john.g.garry@oracle.com>
---
tools/perf/tests/pmu-events.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/tools/perf/tests/pmu-events.c b/tools/perf/tests/pmu-events.c
index 1dff863b..3204252 100644
--- a/tools/perf/tests/pmu-events.c
+++ b/tools/perf/tests/pmu-events.c
@@ -238,7 +238,7 @@ struct perf_pmu_test_pmu {
},
.alias_str = "event=0x2b",
.alias_long_desc = "ddr write-cycles event. Unit: uncore_sys_ddr_pmu ",
- .matching_pmu = "uncore_sys_ddr_pmu",
+ .matching_pmu = "uncore_sys_ddr_pmu0",
};
static const struct perf_pmu_test_event sys_ccn_pmu_read_cycles = {
@@ -252,7 +252,7 @@ struct perf_pmu_test_pmu {
},
.alias_str = "config=0x2c",
.alias_long_desc = "ccn read-cycles event. Unit: uncore_sys_ccn_pmu ",
- .matching_pmu = "uncore_sys_ccn_pmu",
+ .matching_pmu = "uncore_sys_ccn_pmu4",
};
static const struct perf_pmu_test_event *sys_events[] = {
@@ -599,6 +599,11 @@ static int __test_uncore_pmu_event_aliases(struct perf_pmu_test_pmu *test_pmu)
struct pmu_event const *event = &test_event->event;
if (!strcmp(event->name, alias->name)) {
+ if (strcmp(pmu_name, test_event->matching_pmu)) {
+ pr_debug("testing aliases uncore PMU %s: mismatched matching_pmu, %s vs %s\n",
+ pmu_name, test_event->matching_pmu, pmu_name);
+ continue;
+ }
if (compare_alias_to_test_event(alias,
test_event,
pmu_name)) {
--
1.8.3.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v7 6/8] perf test: Add pmu-event test for "Compat" and new event_field.
2023-08-21 8:36 [PATCH v7 0/8] perf vendor events: Add JSON metrics for Arm CMN Jing Zhang
` (3 preceding siblings ...)
2023-08-21 8:36 ` [PATCH v7 5/8] perf test: Make matching_pmu effective Jing Zhang
@ 2023-08-21 8:36 ` Jing Zhang
2023-08-25 4:30 ` Ian Rogers
2023-08-21 8:36 ` [PATCH v7 7/8] perf jevents: Add support for Arm CMN PMU aliasing Jing Zhang
` (3 subsequent siblings)
8 siblings, 1 reply; 27+ messages in thread
From: Jing Zhang @ 2023-08-21 8:36 UTC (permalink / raw)
To: John Garry, Ian Rogers
Cc: Will Deacon, James Clark, Arnaldo Carvalho de Melo, Mark Rutland,
Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra, Ingo Molnar,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-kernel,
linux-arm-kernel, linux-perf-users, linux-doc, Zhuo Song,
Jing Zhang, Shuai Xue
Add new event test for uncore system event which is used to verify the
functionality of "Compat" matching multiple identifiers and the new event
fields "EventIdCode" and "Type".
Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
---
.../pmu-events/arch/test/test_soc/sys/uncore.json | 8 ++++
tools/perf/pmu-events/empty-pmu-events.c | 8 ++++
tools/perf/tests/pmu-events.c | 55 ++++++++++++++++++++++
3 files changed, 71 insertions(+)
diff --git a/tools/perf/pmu-events/arch/test/test_soc/sys/uncore.json b/tools/perf/pmu-events/arch/test/test_soc/sys/uncore.json
index c7e7528..06b886d 100644
--- a/tools/perf/pmu-events/arch/test/test_soc/sys/uncore.json
+++ b/tools/perf/pmu-events/arch/test/test_soc/sys/uncore.json
@@ -12,5 +12,13 @@
"EventName": "sys_ccn_pmu.read_cycles",
"Unit": "sys_ccn_pmu",
"Compat": "0x01"
+ },
+ {
+ "BriefDescription": "Counts total cache misses in first lookup result (high priority).",
+ "NodeType": "0x05",
+ "EventIdCode": "0x01",
+ "EventName": "sys_cmn_pmu.hnf_cache_miss",
+ "Unit": "sys_cmn_pmu",
+ "Compat": "434*;436*;43c*;43a01"
}
]
diff --git a/tools/perf/pmu-events/empty-pmu-events.c b/tools/perf/pmu-events/empty-pmu-events.c
index e74defb..25be18a 100644
--- a/tools/perf/pmu-events/empty-pmu-events.c
+++ b/tools/perf/pmu-events/empty-pmu-events.c
@@ -245,6 +245,14 @@ struct pmu_events_map {
.pmu = "uncore_sys_ccn_pmu",
},
{
+ .name = "sys_cmn_pmu.hnf_cache_miss",
+ .event = "type=0x05,eventid=0x01",
+ .desc = "Counts total cache misses in first lookup result (high priority). Unit: uncore_sys_cmn_pmu ",
+ .compat = "434*;436*;43c*;43a01",
+ .topic = "uncore",
+ .pmu = "uncore_sys_cmn_pmu",
+ },
+ {
.name = 0,
.event = 0,
.desc = 0,
diff --git a/tools/perf/tests/pmu-events.c b/tools/perf/tests/pmu-events.c
index 3204252..79fb3e2 100644
--- a/tools/perf/tests/pmu-events.c
+++ b/tools/perf/tests/pmu-events.c
@@ -255,9 +255,24 @@ struct perf_pmu_test_pmu {
.matching_pmu = "uncore_sys_ccn_pmu4",
};
+static const struct perf_pmu_test_event sys_cmn_pmu_hnf_cache_miss = {
+ .event = {
+ .name = "sys_cmn_pmu.hnf_cache_miss",
+ .event = "type=0x05,eventid=0x01",
+ .desc = "Counts total cache misses in first lookup result (high priority). Unit: uncore_sys_cmn_pmu ",
+ .topic = "uncore",
+ .pmu = "uncore_sys_cmn_pmu",
+ .compat = "434*;436*;43c*;43a01",
+ },
+ .alias_str = "type=0x5,eventid=0x1",
+ .alias_long_desc = "Counts total cache misses in first lookup result (high priority). Unit: uncore_sys_cmn_pmu ",
+ .matching_pmu = "uncore_sys_cmn_pmu0",
+};
+
static const struct perf_pmu_test_event *sys_events[] = {
&sys_ddr_pmu_write_cycles,
&sys_ccn_pmu_read_cycles,
+ &sys_cmn_pmu_hnf_cache_miss,
NULL
};
@@ -704,6 +719,46 @@ static int __test_uncore_pmu_event_aliases(struct perf_pmu_test_pmu *test_pmu)
&sys_ccn_pmu_read_cycles,
},
},
+ {
+ .pmu = {
+ .name = (char *)"uncore_sys_cmn_pmu0",
+ .is_uncore = 1,
+ .id = (char *)"43401",
+ },
+ .aliases = {
+ &sys_cmn_pmu_hnf_cache_miss,
+ },
+ },
+ {
+ .pmu = {
+ .name = (char *)"uncore_sys_cmn_pmu0",
+ .is_uncore = 1,
+ .id = (char *)"43602",
+ },
+ .aliases = {
+ &sys_cmn_pmu_hnf_cache_miss,
+ },
+ },
+ {
+ .pmu = {
+ .name = (char *)"uncore_sys_cmn_pmu0",
+ .is_uncore = 1,
+ .id = (char *)"43c03",
+ },
+ .aliases = {
+ &sys_cmn_pmu_hnf_cache_miss,
+ },
+ },
+ {
+ .pmu = {
+ .name = (char *)"uncore_sys_cmn_pmu0",
+ .is_uncore = 1,
+ .id = (char *)"43a01",
+ },
+ .aliases = {
+ &sys_cmn_pmu_hnf_cache_miss,
+ },
+ }
};
/* Test that aliases generated are as expected */
--
1.8.3.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v7 7/8] perf jevents: Add support for Arm CMN PMU aliasing
2023-08-21 8:36 [PATCH v7 0/8] perf vendor events: Add JSON metrics for Arm CMN Jing Zhang
` (4 preceding siblings ...)
2023-08-21 8:36 ` [PATCH v7 6/8] perf test: Add pmu-event test for "Compat" and new event_field Jing Zhang
@ 2023-08-21 8:36 ` Jing Zhang
2023-08-23 9:33 ` Robin Murphy
2023-08-21 8:36 ` [PATCH v7 8/8] perf vendor events: Add JSON metrics for Arm CMN Jing Zhang
` (2 subsequent siblings)
8 siblings, 1 reply; 27+ messages in thread
From: Jing Zhang @ 2023-08-21 8:36 UTC (permalink / raw)
To: John Garry, Ian Rogers
Cc: Will Deacon, James Clark, Arnaldo Carvalho de Melo, Mark Rutland,
Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra, Ingo Molnar,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-kernel,
linux-arm-kernel, linux-perf-users, linux-doc, Zhuo Song,
Jing Zhang, Shuai Xue
Currently just add aliases for part of Arm CMN PMU events which
are general and compatible for any SoC and CMN-ANY.
"Compat" value "434*;436*;43c*;43a*" means it is compatible with
all CMN600/CMN650/CMN700/Ci700, which can be obtained from
commit 7819e05a0dce ("perf/arm-cmn: Revamp model detection").
The arm-cmn PMU events got from:
[0] https://developer.arm.com/documentation/100180/0302/?lang=en
[1] https://developer.arm.com/documentation/101408/0100/?lang=en
[2] https://developer.arm.com/documentation/102308/0302/?lang=en
[3] https://developer.arm.com/documentation/101569/0300/?lang=en
Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
Reviewed-by: John Garry <john.g.garry@oracle.com>
---
.../pmu-events/arch/arm64/arm/cmn/sys/cmn.json | 266 +++++++++++++++++++++
tools/perf/pmu-events/jevents.py | 1 +
2 files changed, 267 insertions(+)
create mode 100644 tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
diff --git a/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json b/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
new file mode 100644
index 0000000..30435a3
--- /dev/null
+++ b/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
@@ -0,0 +1,266 @@
+[
+ {
+ "EventName": "hnf_cache_miss",
+ "EventIdCode": "0x1",
+ "NodeType": "0x5",
+ "BriefDescription": "Counts total cache misses in first lookup result (high priority).",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hnf_slc_sf_cache_access",
+ "EventIdCode": "0x2",
+ "NodeType": "0x5",
+ "BriefDescription": "Counts number of cache accesses in first access (high priority).",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hnf_cache_fill",
+ "EventIdCode": "0x3",
+ "NodeType": "0x5",
+ "BriefDescription": "Counts total allocations in HN SLC (all cache line allocations to SLC).",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hnf_pocq_retry",
+ "EventIdCode": "0x4",
+ "NodeType": "0x5",
+ "BriefDescription": "Counts number of retried requests.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hnf_pocq_reqs_recvd",
+ "EventIdCode": "0x5",
+ "NodeType": "0x5",
+ "BriefDescription": "Counts number of requests that HN receives.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hnf_sf_hit",
+ "EventIdCode": "0x6",
+ "NodeType": "0x5",
+ "BriefDescription": "Counts number of SF hits.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hnf_sf_evictions",
+ "EventIdCode": "0x7",
+ "NodeType": "0x5",
+ "BriefDescription": "Counts number of SF eviction cache invalidations initiated.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hnf_dir_snoops_sent",
+ "EventIdCode": "0x8",
+ "NodeType": "0x5",
+ "BriefDescription": "Counts number of directed snoops sent (not including SF back invalidation).",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hnf_brd_snoops_sent",
+ "EventIdCode": "0x9",
+ "NodeType": "0x5",
+ "BriefDescription": "Counts number of multicast snoops sent (not including SF back invalidation).",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hnf_slc_eviction",
+ "EventIdCode": "0xa",
+ "NodeType": "0x5",
+ "BriefDescription": "Counts number of SLC evictions (dirty only).",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hnf_slc_fill_invalid_way",
+ "EventIdCode": "0xb",
+ "NodeType": "0x5",
+ "BriefDescription": "Counts number of SLC fills to an invalid way.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hnf_mc_retries",
+ "EventIdCode": "0xc",
+ "NodeType": "0x5",
+ "BriefDescription": "Counts number of retried transactions by the MC.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hnf_mc_reqs",
+ "EventIdCode": "0xd",
+ "NodeType": "0x5",
+ "BriefDescription": "Counts number of requests that are sent to MC.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hnf_qos_hh_retry",
+ "EventIdCode": "0xe",
+ "NodeType": "0x5",
+ "BriefDescription": "Counts number of times a HighHigh priority request is protocolretried at the HN‑F.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "rnid_s0_rdata_beats",
+ "EventIdCode": "0x1",
+ "NodeType": "0xa",
+ "BriefDescription": "Number of RData beats (RVALID and RREADY) dispatched on port 0. This event measures the read bandwidth, including CMO responses.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "rnid_s1_rdata_beats",
+ "EventIdCode": "0x2",
+ "NodeType": "0xa",
+ "BriefDescription": "Number of RData beats (RVALID and RREADY) dispatched on port 1. This event measures the read bandwidth, including CMO responses.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "rnid_s2_rdata_beats",
+ "EventIdCode": "0x3",
+ "NodeType": "0xa",
+ "BriefDescription": "Number of RData beats (RVALID and RREADY) dispatched on port 2. This event measures the read bandwidth, including CMO responses.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "rnid_rxdat_flits",
+ "EventIdCode": "0x4",
+ "NodeType": "0xa",
+ "BriefDescription": "Number of RXDAT flits received. This event measures the true read data bandwidth, excluding CMOs.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "rnid_txdat_flits",
+ "EventIdCode": "0x5",
+ "NodeType": "0xa",
+ "BriefDescription": "Number of TXDAT flits dispatched. This event measures the write bandwidth.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "rnid_txreq_flits_total",
+ "EventIdCode": "0x6",
+ "NodeType": "0xa",
+ "BriefDescription": "Number of TXREQ flits dispatched. This event measures the total request bandwidth.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "rnid_txreq_flits_retried",
+ "EventIdCode": "0x7",
+ "NodeType": "0xa",
+ "BriefDescription": "Number of retried TXREQ flits dispatched. This event measures the retry rate.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "sbsx_txrsp_retryack",
+ "EventIdCode": "0x4",
+ "NodeType": "0x7",
+ "BriefDescription": "Number of RXREQ flits dispatched. This event is a measure of the retry rate.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "sbsx_txdat_flitv",
+ "EventIdCode": "0x5",
+ "NodeType": "0x7",
+ "BriefDescription": "Number of TXDAT flits dispatched from XP to SBSX. This event is a measure of the write bandwidth.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "sbsx_arvalid_no_arready",
+ "EventIdCode": "0x21",
+ "NodeType": "0x7",
+ "BriefDescription": "Number of cycles the SBSX bridge is stalled because of backpressure on AR channel.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "sbsx_awvalid_no_awready",
+ "EventIdCode": "0x22",
+ "NodeType": "0x7",
+ "BriefDescription": "Number of cycles the SBSX bridge is stalled because of backpressure on AW channel.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "sbsx_wvalid_no_wready",
+ "EventIdCode": "0x23",
+ "NodeType": "0x7",
+ "BriefDescription": "Number of cycles the SBSX bridge is stalled because of backpressure on W channel.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hni_txrsp_retryack",
+ "EventIdCode": "0x2a",
+ "NodeType": "0x4",
+ "BriefDescription": "Number of RXREQ flits dispatched. This event is a measure of the retry rate.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hni_arvalid_no_arready",
+ "EventIdCode": "0x2b",
+ "NodeType": "0x4",
+ "BriefDescription": "Number of cycles the HN-I bridge is stalled because of backpressure on AR channel.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hni_arready_no_arvalid",
+ "EventIdCode": "0x2c",
+ "NodeType": "0x4",
+ "BriefDescription": "Number of cycles the AR channel is waiting for new requests from HN-I bridge.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hni_awvalid_no_awready",
+ "EventIdCode": "0x2d",
+ "NodeType": "0x4",
+ "BriefDescription": "Number of cycles the HN-I bridge is stalled because of backpressure on AW channel.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hni_awready_no_awvalid",
+ "EventIdCode": "0x2e",
+ "NodeType": "0x4",
+ "BriefDescription": "Number of cycles the AW channel is waiting for new requests from HN-I bridge.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hni_wvalid_no_wready",
+ "EventIdCode": "0x2f",
+ "NodeType": "0x4",
+ "BriefDescription": "Number of cycles the HN-I bridge is stalled because of backpressure on W channel.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "EventName": "hni_txdat_stall",
+ "EventIdCode": "0x30",
+ "NodeType": "0x4",
+ "BriefDescription": "TXDAT valid but no link credit available.",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ }
+]
diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jevents.py
index 369c8bf..935bd4b 100755
--- a/tools/perf/pmu-events/jevents.py
+++ b/tools/perf/pmu-events/jevents.py
@@ -272,6 +272,7 @@ class JsonEvent:
'DFPMC': 'amd_df',
'cpu_core': 'cpu_core',
'cpu_atom': 'cpu_atom',
+ 'arm_cmn': 'arm_cmn',
}
return table[unit] if unit in table else f'uncore_{unit.lower()}'
--
1.8.3.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v7 8/8] perf vendor events: Add JSON metrics for Arm CMN
2023-08-21 8:36 [PATCH v7 0/8] perf vendor events: Add JSON metrics for Arm CMN Jing Zhang
` (5 preceding siblings ...)
2023-08-21 8:36 ` [PATCH v7 7/8] perf jevents: Add support for Arm CMN PMU aliasing Jing Zhang
@ 2023-08-21 8:36 ` Jing Zhang
2023-08-25 4:13 ` Ian Rogers
2023-08-23 8:12 ` [PATCH v7 0/8] " John Garry
2023-09-06 16:05 ` Arnaldo Carvalho de Melo
8 siblings, 1 reply; 27+ messages in thread
From: Jing Zhang @ 2023-08-21 8:36 UTC (permalink / raw)
To: John Garry, Ian Rogers
Cc: Will Deacon, James Clark, Arnaldo Carvalho de Melo, Mark Rutland,
Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra, Ingo Molnar,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-kernel,
linux-arm-kernel, linux-perf-users, linux-doc, Zhuo Song,
Jing Zhang, Shuai Xue
Add JSON metrics for Arm CMN. Currently just add part of CMN PMU
metrics which are general and compatible for any SoC with CMN-ANY.
Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
Reviewed-by: John Garry <john.g.garry@oracle.com>
---
.../pmu-events/arch/arm64/arm/cmn/sys/metric.json | 74 ++++++++++++++++++++++
1 file changed, 74 insertions(+)
create mode 100644 tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json
diff --git a/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json b/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json
new file mode 100644
index 0000000..64db534
--- /dev/null
+++ b/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json
@@ -0,0 +1,74 @@
+[
+ {
+ "MetricName": "slc_miss_rate",
+ "BriefDescription": "The system level cache miss rate.",
+ "MetricGroup": "cmn",
+ "MetricExpr": "hnf_cache_miss / hnf_slc_sf_cache_access",
+ "ScaleUnit": "100%",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "MetricName": "hnf_message_retry_rate",
+ "BriefDescription": "HN-F message retry rate indicates whether a lack of credits is causing the bottlenecks.",
+ "MetricGroup": "cmn",
+ "MetricExpr": "hnf_pocq_retry / hnf_pocq_reqs_recvd",
+ "ScaleUnit": "100%",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "MetricName": "sf_hit_rate",
+ "BriefDescription": "Snoop filter hit rate can be used to measure the snoop filter efficiency.",
+ "MetricGroup": "cmn",
+ "MetricExpr": "hnf_sf_hit / hnf_slc_sf_cache_access",
+ "ScaleUnit": "100%",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "MetricName": "mc_message_retry_rate",
+ "BriefDescription": "The memory controller request retries rate indicates whether the memory controller is the bottleneck.",
+ "MetricGroup": "cmn",
+ "MetricExpr": "hnf_mc_retries / hnf_mc_reqs",
+ "ScaleUnit": "100%",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "MetricName": "rni_actual_read_bandwidth.all",
+ "BriefDescription": "This event measure the actual bandwidth that RN-I bridge sends to the interconnect.",
+ "MetricGroup": "cmn",
+ "MetricExpr": "rnid_rxdat_flits * 32 / 1e6 / duration_time",
+ "ScaleUnit": "1MB/s",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "MetricName": "rni_actual_write_bandwidth.all",
+ "BriefDescription": "This event measures the actual write bandwidth at RN-I bridges.",
+ "MetricGroup": "cmn",
+ "MetricExpr": "rnid_txdat_flits * 32 / 1e6 / duration_time",
+ "ScaleUnit": "1MB/s",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "MetricName": "rni_retry_rate",
+ "BriefDescription": "RN-I bridge retry rate indicates whether the memory controller is the bottleneck.",
+ "MetricGroup": "cmn",
+ "MetricExpr": "rnid_txreq_flits_retried / rnid_txreq_flits_total",
+ "ScaleUnit": "100%",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ },
+ {
+ "MetricName": "sbsx_actual_write_bandwidth.all",
+ "BriefDescription": "sbsx actual write bandwidth.",
+ "MetricGroup": "cmn",
+ "MetricExpr": "sbsx_txdat_flitv * 32 / 1e6 / duration_time",
+ "ScaleUnit": "1MB/s",
+ "Unit": "arm_cmn",
+ "Compat": "434*;436*;43c*;43a*"
+ }
+]
--
1.8.3.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* Re: [PATCH v7 0/8] perf vendor events: Add JSON metrics for Arm CMN
2023-08-21 8:36 [PATCH v7 0/8] perf vendor events: Add JSON metrics for Arm CMN Jing Zhang
` (6 preceding siblings ...)
2023-08-21 8:36 ` [PATCH v7 8/8] perf vendor events: Add JSON metrics for Arm CMN Jing Zhang
@ 2023-08-23 8:12 ` John Garry
2023-08-24 2:33 ` Jing Zhang
2023-09-06 16:05 ` Arnaldo Carvalho de Melo
8 siblings, 1 reply; 27+ messages in thread
From: John Garry @ 2023-08-23 8:12 UTC (permalink / raw)
To: Jing Zhang, Ian Rogers
Cc: Will Deacon, James Clark, Arnaldo Carvalho de Melo, Mark Rutland,
Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra, Ingo Molnar,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-kernel,
linux-arm-kernel, linux-perf-users, linux-doc, Zhuo Song,
Shuai Xue
On 21/08/2023 09:36, Jing Zhang wrote:
I'm hoping that Ian can check the outstanding patches here, but I'll
also have a look.
> Changes since v6:
> - Supplement the omitted EventCode;
> - Keep the original way of ConfigCode;
> - Supplement the test in empty-pmu-events.c, so that the pmu event test
> can succeed when build with NO_JEVENT=1.
> - Link: https://urldefense.com/v3/__https://lore.kernel.org/all/1691394685-61240-1-git-send-email-renyu.zj@linux.alibaba.com/__;!!ACWV5N9M2RV99hQ!Lakh7Lf-6l6Hovm4Tt5S5pqV1xHm-LAW2ICVl6gLONlN4CNk-BvyADBfjwQe5yQQj89yMK7s7rSjMNHCyFsIUxnHXg$
>
> Jing Zhang (8):
> perf pmu: "Compat" supports matching multiple identifiers
> perf metric: "Compat" supports matching multiple identifiers
> perf vendor events: Supplement the omitted EventCode
> perf jevents: Support more event fields
> perf test: Make matching_pmu effective
> perf test: Add pmu-event test for "Compat" and new event_field.
> perf jevents: Add support for Arm CMN PMU aliasing
> perf vendor events: Add JSON metrics for Arm CMN
>
> .../pmu-events/arch/arm64/arm/cmn/sys/cmn.json | 266 +++++++++++++++++++++
> .../pmu-events/arch/arm64/arm/cmn/sys/metric.json | 74 ++++++
> .../pmu-events/arch/test/test_soc/sys/uncore.json | 8 +
> .../pmu-events/arch/x86/alderlake/pipeline.json | 9 +
> .../pmu-events/arch/x86/alderlaken/pipeline.json | 3 +
> .../pmu-events/arch/x86/broadwell/pipeline.json | 4 +
> .../pmu-events/arch/x86/broadwellde/pipeline.json | 4 +
> .../arch/x86/broadwellde/uncore-cache.json | 2 +
> .../arch/x86/broadwellde/uncore-interconnect.json | 1 +
> .../arch/x86/broadwellde/uncore-memory.json | 1 +
> .../arch/x86/broadwellde/uncore-power.json | 1 +
> .../pmu-events/arch/x86/broadwellx/pipeline.json | 4 +
> .../arch/x86/broadwellx/uncore-cache.json | 2 +
> .../arch/x86/broadwellx/uncore-interconnect.json | 13 +
> .../arch/x86/broadwellx/uncore-memory.json | 2 +
> .../arch/x86/broadwellx/uncore-power.json | 1 +
> .../pmu-events/arch/x86/cascadelakex/pipeline.json | 4 +
> .../arch/x86/cascadelakex/uncore-cache.json | 2 +
> .../arch/x86/cascadelakex/uncore-interconnect.json | 1 +
> .../arch/x86/cascadelakex/uncore-io.json | 1 +
> .../arch/x86/cascadelakex/uncore-memory.json | 1 +
> .../arch/x86/cascadelakex/uncore-power.json | 1 +
> .../pmu-events/arch/x86/elkhartlake/pipeline.json | 2 +
> .../pmu-events/arch/x86/goldmont/pipeline.json | 3 +
> .../pmu-events/arch/x86/goldmontplus/pipeline.json | 3 +
> .../pmu-events/arch/x86/grandridge/pipeline.json | 3 +
> .../arch/x86/graniterapids/pipeline.json | 4 +
> .../perf/pmu-events/arch/x86/haswell/pipeline.json | 4 +
> .../pmu-events/arch/x86/haswellx/pipeline.json | 4 +
> .../pmu-events/arch/x86/haswellx/uncore-cache.json | 2 +
> .../arch/x86/haswellx/uncore-interconnect.json | 14 ++
> .../arch/x86/haswellx/uncore-memory.json | 2 +
> .../pmu-events/arch/x86/haswellx/uncore-power.json | 1 +
> .../perf/pmu-events/arch/x86/icelake/pipeline.json | 4 +
> .../pmu-events/arch/x86/icelakex/pipeline.json | 4 +
> .../pmu-events/arch/x86/icelakex/uncore-cache.json | 1 +
> .../arch/x86/icelakex/uncore-interconnect.json | 1 +
> .../arch/x86/icelakex/uncore-memory.json | 1 +
> .../pmu-events/arch/x86/icelakex/uncore-power.json | 1 +
> .../pmu-events/arch/x86/ivybridge/pipeline.json | 3 +
> .../perf/pmu-events/arch/x86/ivytown/pipeline.json | 4 +
> .../pmu-events/arch/x86/ivytown/uncore-cache.json | 2 +
> .../arch/x86/ivytown/uncore-interconnect.json | 11 +
> .../pmu-events/arch/x86/ivytown/uncore-memory.json | 1 +
> .../pmu-events/arch/x86/ivytown/uncore-power.json | 1 +
> .../pmu-events/arch/x86/jaketown/pipeline.json | 4 +
> .../pmu-events/arch/x86/jaketown/uncore-cache.json | 2 +
> .../arch/x86/jaketown/uncore-interconnect.json | 12 +
> .../arch/x86/jaketown/uncore-memory.json | 1 +
> .../pmu-events/arch/x86/jaketown/uncore-power.json | 2 +
> .../arch/x86/knightslanding/pipeline.json | 3 +
> .../arch/x86/knightslanding/uncore-cache.json | 1 +
> .../arch/x86/knightslanding/uncore-memory.json | 4 +
> .../pmu-events/arch/x86/meteorlake/pipeline.json | 8 +
> .../pmu-events/arch/x86/sandybridge/pipeline.json | 4 +
> .../arch/x86/sapphirerapids/pipeline.json | 5 +
> .../pmu-events/arch/x86/sierraforest/pipeline.json | 4 +
> .../pmu-events/arch/x86/silvermont/pipeline.json | 3 +
> .../perf/pmu-events/arch/x86/skylake/pipeline.json | 4 +
> .../pmu-events/arch/x86/skylakex/pipeline.json | 4 +
> .../pmu-events/arch/x86/skylakex/uncore-cache.json | 2 +
> .../arch/x86/skylakex/uncore-interconnect.json | 1 +
> .../pmu-events/arch/x86/skylakex/uncore-io.json | 1 +
> .../arch/x86/skylakex/uncore-memory.json | 1 +
> .../pmu-events/arch/x86/skylakex/uncore-power.json | 1 +
> .../pmu-events/arch/x86/snowridgex/pipeline.json | 2 +
> .../arch/x86/snowridgex/uncore-cache.json | 1 +
> .../arch/x86/snowridgex/uncore-interconnect.json | 1 +
> .../arch/x86/snowridgex/uncore-memory.json | 1 +
> .../arch/x86/snowridgex/uncore-power.json | 1 +
> .../pmu-events/arch/x86/tigerlake/pipeline.json | 5 +
> tools/perf/pmu-events/empty-pmu-events.c | 8 +
> tools/perf/pmu-events/jevents.py | 21 +-
> tools/perf/tests/pmu-events.c | 64 ++++-
> tools/perf/util/metricgroup.c | 2 +-
> tools/perf/util/pmu.c | 33 ++-
> tools/perf/util/pmu.h | 1 +
> 77 files changed, 679 insertions(+), 9 deletions(-)
> create mode 100644 tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
> create mode 100644 tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v7 4/8] perf jevents: Support more event fields
2023-08-21 8:36 ` [PATCH v7 4/8] perf jevents: Support more event fields Jing Zhang
@ 2023-08-23 9:12 ` Robin Murphy
2023-08-25 4:42 ` Ian Rogers
0 siblings, 1 reply; 27+ messages in thread
From: Robin Murphy @ 2023-08-23 9:12 UTC (permalink / raw)
To: Jing Zhang, John Garry, Ian Rogers
Cc: Will Deacon, James Clark, Arnaldo Carvalho de Melo, Mark Rutland,
Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra, Ingo Molnar,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-kernel,
linux-arm-kernel, linux-perf-users, linux-doc, Zhuo Song,
Shuai Xue
On 2023-08-21 09:36, Jing Zhang wrote:
> The previous code assumes an event has either an "event=" or "config"
> field at the beginning. For CMN neither of these may be present, as an
> event is typically "type=xx,eventid=xxx".
>
> If EventCode and ConfigCode is not added in the alias JSON file, the
> event description will add "event=0" by default. So, even if the event
> field is added "eventid=xxx" and "type=xxx", the CMN events final
> parsing result will be "event=0, eventid=xxx, type=xxx".
>
> Therefore, when EventCode and ConfigCode are missing in JSON, "event=0"
> is no longer added by default. And add EventIdCode and Type to the event
> field.
>
> I compared pmu_event.c before and after compiling with JEVENT_ARCH=all,
> they are consistent.
>
> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
> ---
> tools/perf/pmu-events/jevents.py | 20 ++++++++++++++++----
> 1 file changed, 16 insertions(+), 4 deletions(-)
>
> diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jevents.py
> index f57a8f2..369c8bf 100755
> --- a/tools/perf/pmu-events/jevents.py
> +++ b/tools/perf/pmu-events/jevents.py
> @@ -275,11 +275,14 @@ class JsonEvent:
> }
> return table[unit] if unit in table else f'uncore_{unit.lower()}'
>
> - eventcode = 0
> + eventcode = None
> if 'EventCode' in jd:
> eventcode = int(jd['EventCode'].split(',', 1)[0], 0)
> if 'ExtSel' in jd:
> - eventcode |= int(jd['ExtSel']) << 8
> + if eventcode is None:
> + eventcode = int(jd['ExtSel']) << 8
> + else:
> + eventcode |= int(jd['ExtSel']) << 8
> configcode = int(jd['ConfigCode'], 0) if 'ConfigCode' in jd else None
> self.name = jd['EventName'].lower() if 'EventName' in jd else None
> self.topic = ''
> @@ -317,7 +320,11 @@ class JsonEvent:
> if precise and self.desc and '(Precise Event)' not in self.desc:
> extra_desc += ' (Must be precise)' if precise == '2' else (' (Precise '
> 'event)')
> - event = f'config={llx(configcode)}' if configcode is not None else f'event={llx(eventcode)}'
> + event = None
> + if eventcode is not None:
> + event = f'event={llx(eventcode)}'
> + elif configcode is not None:
> + event = f'config={llx(configcode)}'
> event_fields = [
> ('AnyThread', 'any='),
> ('PortMask', 'ch_mask='),
> @@ -327,10 +334,15 @@ class JsonEvent:
> ('Invert', 'inv='),
> ('SampleAfterValue', 'period='),
> ('UMask', 'umask='),
> + ('NodeType', 'type='),
> + ('EventIdCode', 'eventid='),
FWIW, this smells like another brewing scalability problem, given that
these are entirely driver-specific. Not sure off-hand how feasible it
might be, but my instinct says that a neat solution would be to encode
them right in the JSON, e.g.:
"FormatAttr": { "type": 0x5 }
such that jevents should then only really need to consider whether an
event is defined in terms of a raw "ConfigCode", one or more
"FormatAttr"s which it can then parse dynamically, or reasonable special
cases like "EventCode" (given how "event" is one of the most commonly
used formats).
Thanks,
Robin.
> ]
> for key, value in event_fields:
> if key in jd and jd[key] != '0':
> - event += ',' + value + jd[key]
> + if event:
> + event += ',' + value + jd[key]
> + else:
> + event = value + jd[key]
> if filter:
> event += f',{filter}'
> if msr:
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v7 7/8] perf jevents: Add support for Arm CMN PMU aliasing
2023-08-21 8:36 ` [PATCH v7 7/8] perf jevents: Add support for Arm CMN PMU aliasing Jing Zhang
@ 2023-08-23 9:33 ` Robin Murphy
2023-08-24 2:12 ` Jing Zhang
0 siblings, 1 reply; 27+ messages in thread
From: Robin Murphy @ 2023-08-23 9:33 UTC (permalink / raw)
To: Jing Zhang, John Garry, Ian Rogers
Cc: Will Deacon, James Clark, Arnaldo Carvalho de Melo, Mark Rutland,
Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra, Ingo Molnar,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-kernel,
linux-arm-kernel, linux-perf-users, linux-doc, Zhuo Song,
Shuai Xue
On 2023-08-21 09:36, Jing Zhang wrote:
> Currently just add aliases for part of Arm CMN PMU events which
> are general and compatible for any SoC and CMN-ANY.
>
> "Compat" value "434*;436*;43c*;43a*" means it is compatible with
> all CMN600/CMN650/CMN700/Ci700, which can be obtained from
> commit 7819e05a0dce ("perf/arm-cmn: Revamp model detection").
>
> The arm-cmn PMU events got from:
> [0] https://developer.arm.com/documentation/100180/0302/?lang=en
> [1] https://developer.arm.com/documentation/101408/0100/?lang=en
> [2] https://developer.arm.com/documentation/102308/0302/?lang=en
> [3] https://developer.arm.com/documentation/101569/0300/?lang=en
>
> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
> Reviewed-by: John Garry <john.g.garry@oracle.com>
> ---
> .../pmu-events/arch/arm64/arm/cmn/sys/cmn.json | 266 +++++++++++++++++++++
> tools/perf/pmu-events/jevents.py | 1 +
> 2 files changed, 267 insertions(+)
> create mode 100644 tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
>
> diff --git a/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json b/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
> new file mode 100644
> index 0000000..30435a3
> --- /dev/null
> +++ b/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
> @@ -0,0 +1,266 @@
> +[
> + {
> + "EventName": "hnf_cache_miss",
> + "EventIdCode": "0x1",
> + "NodeType": "0x5",
Given my other comment, I also think there would be no harm in just
having these as:
"ConfigCode" : "0x10005"
if you'd rather make life easier to begin with, then be able to come
back and improve things later. IMO it doesn't affect the readability of
the important values *all* that much, since it's not like they're tighly
packed together in oddly-aligned bitfields.
Thanks,
Robin.
> + "BriefDescription": "Counts total cache misses in first lookup result (high priority).",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hnf_slc_sf_cache_access",
> + "EventIdCode": "0x2",
> + "NodeType": "0x5",
> + "BriefDescription": "Counts number of cache accesses in first access (high priority).",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hnf_cache_fill",
> + "EventIdCode": "0x3",
> + "NodeType": "0x5",
> + "BriefDescription": "Counts total allocations in HN SLC (all cache line allocations to SLC).",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hnf_pocq_retry",
> + "EventIdCode": "0x4",
> + "NodeType": "0x5",
> + "BriefDescription": "Counts number of retried requests.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hnf_pocq_reqs_recvd",
> + "EventIdCode": "0x5",
> + "NodeType": "0x5",
> + "BriefDescription": "Counts number of requests that HN receives.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hnf_sf_hit",
> + "EventIdCode": "0x6",
> + "NodeType": "0x5",
> + "BriefDescription": "Counts number of SF hits.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hnf_sf_evictions",
> + "EventIdCode": "0x7",
> + "NodeType": "0x5",
> + "BriefDescription": "Counts number of SF eviction cache invalidations initiated.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hnf_dir_snoops_sent",
> + "EventIdCode": "0x8",
> + "NodeType": "0x5",
> + "BriefDescription": "Counts number of directed snoops sent (not including SF back invalidation).",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hnf_brd_snoops_sent",
> + "EventIdCode": "0x9",
> + "NodeType": "0x5",
> + "BriefDescription": "Counts number of multicast snoops sent (not including SF back invalidation).",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hnf_slc_eviction",
> + "EventIdCode": "0xa",
> + "NodeType": "0x5",
> + "BriefDescription": "Counts number of SLC evictions (dirty only).",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hnf_slc_fill_invalid_way",
> + "EventIdCode": "0xb",
> + "NodeType": "0x5",
> + "BriefDescription": "Counts number of SLC fills to an invalid way.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hnf_mc_retries",
> + "EventIdCode": "0xc",
> + "NodeType": "0x5",
> + "BriefDescription": "Counts number of retried transactions by the MC.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hnf_mc_reqs",
> + "EventIdCode": "0xd",
> + "NodeType": "0x5",
> + "BriefDescription": "Counts number of requests that are sent to MC.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hnf_qos_hh_retry",
> + "EventIdCode": "0xe",
> + "NodeType": "0x5",
> + "BriefDescription": "Counts number of times a HighHigh priority request is protocolretried at the HN‑F.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "rnid_s0_rdata_beats",
> + "EventIdCode": "0x1",
> + "NodeType": "0xa",
> + "BriefDescription": "Number of RData beats (RVALID and RREADY) dispatched on port 0. This event measures the read bandwidth, including CMO responses.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "rnid_s1_rdata_beats",
> + "EventIdCode": "0x2",
> + "NodeType": "0xa",
> + "BriefDescription": "Number of RData beats (RVALID and RREADY) dispatched on port 1. This event measures the read bandwidth, including CMO responses.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "rnid_s2_rdata_beats",
> + "EventIdCode": "0x3",
> + "NodeType": "0xa",
> + "BriefDescription": "Number of RData beats (RVALID and RREADY) dispatched on port 2. This event measures the read bandwidth, including CMO responses.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "rnid_rxdat_flits",
> + "EventIdCode": "0x4",
> + "NodeType": "0xa",
> + "BriefDescription": "Number of RXDAT flits received. This event measures the true read data bandwidth, excluding CMOs.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "rnid_txdat_flits",
> + "EventIdCode": "0x5",
> + "NodeType": "0xa",
> + "BriefDescription": "Number of TXDAT flits dispatched. This event measures the write bandwidth.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "rnid_txreq_flits_total",
> + "EventIdCode": "0x6",
> + "NodeType": "0xa",
> + "BriefDescription": "Number of TXREQ flits dispatched. This event measures the total request bandwidth.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "rnid_txreq_flits_retried",
> + "EventIdCode": "0x7",
> + "NodeType": "0xa",
> + "BriefDescription": "Number of retried TXREQ flits dispatched. This event measures the retry rate.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "sbsx_txrsp_retryack",
> + "EventIdCode": "0x4",
> + "NodeType": "0x7",
> + "BriefDescription": "Number of RXREQ flits dispatched. This event is a measure of the retry rate.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "sbsx_txdat_flitv",
> + "EventIdCode": "0x5",
> + "NodeType": "0x7",
> + "BriefDescription": "Number of TXDAT flits dispatched from XP to SBSX. This event is a measure of the write bandwidth.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "sbsx_arvalid_no_arready",
> + "EventIdCode": "0x21",
> + "NodeType": "0x7",
> + "BriefDescription": "Number of cycles the SBSX bridge is stalled because of backpressure on AR channel.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "sbsx_awvalid_no_awready",
> + "EventIdCode": "0x22",
> + "NodeType": "0x7",
> + "BriefDescription": "Number of cycles the SBSX bridge is stalled because of backpressure on AW channel.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "sbsx_wvalid_no_wready",
> + "EventIdCode": "0x23",
> + "NodeType": "0x7",
> + "BriefDescription": "Number of cycles the SBSX bridge is stalled because of backpressure on W channel.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hni_txrsp_retryack",
> + "EventIdCode": "0x2a",
> + "NodeType": "0x4",
> + "BriefDescription": "Number of RXREQ flits dispatched. This event is a measure of the retry rate.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hni_arvalid_no_arready",
> + "EventIdCode": "0x2b",
> + "NodeType": "0x4",
> + "BriefDescription": "Number of cycles the HN-I bridge is stalled because of backpressure on AR channel.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hni_arready_no_arvalid",
> + "EventIdCode": "0x2c",
> + "NodeType": "0x4",
> + "BriefDescription": "Number of cycles the AR channel is waiting for new requests from HN-I bridge.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hni_awvalid_no_awready",
> + "EventIdCode": "0x2d",
> + "NodeType": "0x4",
> + "BriefDescription": "Number of cycles the HN-I bridge is stalled because of backpressure on AW channel.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hni_awready_no_awvalid",
> + "EventIdCode": "0x2e",
> + "NodeType": "0x4",
> + "BriefDescription": "Number of cycles the AW channel is waiting for new requests from HN-I bridge.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hni_wvalid_no_wready",
> + "EventIdCode": "0x2f",
> + "NodeType": "0x4",
> + "BriefDescription": "Number of cycles the HN-I bridge is stalled because of backpressure on W channel.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "EventName": "hni_txdat_stall",
> + "EventIdCode": "0x30",
> + "NodeType": "0x4",
> + "BriefDescription": "TXDAT valid but no link credit available.",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + }
> +]
> diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jevents.py
> index 369c8bf..935bd4b 100755
> --- a/tools/perf/pmu-events/jevents.py
> +++ b/tools/perf/pmu-events/jevents.py
> @@ -272,6 +272,7 @@ class JsonEvent:
> 'DFPMC': 'amd_df',
> 'cpu_core': 'cpu_core',
> 'cpu_atom': 'cpu_atom',
> + 'arm_cmn': 'arm_cmn',
> }
> return table[unit] if unit in table else f'uncore_{unit.lower()}'
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v7 7/8] perf jevents: Add support for Arm CMN PMU aliasing
2023-08-23 9:33 ` Robin Murphy
@ 2023-08-24 2:12 ` Jing Zhang
0 siblings, 0 replies; 27+ messages in thread
From: Jing Zhang @ 2023-08-24 2:12 UTC (permalink / raw)
To: Robin Murphy, John Garry, Ian Rogers
Cc: Will Deacon, James Clark, Arnaldo Carvalho de Melo, Mark Rutland,
Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra, Ingo Molnar,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-kernel,
linux-arm-kernel, linux-perf-users, linux-doc, Zhuo Song,
Shuai Xue
在 2023/8/23 下午5:33, Robin Murphy 写道:
> On 2023-08-21 09:36, Jing Zhang wrote:
>> Currently just add aliases for part of Arm CMN PMU events which
>> are general and compatible for any SoC and CMN-ANY.
>>
>> "Compat" value "434*;436*;43c*;43a*" means it is compatible with
>> all CMN600/CMN650/CMN700/Ci700, which can be obtained from
>> commit 7819e05a0dce ("perf/arm-cmn: Revamp model detection").
>>
>> The arm-cmn PMU events got from:
>> [0] https://developer.arm.com/documentation/100180/0302/?lang=en
>> [1] https://developer.arm.com/documentation/101408/0100/?lang=en
>> [2] https://developer.arm.com/documentation/102308/0302/?lang=en
>> [3] https://developer.arm.com/documentation/101569/0300/?lang=en
>>
>> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
>> Reviewed-by: John Garry <john.g.garry@oracle.com>
>> ---
>> .../pmu-events/arch/arm64/arm/cmn/sys/cmn.json | 266 +++++++++++++++++++++
>> tools/perf/pmu-events/jevents.py | 1 +
>> 2 files changed, 267 insertions(+)
>> create mode 100644 tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
>>
>> diff --git a/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json b/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
>> new file mode 100644
>> index 0000000..30435a3
>> --- /dev/null
>> +++ b/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
>> @@ -0,0 +1,266 @@
>> +[
>> + {
>> + "EventName": "hnf_cache_miss",
>> + "EventIdCode": "0x1",
>> + "NodeType": "0x5",
>
> Given my other comment, I also think there would be no harm in just having these as:
>
> "ConfigCode" : "0x10005"
>
> if you'd rather make life easier to begin with, then be able to come back and improve things later. IMO it doesn't affect the readability of the important values *all* that much, since it's not like they're tighly packed together in oddly-aligned bitfields.
>
Thanks a lot! that's a great suggestion. I hope to merge it in v6.6 first in the current way,
and then I will improve it in CMN driver and perf tools later.
Thanks,
Jing
> Thanks,
> Robin.
>
>> + "BriefDescription": "Counts total cache misses in first lookup result (high priority).",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hnf_slc_sf_cache_access",
>> + "EventIdCode": "0x2",
>> + "NodeType": "0x5",
>> + "BriefDescription": "Counts number of cache accesses in first access (high priority).",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hnf_cache_fill",
>> + "EventIdCode": "0x3",
>> + "NodeType": "0x5",
>> + "BriefDescription": "Counts total allocations in HN SLC (all cache line allocations to SLC).",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hnf_pocq_retry",
>> + "EventIdCode": "0x4",
>> + "NodeType": "0x5",
>> + "BriefDescription": "Counts number of retried requests.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hnf_pocq_reqs_recvd",
>> + "EventIdCode": "0x5",
>> + "NodeType": "0x5",
>> + "BriefDescription": "Counts number of requests that HN receives.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hnf_sf_hit",
>> + "EventIdCode": "0x6",
>> + "NodeType": "0x5",
>> + "BriefDescription": "Counts number of SF hits.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hnf_sf_evictions",
>> + "EventIdCode": "0x7",
>> + "NodeType": "0x5",
>> + "BriefDescription": "Counts number of SF eviction cache invalidations initiated.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hnf_dir_snoops_sent",
>> + "EventIdCode": "0x8",
>> + "NodeType": "0x5",
>> + "BriefDescription": "Counts number of directed snoops sent (not including SF back invalidation).",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hnf_brd_snoops_sent",
>> + "EventIdCode": "0x9",
>> + "NodeType": "0x5",
>> + "BriefDescription": "Counts number of multicast snoops sent (not including SF back invalidation).",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hnf_slc_eviction",
>> + "EventIdCode": "0xa",
>> + "NodeType": "0x5",
>> + "BriefDescription": "Counts number of SLC evictions (dirty only).",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hnf_slc_fill_invalid_way",
>> + "EventIdCode": "0xb",
>> + "NodeType": "0x5",
>> + "BriefDescription": "Counts number of SLC fills to an invalid way.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hnf_mc_retries",
>> + "EventIdCode": "0xc",
>> + "NodeType": "0x5",
>> + "BriefDescription": "Counts number of retried transactions by the MC.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hnf_mc_reqs",
>> + "EventIdCode": "0xd",
>> + "NodeType": "0x5",
>> + "BriefDescription": "Counts number of requests that are sent to MC.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hnf_qos_hh_retry",
>> + "EventIdCode": "0xe",
>> + "NodeType": "0x5",
>> + "BriefDescription": "Counts number of times a HighHigh priority request is protocolretried at the HN‑F.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "rnid_s0_rdata_beats",
>> + "EventIdCode": "0x1",
>> + "NodeType": "0xa",
>> + "BriefDescription": "Number of RData beats (RVALID and RREADY) dispatched on port 0. This event measures the read bandwidth, including CMO responses.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "rnid_s1_rdata_beats",
>> + "EventIdCode": "0x2",
>> + "NodeType": "0xa",
>> + "BriefDescription": "Number of RData beats (RVALID and RREADY) dispatched on port 1. This event measures the read bandwidth, including CMO responses.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "rnid_s2_rdata_beats",
>> + "EventIdCode": "0x3",
>> + "NodeType": "0xa",
>> + "BriefDescription": "Number of RData beats (RVALID and RREADY) dispatched on port 2. This event measures the read bandwidth, including CMO responses.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "rnid_rxdat_flits",
>> + "EventIdCode": "0x4",
>> + "NodeType": "0xa",
>> + "BriefDescription": "Number of RXDAT flits received. This event measures the true read data bandwidth, excluding CMOs.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "rnid_txdat_flits",
>> + "EventIdCode": "0x5",
>> + "NodeType": "0xa",
>> + "BriefDescription": "Number of TXDAT flits dispatched. This event measures the write bandwidth.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "rnid_txreq_flits_total",
>> + "EventIdCode": "0x6",
>> + "NodeType": "0xa",
>> + "BriefDescription": "Number of TXREQ flits dispatched. This event measures the total request bandwidth.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "rnid_txreq_flits_retried",
>> + "EventIdCode": "0x7",
>> + "NodeType": "0xa",
>> + "BriefDescription": "Number of retried TXREQ flits dispatched. This event measures the retry rate.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "sbsx_txrsp_retryack",
>> + "EventIdCode": "0x4",
>> + "NodeType": "0x7",
>> + "BriefDescription": "Number of RXREQ flits dispatched. This event is a measure of the retry rate.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "sbsx_txdat_flitv",
>> + "EventIdCode": "0x5",
>> + "NodeType": "0x7",
>> + "BriefDescription": "Number of TXDAT flits dispatched from XP to SBSX. This event is a measure of the write bandwidth.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "sbsx_arvalid_no_arready",
>> + "EventIdCode": "0x21",
>> + "NodeType": "0x7",
>> + "BriefDescription": "Number of cycles the SBSX bridge is stalled because of backpressure on AR channel.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "sbsx_awvalid_no_awready",
>> + "EventIdCode": "0x22",
>> + "NodeType": "0x7",
>> + "BriefDescription": "Number of cycles the SBSX bridge is stalled because of backpressure on AW channel.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "sbsx_wvalid_no_wready",
>> + "EventIdCode": "0x23",
>> + "NodeType": "0x7",
>> + "BriefDescription": "Number of cycles the SBSX bridge is stalled because of backpressure on W channel.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hni_txrsp_retryack",
>> + "EventIdCode": "0x2a",
>> + "NodeType": "0x4",
>> + "BriefDescription": "Number of RXREQ flits dispatched. This event is a measure of the retry rate.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hni_arvalid_no_arready",
>> + "EventIdCode": "0x2b",
>> + "NodeType": "0x4",
>> + "BriefDescription": "Number of cycles the HN-I bridge is stalled because of backpressure on AR channel.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hni_arready_no_arvalid",
>> + "EventIdCode": "0x2c",
>> + "NodeType": "0x4",
>> + "BriefDescription": "Number of cycles the AR channel is waiting for new requests from HN-I bridge.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hni_awvalid_no_awready",
>> + "EventIdCode": "0x2d",
>> + "NodeType": "0x4",
>> + "BriefDescription": "Number of cycles the HN-I bridge is stalled because of backpressure on AW channel.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hni_awready_no_awvalid",
>> + "EventIdCode": "0x2e",
>> + "NodeType": "0x4",
>> + "BriefDescription": "Number of cycles the AW channel is waiting for new requests from HN-I bridge.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hni_wvalid_no_wready",
>> + "EventIdCode": "0x2f",
>> + "NodeType": "0x4",
>> + "BriefDescription": "Number of cycles the HN-I bridge is stalled because of backpressure on W channel.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "EventName": "hni_txdat_stall",
>> + "EventIdCode": "0x30",
>> + "NodeType": "0x4",
>> + "BriefDescription": "TXDAT valid but no link credit available.",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + }
>> +]
>> diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jevents.py
>> index 369c8bf..935bd4b 100755
>> --- a/tools/perf/pmu-events/jevents.py
>> +++ b/tools/perf/pmu-events/jevents.py
>> @@ -272,6 +272,7 @@ class JsonEvent:
>> 'DFPMC': 'amd_df',
>> 'cpu_core': 'cpu_core',
>> 'cpu_atom': 'cpu_atom',
>> + 'arm_cmn': 'arm_cmn',
>> }
>> return table[unit] if unit in table else f'uncore_{unit.lower()}'
>>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v7 0/8] perf vendor events: Add JSON metrics for Arm CMN
2023-08-23 8:12 ` [PATCH v7 0/8] " John Garry
@ 2023-08-24 2:33 ` Jing Zhang
0 siblings, 0 replies; 27+ messages in thread
From: Jing Zhang @ 2023-08-24 2:33 UTC (permalink / raw)
To: John Garry, Ian Rogers
Cc: Will Deacon, James Clark, Arnaldo Carvalho de Melo, Mark Rutland,
Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra, Ingo Molnar,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-kernel,
linux-arm-kernel, linux-perf-users, linux-doc, Zhuo Song,
Shuai Xue
在 2023/8/23 下午4:12, John Garry 写道:
> On 21/08/2023 09:36, Jing Zhang wrote:
>
> I'm hoping that Ian can check the outstanding patches here, but I'll also have a look.
>
Thanks! I haven't added your tag to patch 6 for now, because I made a modification and added
the code in empty-pmu-events.c. Looking forward to your review.
Thanks,
Jing
>> Changes since v6:
>> - Supplement the omitted EventCode;
>> - Keep the original way of ConfigCode;
>> - Supplement the test in empty-pmu-events.c, so that the pmu event test
>> can succeed when build with NO_JEVENT=1.
>> - Link: https://urldefense.com/v3/__https://lore.kernel.org/all/1691394685-61240-1-git-send-email-renyu.zj@linux.alibaba.com/__;!!ACWV5N9M2RV99hQ!Lakh7Lf-6l6Hovm4Tt5S5pqV1xHm-LAW2ICVl6gLONlN4CNk-BvyADBfjwQe5yQQj89yMK7s7rSjMNHCyFsIUxnHXg$
>>
>> Jing Zhang (8):
>> perf pmu: "Compat" supports matching multiple identifiers
>> perf metric: "Compat" supports matching multiple identifiers
>> perf vendor events: Supplement the omitted EventCode
>> perf jevents: Support more event fields
>> perf test: Make matching_pmu effective
>> perf test: Add pmu-event test for "Compat" and new event_field.
>> perf jevents: Add support for Arm CMN PMU aliasing
>> perf vendor events: Add JSON metrics for Arm CMN
>>
>> .../pmu-events/arch/arm64/arm/cmn/sys/cmn.json | 266 +++++++++++++++++++++
>> .../pmu-events/arch/arm64/arm/cmn/sys/metric.json | 74 ++++++
>> .../pmu-events/arch/test/test_soc/sys/uncore.json | 8 +
>> .../pmu-events/arch/x86/alderlake/pipeline.json | 9 +
>> .../pmu-events/arch/x86/alderlaken/pipeline.json | 3 +
>> .../pmu-events/arch/x86/broadwell/pipeline.json | 4 +
>> .../pmu-events/arch/x86/broadwellde/pipeline.json | 4 +
>> .../arch/x86/broadwellde/uncore-cache.json | 2 +
>> .../arch/x86/broadwellde/uncore-interconnect.json | 1 +
>> .../arch/x86/broadwellde/uncore-memory.json | 1 +
>> .../arch/x86/broadwellde/uncore-power.json | 1 +
>> .../pmu-events/arch/x86/broadwellx/pipeline.json | 4 +
>> .../arch/x86/broadwellx/uncore-cache.json | 2 +
>> .../arch/x86/broadwellx/uncore-interconnect.json | 13 +
>> .../arch/x86/broadwellx/uncore-memory.json | 2 +
>> .../arch/x86/broadwellx/uncore-power.json | 1 +
>> .../pmu-events/arch/x86/cascadelakex/pipeline.json | 4 +
>> .../arch/x86/cascadelakex/uncore-cache.json | 2 +
>> .../arch/x86/cascadelakex/uncore-interconnect.json | 1 +
>> .../arch/x86/cascadelakex/uncore-io.json | 1 +
>> .../arch/x86/cascadelakex/uncore-memory.json | 1 +
>> .../arch/x86/cascadelakex/uncore-power.json | 1 +
>> .../pmu-events/arch/x86/elkhartlake/pipeline.json | 2 +
>> .../pmu-events/arch/x86/goldmont/pipeline.json | 3 +
>> .../pmu-events/arch/x86/goldmontplus/pipeline.json | 3 +
>> .../pmu-events/arch/x86/grandridge/pipeline.json | 3 +
>> .../arch/x86/graniterapids/pipeline.json | 4 +
>> .../perf/pmu-events/arch/x86/haswell/pipeline.json | 4 +
>> .../pmu-events/arch/x86/haswellx/pipeline.json | 4 +
>> .../pmu-events/arch/x86/haswellx/uncore-cache.json | 2 +
>> .../arch/x86/haswellx/uncore-interconnect.json | 14 ++
>> .../arch/x86/haswellx/uncore-memory.json | 2 +
>> .../pmu-events/arch/x86/haswellx/uncore-power.json | 1 +
>> .../perf/pmu-events/arch/x86/icelake/pipeline.json | 4 +
>> .../pmu-events/arch/x86/icelakex/pipeline.json | 4 +
>> .../pmu-events/arch/x86/icelakex/uncore-cache.json | 1 +
>> .../arch/x86/icelakex/uncore-interconnect.json | 1 +
>> .../arch/x86/icelakex/uncore-memory.json | 1 +
>> .../pmu-events/arch/x86/icelakex/uncore-power.json | 1 +
>> .../pmu-events/arch/x86/ivybridge/pipeline.json | 3 +
>> .../perf/pmu-events/arch/x86/ivytown/pipeline.json | 4 +
>> .../pmu-events/arch/x86/ivytown/uncore-cache.json | 2 +
>> .../arch/x86/ivytown/uncore-interconnect.json | 11 +
>> .../pmu-events/arch/x86/ivytown/uncore-memory.json | 1 +
>> .../pmu-events/arch/x86/ivytown/uncore-power.json | 1 +
>> .../pmu-events/arch/x86/jaketown/pipeline.json | 4 +
>> .../pmu-events/arch/x86/jaketown/uncore-cache.json | 2 +
>> .../arch/x86/jaketown/uncore-interconnect.json | 12 +
>> .../arch/x86/jaketown/uncore-memory.json | 1 +
>> .../pmu-events/arch/x86/jaketown/uncore-power.json | 2 +
>> .../arch/x86/knightslanding/pipeline.json | 3 +
>> .../arch/x86/knightslanding/uncore-cache.json | 1 +
>> .../arch/x86/knightslanding/uncore-memory.json | 4 +
>> .../pmu-events/arch/x86/meteorlake/pipeline.json | 8 +
>> .../pmu-events/arch/x86/sandybridge/pipeline.json | 4 +
>> .../arch/x86/sapphirerapids/pipeline.json | 5 +
>> .../pmu-events/arch/x86/sierraforest/pipeline.json | 4 +
>> .../pmu-events/arch/x86/silvermont/pipeline.json | 3 +
>> .../perf/pmu-events/arch/x86/skylake/pipeline.json | 4 +
>> .../pmu-events/arch/x86/skylakex/pipeline.json | 4 +
>> .../pmu-events/arch/x86/skylakex/uncore-cache.json | 2 +
>> .../arch/x86/skylakex/uncore-interconnect.json | 1 +
>> .../pmu-events/arch/x86/skylakex/uncore-io.json | 1 +
>> .../arch/x86/skylakex/uncore-memory.json | 1 +
>> .../pmu-events/arch/x86/skylakex/uncore-power.json | 1 +
>> .../pmu-events/arch/x86/snowridgex/pipeline.json | 2 +
>> .../arch/x86/snowridgex/uncore-cache.json | 1 +
>> .../arch/x86/snowridgex/uncore-interconnect.json | 1 +
>> .../arch/x86/snowridgex/uncore-memory.json | 1 +
>> .../arch/x86/snowridgex/uncore-power.json | 1 +
>> .../pmu-events/arch/x86/tigerlake/pipeline.json | 5 +
>> tools/perf/pmu-events/empty-pmu-events.c | 8 +
>> tools/perf/pmu-events/jevents.py | 21 +-
>> tools/perf/tests/pmu-events.c | 64 ++++-
>> tools/perf/util/metricgroup.c | 2 +-
>> tools/perf/util/pmu.c | 33 ++-
>> tools/perf/util/pmu.h | 1 +
>> 77 files changed, 679 insertions(+), 9 deletions(-)
>> create mode 100644 tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
>> create mode 100644 tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json
>>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v7 1/8] perf pmu: "Compat" supports matching multiple identifiers
2023-08-21 8:36 ` [PATCH v7 1/8] perf pmu: "Compat" supports matching multiple identifiers Jing Zhang
@ 2023-08-24 15:05 ` Robin Murphy
2023-08-25 8:40 ` Jing Zhang
2023-08-25 4:11 ` Ian Rogers
1 sibling, 1 reply; 27+ messages in thread
From: Robin Murphy @ 2023-08-24 15:05 UTC (permalink / raw)
To: Jing Zhang, John Garry, Ian Rogers
Cc: Will Deacon, James Clark, Arnaldo Carvalho de Melo, Mark Rutland,
Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra, Ingo Molnar,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-kernel,
linux-arm-kernel, linux-perf-users, linux-doc, Zhuo Song,
Shuai Xue
On 21/08/2023 9:36 am, Jing Zhang wrote:
> The jevent "Compat" is used for uncore PMU alias or metric definitions.
>
> The same PMU driver has different PMU identifiers due to different
> hardware versions and types, but they may have some common PMU event.
> Since a Compat value can only match one identifier, when adding the
> same event alias to PMUs with different identifiers, each identifier
> needs to be defined once, which is not streamlined enough.
>
> So let "Compat" supports matching multiple identifiers for uncore PMU
> alias. For example, the Compat value {43401;436*} can match the PMU
> identifier "43401", that is, CMN600_r0p0, and the PMU identifier with
> the prefix "436", that is, all CMN650, where "*" is a wildcard.
> Tokens in Unit field are delimited by ';' with no spaces.
I wonder is there any possibility of supporting multiple values as a
JSON array, rather than a single delimited string? Otherwise, if we're
putting restrictions on what characters a driver can expose as an
identifier, then I think that really wants explicitly documenting.
AFAICT there's currently not even any documentation of the de-facto ABI
that it's expected to be a free-form string rather than completely
arbitrary binary data.
Thanks,
Robin.
> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
> Reviewed-by: John Garry <john.g.garry@oracle.com>
> ---
> tools/perf/util/pmu.c | 33 +++++++++++++++++++++++++++++++--
> tools/perf/util/pmu.h | 1 +
> 2 files changed, 32 insertions(+), 2 deletions(-)
>
> diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
> index ad209c8..6402423 100644
> --- a/tools/perf/util/pmu.c
> +++ b/tools/perf/util/pmu.c
> @@ -776,6 +776,35 @@ static bool pmu_uncore_alias_match(const char *pmu_name, const char *name)
> return res;
> }
>
> +bool pmu_uncore_identifier_match(const char *id, const char *compat)
> +{
> + char *tmp = NULL, *tok, *str;
> + bool res;
> + int n;
> +
> + /*
> + * The strdup() call is necessary here because "compat" is a const str*
> + * type and cannot be used as an argument to strtok_r().
> + */
> + str = strdup(compat);
> + if (!str)
> + return false;
> +
> + tok = strtok_r(str, ";", &tmp);
> + for (; tok; tok = strtok_r(NULL, ";", &tmp)) {
> + n = strlen(tok);
> + if ((tok[n - 1] == '*' && !strncmp(id, tok, n - 1)) ||
> + !strcmp(id, tok)) {
> + res = true;
> + goto out;
> + }
> + }
> + res = false;
> +out:
> + free(str);
> + return res;
> +}
> +
> struct pmu_add_cpu_aliases_map_data {
> struct list_head *head;
> const char *name;
> @@ -847,8 +876,8 @@ static int pmu_add_sys_aliases_iter_fn(const struct pmu_event *pe,
> if (!pe->compat || !pe->pmu)
> return 0;
>
> - if (!strcmp(pmu->id, pe->compat) &&
> - pmu_uncore_alias_match(pe->pmu, pmu->name)) {
> + if (pmu_uncore_alias_match(pe->pmu, pmu->name) &&
> + pmu_uncore_identifier_match(pmu->id, pe->compat)) {
> __perf_pmu__new_alias(idata->head, -1,
> (char *)pe->name,
> (char *)pe->desc,
> diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h
> index b9a02de..9d4385d 100644
> --- a/tools/perf/util/pmu.h
> +++ b/tools/perf/util/pmu.h
> @@ -241,6 +241,7 @@ void pmu_add_cpu_aliases_table(struct list_head *head, struct perf_pmu *pmu,
> char *perf_pmu__getcpuid(struct perf_pmu *pmu);
> const struct pmu_events_table *pmu_events_table__find(void);
> const struct pmu_metrics_table *pmu_metrics_table__find(void);
> +bool pmu_uncore_identifier_match(const char *id, const char *compat);
> void perf_pmu_free_alias(struct perf_pmu_alias *alias);
>
> int perf_pmu__convert_scale(const char *scale, char **end, double *sval);
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v7 1/8] perf pmu: "Compat" supports matching multiple identifiers
2023-08-21 8:36 ` [PATCH v7 1/8] perf pmu: "Compat" supports matching multiple identifiers Jing Zhang
2023-08-24 15:05 ` Robin Murphy
@ 2023-08-25 4:11 ` Ian Rogers
2023-08-25 6:12 ` Jing Zhang
1 sibling, 1 reply; 27+ messages in thread
From: Ian Rogers @ 2023-08-25 4:11 UTC (permalink / raw)
To: Jing Zhang
Cc: John Garry, Will Deacon, James Clark, Arnaldo Carvalho de Melo,
Mark Rutland, Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra,
Ingo Molnar, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
linux-kernel, linux-arm-kernel, linux-perf-users, linux-doc,
Zhuo Song, Shuai Xue
On Mon, Aug 21, 2023 at 1:36 AM Jing Zhang <renyu.zj@linux.alibaba.com> wrote:
>
> The jevent "Compat" is used for uncore PMU alias or metric definitions.
>
> The same PMU driver has different PMU identifiers due to different
> hardware versions and types, but they may have some common PMU event.
> Since a Compat value can only match one identifier, when adding the
> same event alias to PMUs with different identifiers, each identifier
> needs to be defined once, which is not streamlined enough.
>
> So let "Compat" supports matching multiple identifiers for uncore PMU
> alias. For example, the Compat value {43401;436*} can match the PMU
> identifier "43401", that is, CMN600_r0p0, and the PMU identifier with
> the prefix "436", that is, all CMN650, where "*" is a wildcard.
> Tokens in Unit field are delimited by ';' with no spaces.
>
> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
> Reviewed-by: John Garry <john.g.garry@oracle.com>
> ---
> tools/perf/util/pmu.c | 33 +++++++++++++++++++++++++++++++--
> tools/perf/util/pmu.h | 1 +
> 2 files changed, 32 insertions(+), 2 deletions(-)
>
> diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
> index ad209c8..6402423 100644
> --- a/tools/perf/util/pmu.c
> +++ b/tools/perf/util/pmu.c
> @@ -776,6 +776,35 @@ static bool pmu_uncore_alias_match(const char *pmu_name, const char *name)
> return res;
> }
>
> +bool pmu_uncore_identifier_match(const char *id, const char *compat)
static?
> +{
> + char *tmp = NULL, *tok, *str;
> + bool res;
Initialize to false to avoid the goto.
> + int n;
Move into the scope of the for loop, to reduce the scope.
> +
> + /*
> + * The strdup() call is necessary here because "compat" is a const str*
> + * type and cannot be used as an argument to strtok_r().
> + */
> + str = strdup(compat);
> + if (!str)
> + return false;
> +
> + tok = strtok_r(str, ";", &tmp);
> + for (; tok; tok = strtok_r(NULL, ";", &tmp)) {
> + n = strlen(tok);
> + if ((tok[n - 1] == '*' && !strncmp(id, tok, n - 1)) ||
> + !strcmp(id, tok)) {
We use fnmatch for a similar check:
https://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git/tree/tools/perf/util/pmu.c?h=perf-tools-next#n1982
> + res = true;
> + goto out;
With "res=false;" above this can just be a regular break.
Thanks,
Ian
> + }
> + }
> + res = false;
> +out:
> + free(str);
> + return res;
> +}
> +
> struct pmu_add_cpu_aliases_map_data {
> struct list_head *head;
> const char *name;
> @@ -847,8 +876,8 @@ static int pmu_add_sys_aliases_iter_fn(const struct pmu_event *pe,
> if (!pe->compat || !pe->pmu)
> return 0;
>
> - if (!strcmp(pmu->id, pe->compat) &&
> - pmu_uncore_alias_match(pe->pmu, pmu->name)) {
> + if (pmu_uncore_alias_match(pe->pmu, pmu->name) &&
> + pmu_uncore_identifier_match(pmu->id, pe->compat)) {
> __perf_pmu__new_alias(idata->head, -1,
> (char *)pe->name,
> (char *)pe->desc,
> diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h
> index b9a02de..9d4385d 100644
> --- a/tools/perf/util/pmu.h
> +++ b/tools/perf/util/pmu.h
> @@ -241,6 +241,7 @@ void pmu_add_cpu_aliases_table(struct list_head *head, struct perf_pmu *pmu,
> char *perf_pmu__getcpuid(struct perf_pmu *pmu);
> const struct pmu_events_table *pmu_events_table__find(void);
> const struct pmu_metrics_table *pmu_metrics_table__find(void);
> +bool pmu_uncore_identifier_match(const char *id, const char *compat);
> void perf_pmu_free_alias(struct perf_pmu_alias *alias);
>
> int perf_pmu__convert_scale(const char *scale, char **end, double *sval);
> --
> 1.8.3.1
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v7 8/8] perf vendor events: Add JSON metrics for Arm CMN
2023-08-21 8:36 ` [PATCH v7 8/8] perf vendor events: Add JSON metrics for Arm CMN Jing Zhang
@ 2023-08-25 4:13 ` Ian Rogers
2023-08-25 6:47 ` Jing Zhang
0 siblings, 1 reply; 27+ messages in thread
From: Ian Rogers @ 2023-08-25 4:13 UTC (permalink / raw)
To: Jing Zhang
Cc: John Garry, Will Deacon, James Clark, Arnaldo Carvalho de Melo,
Mark Rutland, Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra,
Ingo Molnar, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
linux-kernel, linux-arm-kernel, linux-perf-users, linux-doc,
Zhuo Song, Shuai Xue
On Mon, Aug 21, 2023 at 1:36 AM Jing Zhang <renyu.zj@linux.alibaba.com> wrote:
>
> Add JSON metrics for Arm CMN. Currently just add part of CMN PMU
> metrics which are general and compatible for any SoC with CMN-ANY.
>
> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
> Reviewed-by: John Garry <john.g.garry@oracle.com>
> ---
> .../pmu-events/arch/arm64/arm/cmn/sys/metric.json | 74 ++++++++++++++++++++++
> 1 file changed, 74 insertions(+)
> create mode 100644 tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json
>
> diff --git a/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json b/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json
> new file mode 100644
> index 0000000..64db534
> --- /dev/null
> +++ b/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json
> @@ -0,0 +1,74 @@
> +[
> + {
> + "MetricName": "slc_miss_rate",
> + "BriefDescription": "The system level cache miss rate.",
> + "MetricGroup": "cmn",
> + "MetricExpr": "hnf_cache_miss / hnf_slc_sf_cache_access",
> + "ScaleUnit": "100%",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
Here a ';' is used as a separator, but for "Unit" ',' is used as a
separator. Is there a reason for the inconsistency?
Thanks,
Ian
> + },
> + {
> + "MetricName": "hnf_message_retry_rate",
> + "BriefDescription": "HN-F message retry rate indicates whether a lack of credits is causing the bottlenecks.",
> + "MetricGroup": "cmn",
> + "MetricExpr": "hnf_pocq_retry / hnf_pocq_reqs_recvd",
> + "ScaleUnit": "100%",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "MetricName": "sf_hit_rate",
> + "BriefDescription": "Snoop filter hit rate can be used to measure the snoop filter efficiency.",
> + "MetricGroup": "cmn",
> + "MetricExpr": "hnf_sf_hit / hnf_slc_sf_cache_access",
> + "ScaleUnit": "100%",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "MetricName": "mc_message_retry_rate",
> + "BriefDescription": "The memory controller request retries rate indicates whether the memory controller is the bottleneck.",
> + "MetricGroup": "cmn",
> + "MetricExpr": "hnf_mc_retries / hnf_mc_reqs",
> + "ScaleUnit": "100%",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "MetricName": "rni_actual_read_bandwidth.all",
> + "BriefDescription": "This event measure the actual bandwidth that RN-I bridge sends to the interconnect.",
> + "MetricGroup": "cmn",
> + "MetricExpr": "rnid_rxdat_flits * 32 / 1e6 / duration_time",
> + "ScaleUnit": "1MB/s",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "MetricName": "rni_actual_write_bandwidth.all",
> + "BriefDescription": "This event measures the actual write bandwidth at RN-I bridges.",
> + "MetricGroup": "cmn",
> + "MetricExpr": "rnid_txdat_flits * 32 / 1e6 / duration_time",
> + "ScaleUnit": "1MB/s",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "MetricName": "rni_retry_rate",
> + "BriefDescription": "RN-I bridge retry rate indicates whether the memory controller is the bottleneck.",
> + "MetricGroup": "cmn",
> + "MetricExpr": "rnid_txreq_flits_retried / rnid_txreq_flits_total",
> + "ScaleUnit": "100%",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + },
> + {
> + "MetricName": "sbsx_actual_write_bandwidth.all",
> + "BriefDescription": "sbsx actual write bandwidth.",
> + "MetricGroup": "cmn",
> + "MetricExpr": "sbsx_txdat_flitv * 32 / 1e6 / duration_time",
> + "ScaleUnit": "1MB/s",
> + "Unit": "arm_cmn",
> + "Compat": "434*;436*;43c*;43a*"
> + }
> +]
> --
> 1.8.3.1
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v7 2/8] perf metric: "Compat" supports matching multiple identifiers
2023-08-21 8:36 ` [PATCH v7 2/8] perf metric: " Jing Zhang
@ 2023-08-25 4:16 ` Ian Rogers
0 siblings, 0 replies; 27+ messages in thread
From: Ian Rogers @ 2023-08-25 4:16 UTC (permalink / raw)
To: Jing Zhang
Cc: John Garry, Will Deacon, James Clark, Arnaldo Carvalho de Melo,
Mark Rutland, Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra,
Ingo Molnar, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
linux-kernel, linux-arm-kernel, linux-perf-users, linux-doc,
Zhuo Song, Shuai Xue
On Mon, Aug 21, 2023 at 1:36 AM Jing Zhang <renyu.zj@linux.alibaba.com> wrote:
>
> The jevent "Compat" is used for uncore PMU alias or metric definitions.
>
> The same PMU driver has different PMU identifiers due to different
> hardware versions and types, but they may have some common PMU metric.
> Since a Compat value can only match one identifier, when adding the
> same metric to PMUs with different identifiers, each identifier needs
> to be defined once, which is not streamlined enough.
>
> So let "Compat" supports matching multiple identifiers for uncore PMU
> metric.
>
> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
> Reviewed-by: John Garry <john.g.garry@oracle.com>
Reviewed-by: Ian Rogers <irogers@google.com>
Thanks,
Ian
> ---
> tools/perf/util/metricgroup.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
> index 5e9c657..ff81bc5 100644
> --- a/tools/perf/util/metricgroup.c
> +++ b/tools/perf/util/metricgroup.c
> @@ -477,7 +477,7 @@ static int metricgroup__sys_event_iter(const struct pmu_metric *pm,
>
> while ((pmu = perf_pmu__scan(pmu))) {
>
> - if (!pmu->id || strcmp(pmu->id, pm->compat))
> + if (!pmu->id || !pmu_uncore_identifier_match(pmu->id, pm->compat))
> continue;
>
> return d->fn(pm, table, d->data);
> --
> 1.8.3.1
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v7 5/8] perf test: Make matching_pmu effective
2023-08-21 8:36 ` [PATCH v7 5/8] perf test: Make matching_pmu effective Jing Zhang
@ 2023-08-25 4:27 ` Ian Rogers
2023-08-25 6:30 ` Jing Zhang
0 siblings, 1 reply; 27+ messages in thread
From: Ian Rogers @ 2023-08-25 4:27 UTC (permalink / raw)
To: Jing Zhang
Cc: John Garry, Will Deacon, James Clark, Arnaldo Carvalho de Melo,
Mark Rutland, Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra,
Ingo Molnar, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
linux-kernel, linux-arm-kernel, linux-perf-users, linux-doc,
Zhuo Song, Shuai Xue
On Mon, Aug 21, 2023 at 1:36 AM Jing Zhang <renyu.zj@linux.alibaba.com> wrote:
>
> The perf_pmu_test_event.matching_pmu didn't work. No matter what its
> value is, it does not affect the test results. So let matching_pmu be
> used for matching perf_pmu_test_pmu.pmu.name.
Could you rebase this onto the latest perf-tools-next, I'd like to test this.
Thanks,
Ian
> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
> Reviewed-by: John Garry <john.g.garry@oracle.com>
> ---
> tools/perf/tests/pmu-events.c | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/tools/perf/tests/pmu-events.c b/tools/perf/tests/pmu-events.c
> index 1dff863b..3204252 100644
> --- a/tools/perf/tests/pmu-events.c
> +++ b/tools/perf/tests/pmu-events.c
> @@ -238,7 +238,7 @@ struct perf_pmu_test_pmu {
> },
> .alias_str = "event=0x2b",
> .alias_long_desc = "ddr write-cycles event. Unit: uncore_sys_ddr_pmu ",
> - .matching_pmu = "uncore_sys_ddr_pmu",
> + .matching_pmu = "uncore_sys_ddr_pmu0",
> };
>
> static const struct perf_pmu_test_event sys_ccn_pmu_read_cycles = {
> @@ -252,7 +252,7 @@ struct perf_pmu_test_pmu {
> },
> .alias_str = "config=0x2c",
> .alias_long_desc = "ccn read-cycles event. Unit: uncore_sys_ccn_pmu ",
> - .matching_pmu = "uncore_sys_ccn_pmu",
> + .matching_pmu = "uncore_sys_ccn_pmu4",
> };
>
> static const struct perf_pmu_test_event *sys_events[] = {
> @@ -599,6 +599,11 @@ static int __test_uncore_pmu_event_aliases(struct perf_pmu_test_pmu *test_pmu)
> struct pmu_event const *event = &test_event->event;
>
> if (!strcmp(event->name, alias->name)) {
> + if (strcmp(pmu_name, test_event->matching_pmu)) {
> + pr_debug("testing aliases uncore PMU %s: mismatched matching_pmu, %s vs %s\n",
> + pmu_name, test_event->matching_pmu, pmu_name);
> + continue;
> + }
> if (compare_alias_to_test_event(alias,
> test_event,
> pmu_name)) {
> --
> 1.8.3.1
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v7 6/8] perf test: Add pmu-event test for "Compat" and new event_field.
2023-08-21 8:36 ` [PATCH v7 6/8] perf test: Add pmu-event test for "Compat" and new event_field Jing Zhang
@ 2023-08-25 4:30 ` Ian Rogers
2023-08-25 6:30 ` Jing Zhang
0 siblings, 1 reply; 27+ messages in thread
From: Ian Rogers @ 2023-08-25 4:30 UTC (permalink / raw)
To: Jing Zhang
Cc: John Garry, Will Deacon, James Clark, Arnaldo Carvalho de Melo,
Mark Rutland, Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra,
Ingo Molnar, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
linux-kernel, linux-arm-kernel, linux-perf-users, linux-doc,
Zhuo Song, Shuai Xue
On Mon, Aug 21, 2023 at 1:36 AM Jing Zhang <renyu.zj@linux.alibaba.com> wrote:
>
> Add new event test for uncore system event which is used to verify the
> functionality of "Compat" matching multiple identifiers and the new event
> fields "EventIdCode" and "Type".
>
> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
Thanks for the tests! I've no issue with them beside the already
mentioned ';'. This will need updating for:
https://lore.kernel.org/lkml/20230824183212.374787-1-irogers@google.com/
https://lore.kernel.org/lkml/20230825024002.801955-1-irogers@google.com/
Thanks,
Ian
> ---
> .../pmu-events/arch/test/test_soc/sys/uncore.json | 8 ++++
> tools/perf/pmu-events/empty-pmu-events.c | 8 ++++
> tools/perf/tests/pmu-events.c | 55 ++++++++++++++++++++++
> 3 files changed, 71 insertions(+)
>
> diff --git a/tools/perf/pmu-events/arch/test/test_soc/sys/uncore.json b/tools/perf/pmu-events/arch/test/test_soc/sys/uncore.json
> index c7e7528..06b886d 100644
> --- a/tools/perf/pmu-events/arch/test/test_soc/sys/uncore.json
> +++ b/tools/perf/pmu-events/arch/test/test_soc/sys/uncore.json
> @@ -12,5 +12,13 @@
> "EventName": "sys_ccn_pmu.read_cycles",
> "Unit": "sys_ccn_pmu",
> "Compat": "0x01"
> + },
> + {
> + "BriefDescription": "Counts total cache misses in first lookup result (high priority).",
> + "NodeType": "0x05",
> + "EventIdCode": "0x01",
> + "EventName": "sys_cmn_pmu.hnf_cache_miss",
> + "Unit": "sys_cmn_pmu",
> + "Compat": "434*;436*;43c*;43a01"
> }
> ]
> diff --git a/tools/perf/pmu-events/empty-pmu-events.c b/tools/perf/pmu-events/empty-pmu-events.c
> index e74defb..25be18a 100644
> --- a/tools/perf/pmu-events/empty-pmu-events.c
> +++ b/tools/perf/pmu-events/empty-pmu-events.c
> @@ -245,6 +245,14 @@ struct pmu_events_map {
> .pmu = "uncore_sys_ccn_pmu",
> },
> {
> + .name = "sys_cmn_pmu.hnf_cache_miss",
> + .event = "type=0x05,eventid=0x01",
> + .desc = "Counts total cache misses in first lookup result (high priority). Unit: uncore_sys_cmn_pmu ",
> + .compat = "434*;436*;43c*;43a01",
> + .topic = "uncore",
> + .pmu = "uncore_sys_cmn_pmu",
> + },
> + {
> .name = 0,
> .event = 0,
> .desc = 0,
> diff --git a/tools/perf/tests/pmu-events.c b/tools/perf/tests/pmu-events.c
> index 3204252..79fb3e2 100644
> --- a/tools/perf/tests/pmu-events.c
> +++ b/tools/perf/tests/pmu-events.c
> @@ -255,9 +255,24 @@ struct perf_pmu_test_pmu {
> .matching_pmu = "uncore_sys_ccn_pmu4",
> };
>
> +static const struct perf_pmu_test_event sys_cmn_pmu_hnf_cache_miss = {
> + .event = {
> + .name = "sys_cmn_pmu.hnf_cache_miss",
> + .event = "type=0x05,eventid=0x01",
> + .desc = "Counts total cache misses in first lookup result (high priority). Unit: uncore_sys_cmn_pmu ",
> + .topic = "uncore",
> + .pmu = "uncore_sys_cmn_pmu",
> + .compat = "434*;436*;43c*;43a01",
> + },
> + .alias_str = "type=0x5,eventid=0x1",
> + .alias_long_desc = "Counts total cache misses in first lookup result (high priority). Unit: uncore_sys_cmn_pmu ",
> + .matching_pmu = "uncore_sys_cmn_pmu0",
> +};
> +
> static const struct perf_pmu_test_event *sys_events[] = {
> &sys_ddr_pmu_write_cycles,
> &sys_ccn_pmu_read_cycles,
> + &sys_cmn_pmu_hnf_cache_miss,
> NULL
> };
>
> @@ -704,6 +719,46 @@ static int __test_uncore_pmu_event_aliases(struct perf_pmu_test_pmu *test_pmu)
> &sys_ccn_pmu_read_cycles,
> },
> },
> + {
> + .pmu = {
> + .name = (char *)"uncore_sys_cmn_pmu0",
> + .is_uncore = 1,
> + .id = (char *)"43401",
> + },
> + .aliases = {
> + &sys_cmn_pmu_hnf_cache_miss,
> + },
> + },
> + {
> + .pmu = {
> + .name = (char *)"uncore_sys_cmn_pmu0",
> + .is_uncore = 1,
> + .id = (char *)"43602",
> + },
> + .aliases = {
> + &sys_cmn_pmu_hnf_cache_miss,
> + },
> + },
> + {
> + .pmu = {
> + .name = (char *)"uncore_sys_cmn_pmu0",
> + .is_uncore = 1,
> + .id = (char *)"43c03",
> + },
> + .aliases = {
> + &sys_cmn_pmu_hnf_cache_miss,
> + },
> + },
> + {
> + .pmu = {
> + .name = (char *)"uncore_sys_cmn_pmu0",
> + .is_uncore = 1,
> + .id = (char *)"43a01",
> + },
> + .aliases = {
> + &sys_cmn_pmu_hnf_cache_miss,
> + },
> + }
> };
>
> /* Test that aliases generated are as expected */
> --
> 1.8.3.1
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v7 4/8] perf jevents: Support more event fields
2023-08-23 9:12 ` Robin Murphy
@ 2023-08-25 4:42 ` Ian Rogers
0 siblings, 0 replies; 27+ messages in thread
From: Ian Rogers @ 2023-08-25 4:42 UTC (permalink / raw)
To: Robin Murphy
Cc: Jing Zhang, John Garry, Will Deacon, James Clark,
Arnaldo Carvalho de Melo, Mark Rutland, Mike Leach, Leo Yan,
Namhyung Kim, Peter Zijlstra, Ingo Molnar, Alexander Shishkin,
Jiri Olsa, Adrian Hunter, linux-kernel, linux-arm-kernel,
linux-perf-users, linux-doc, Zhuo Song, Shuai Xue
On Wed, Aug 23, 2023 at 2:12 AM Robin Murphy <robin.murphy@arm.com> wrote:
>
> On 2023-08-21 09:36, Jing Zhang wrote:
> > The previous code assumes an event has either an "event=" or "config"
> > field at the beginning. For CMN neither of these may be present, as an
> > event is typically "type=xx,eventid=xxx".
> >
> > If EventCode and ConfigCode is not added in the alias JSON file, the
> > event description will add "event=0" by default. So, even if the event
> > field is added "eventid=xxx" and "type=xxx", the CMN events final
> > parsing result will be "event=0, eventid=xxx, type=xxx".
> >
> > Therefore, when EventCode and ConfigCode are missing in JSON, "event=0"
> > is no longer added by default. And add EventIdCode and Type to the event
> > field.
> >
> > I compared pmu_event.c before and after compiling with JEVENT_ARCH=all,
> > they are consistent.
> >
> > Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
> > ---
> > tools/perf/pmu-events/jevents.py | 20 ++++++++++++++++----
> > 1 file changed, 16 insertions(+), 4 deletions(-)
> >
> > diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jevents.py
> > index f57a8f2..369c8bf 100755
> > --- a/tools/perf/pmu-events/jevents.py
> > +++ b/tools/perf/pmu-events/jevents.py
> > @@ -275,11 +275,14 @@ class JsonEvent:
> > }
> > return table[unit] if unit in table else f'uncore_{unit.lower()}'
> >
> > - eventcode = 0
> > + eventcode = None
> > if 'EventCode' in jd:
> > eventcode = int(jd['EventCode'].split(',', 1)[0], 0)
> > if 'ExtSel' in jd:
> > - eventcode |= int(jd['ExtSel']) << 8
> > + if eventcode is None:
> > + eventcode = int(jd['ExtSel']) << 8
> > + else:
> > + eventcode |= int(jd['ExtSel']) << 8
> > configcode = int(jd['ConfigCode'], 0) if 'ConfigCode' in jd else None
> > self.name = jd['EventName'].lower() if 'EventName' in jd else None
> > self.topic = ''
> > @@ -317,7 +320,11 @@ class JsonEvent:
> > if precise and self.desc and '(Precise Event)' not in self.desc:
> > extra_desc += ' (Must be precise)' if precise == '2' else (' (Precise '
> > 'event)')
> > - event = f'config={llx(configcode)}' if configcode is not None else f'event={llx(eventcode)}'
> > + event = None
> > + if eventcode is not None:
> > + event = f'event={llx(eventcode)}'
> > + elif configcode is not None:
> > + event = f'config={llx(configcode)}'
> > event_fields = [
> > ('AnyThread', 'any='),
> > ('PortMask', 'ch_mask='),
> > @@ -327,10 +334,15 @@ class JsonEvent:
> > ('Invert', 'inv='),
> > ('SampleAfterValue', 'period='),
> > ('UMask', 'umask='),
> > + ('NodeType', 'type='),
> > + ('EventIdCode', 'eventid='),
>
> FWIW, this smells like another brewing scalability problem, given that
> these are entirely driver-specific. Not sure off-hand how feasible it
> might be, but my instinct says that a neat solution would be to encode
> them right in the JSON, e.g.:
>
> "FormatAttr": { "type": 0x5 }
>
> such that jevents should then only really need to consider whether an
> event is defined in terms of a raw "ConfigCode", one or more
> "FormatAttr"s which it can then parse dynamically, or reasonable special
> cases like "EventCode" (given how "event" is one of the most commonly
> used formats).
Hi Robin,
I'm not sure about scalability but I think it is a problem that we
encode names into the event that should correspond with formats, but
we don't test that the PMU driver in question supports the format. If
we tar up sysfs directories I think we can check/test this and it
makes sense for the perf tool to be able to parse a sysfs type
directory structure.
I think the hard coded names and matching to dictionary entries is
suboptimal, we should really be able to know the formats, abstract
this, etc. The code is deliberately done this way so that we could
migrate away from a legacy C version of this code and generate an
identical pmu-events.c. As much as is possible the python code matches
the C code, but now the transition has happened there is no reason to
maintain this behavior.
Thanks,
Ian
> Thanks,
> Robin.
>
> > ]
> > for key, value in event_fields:
> > if key in jd and jd[key] != '0':
> > - event += ',' + value + jd[key]
> > + if event:
> > + event += ',' + value + jd[key]
> > + else:
> > + event = value + jd[key]
> > if filter:
> > event += f',{filter}'
> > if msr:
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v7 1/8] perf pmu: "Compat" supports matching multiple identifiers
2023-08-25 4:11 ` Ian Rogers
@ 2023-08-25 6:12 ` Jing Zhang
0 siblings, 0 replies; 27+ messages in thread
From: Jing Zhang @ 2023-08-25 6:12 UTC (permalink / raw)
To: Ian Rogers
Cc: John Garry, Will Deacon, James Clark, Arnaldo Carvalho de Melo,
Mark Rutland, Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra,
Ingo Molnar, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
linux-kernel, linux-arm-kernel, linux-perf-users, linux-doc,
Zhuo Song, Shuai Xue
在 2023/8/25 下午12:11, Ian Rogers 写道:
> On Mon, Aug 21, 2023 at 1:36 AM Jing Zhang <renyu.zj@linux.alibaba.com> wrote:
>>
>> The jevent "Compat" is used for uncore PMU alias or metric definitions.
>>
>> The same PMU driver has different PMU identifiers due to different
>> hardware versions and types, but they may have some common PMU event.
>> Since a Compat value can only match one identifier, when adding the
>> same event alias to PMUs with different identifiers, each identifier
>> needs to be defined once, which is not streamlined enough.
>>
>> So let "Compat" supports matching multiple identifiers for uncore PMU
>> alias. For example, the Compat value {43401;436*} can match the PMU
>> identifier "43401", that is, CMN600_r0p0, and the PMU identifier with
>> the prefix "436", that is, all CMN650, where "*" is a wildcard.
>> Tokens in Unit field are delimited by ';' with no spaces.
>>
>> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
>> Reviewed-by: John Garry <john.g.garry@oracle.com>
>> ---
>> tools/perf/util/pmu.c | 33 +++++++++++++++++++++++++++++++--
>> tools/perf/util/pmu.h | 1 +
>> 2 files changed, 32 insertions(+), 2 deletions(-)
>>
>> diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
>> index ad209c8..6402423 100644
>> --- a/tools/perf/util/pmu.c
>> +++ b/tools/perf/util/pmu.c
>> @@ -776,6 +776,35 @@ static bool pmu_uncore_alias_match(const char *pmu_name, const char *name)
>> return res;
>> }
>>
>> +bool pmu_uncore_identifier_match(const char *id, const char *compat)
>
> static?
>
This function needs to be called in utils/metricgroup.c, so it cannot be static.
>> +{
>> + char *tmp = NULL, *tok, *str;
>> + bool res;
>
> Initialize to false to avoid the goto.
>
ok,no problem.
>> + int n;
>
> Move into the scope of the for loop, to reduce the scope.
>
ok
>> +
>> + /*
>> + * The strdup() call is necessary here because "compat" is a const str*
>> + * type and cannot be used as an argument to strtok_r().
>> + */
>> + str = strdup(compat);
>> + if (!str)
>> + return false;
>> +
>> + tok = strtok_r(str, ";", &tmp);
>> + for (; tok; tok = strtok_r(NULL, ";", &tmp)) {
>> + n = strlen(tok);
>> + if ((tok[n - 1] == '*' && !strncmp(id, tok, n - 1)) ||
>> + !strcmp(id, tok)) {
>
> We use fnmatch for a similar check:
> https://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git/tree/tools/perf/util/pmu.c?h=perf-tools-next#n1982
>
ok
>> + res = true;
>> + goto out;
>
> With "res=false;" above this can just be a regular break.
>
ok, thank you!
> Thanks,
> Ian
>
>> + }
>> + }
>> + res = false;
>> +out:
>> + free(str);
>> + return res;
>> +}
>> +
>> struct pmu_add_cpu_aliases_map_data {
>> struct list_head *head;
>> const char *name;
>> @@ -847,8 +876,8 @@ static int pmu_add_sys_aliases_iter_fn(const struct pmu_event *pe,
>> if (!pe->compat || !pe->pmu)
>> return 0;
>>
>> - if (!strcmp(pmu->id, pe->compat) &&
>> - pmu_uncore_alias_match(pe->pmu, pmu->name)) {
>> + if (pmu_uncore_alias_match(pe->pmu, pmu->name) &&
>> + pmu_uncore_identifier_match(pmu->id, pe->compat)) {
>> __perf_pmu__new_alias(idata->head, -1,
>> (char *)pe->name,
>> (char *)pe->desc,
>> diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h
>> index b9a02de..9d4385d 100644
>> --- a/tools/perf/util/pmu.h
>> +++ b/tools/perf/util/pmu.h
>> @@ -241,6 +241,7 @@ void pmu_add_cpu_aliases_table(struct list_head *head, struct perf_pmu *pmu,
>> char *perf_pmu__getcpuid(struct perf_pmu *pmu);
>> const struct pmu_events_table *pmu_events_table__find(void);
>> const struct pmu_metrics_table *pmu_metrics_table__find(void);
>> +bool pmu_uncore_identifier_match(const char *id, const char *compat);
>> void perf_pmu_free_alias(struct perf_pmu_alias *alias);
>>
>> int perf_pmu__convert_scale(const char *scale, char **end, double *sval);
>> --
>> 1.8.3.1
>>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v7 5/8] perf test: Make matching_pmu effective
2023-08-25 4:27 ` Ian Rogers
@ 2023-08-25 6:30 ` Jing Zhang
0 siblings, 0 replies; 27+ messages in thread
From: Jing Zhang @ 2023-08-25 6:30 UTC (permalink / raw)
To: Ian Rogers
Cc: John Garry, Will Deacon, James Clark, Arnaldo Carvalho de Melo,
Mark Rutland, Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra,
Ingo Molnar, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
linux-kernel, linux-arm-kernel, linux-perf-users, linux-doc,
Zhuo Song, Shuai Xue
在 2023/8/25 下午12:27, Ian Rogers 写道:
> On Mon, Aug 21, 2023 at 1:36 AM Jing Zhang <renyu.zj@linux.alibaba.com> wrote:
>>
>> The perf_pmu_test_event.matching_pmu didn't work. No matter what its
>> value is, it does not affect the test results. So let matching_pmu be
>> used for matching perf_pmu_test_pmu.pmu.name.
>
> Could you rebase this onto the latest perf-tools-next, I'd like to test this.
>
Ok, I will rebase it onto the latest perf-tools-next in next version.
Thanks,
Jing
> Thanks,
> Ian
>
>> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
>> Reviewed-by: John Garry <john.g.garry@oracle.com>
>> ---
>> tools/perf/tests/pmu-events.c | 9 +++++++--
>> 1 file changed, 7 insertions(+), 2 deletions(-)
>>
>> diff --git a/tools/perf/tests/pmu-events.c b/tools/perf/tests/pmu-events.c
>> index 1dff863b..3204252 100644
>> --- a/tools/perf/tests/pmu-events.c
>> +++ b/tools/perf/tests/pmu-events.c
>> @@ -238,7 +238,7 @@ struct perf_pmu_test_pmu {
>> },
>> .alias_str = "event=0x2b",
>> .alias_long_desc = "ddr write-cycles event. Unit: uncore_sys_ddr_pmu ",
>> - .matching_pmu = "uncore_sys_ddr_pmu",
>> + .matching_pmu = "uncore_sys_ddr_pmu0",
>> };
>>
>> static const struct perf_pmu_test_event sys_ccn_pmu_read_cycles = {
>> @@ -252,7 +252,7 @@ struct perf_pmu_test_pmu {
>> },
>> .alias_str = "config=0x2c",
>> .alias_long_desc = "ccn read-cycles event. Unit: uncore_sys_ccn_pmu ",
>> - .matching_pmu = "uncore_sys_ccn_pmu",
>> + .matching_pmu = "uncore_sys_ccn_pmu4",
>> };
>>
>> static const struct perf_pmu_test_event *sys_events[] = {
>> @@ -599,6 +599,11 @@ static int __test_uncore_pmu_event_aliases(struct perf_pmu_test_pmu *test_pmu)
>> struct pmu_event const *event = &test_event->event;
>>
>> if (!strcmp(event->name, alias->name)) {
>> + if (strcmp(pmu_name, test_event->matching_pmu)) {
>> + pr_debug("testing aliases uncore PMU %s: mismatched matching_pmu, %s vs %s\n",
>> + pmu_name, test_event->matching_pmu, pmu_name);
>> + continue;
>> + }
>> if (compare_alias_to_test_event(alias,
>> test_event,
>> pmu_name)) {
>> --
>> 1.8.3.1
>>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v7 6/8] perf test: Add pmu-event test for "Compat" and new event_field.
2023-08-25 4:30 ` Ian Rogers
@ 2023-08-25 6:30 ` Jing Zhang
0 siblings, 0 replies; 27+ messages in thread
From: Jing Zhang @ 2023-08-25 6:30 UTC (permalink / raw)
To: Ian Rogers
Cc: John Garry, Will Deacon, James Clark, Arnaldo Carvalho de Melo,
Mark Rutland, Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra,
Ingo Molnar, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
linux-kernel, linux-arm-kernel, linux-perf-users, linux-doc,
Zhuo Song, Shuai Xue
在 2023/8/25 下午12:30, Ian Rogers 写道:
> On Mon, Aug 21, 2023 at 1:36 AM Jing Zhang <renyu.zj@linux.alibaba.com> wrote:
>>
>> Add new event test for uncore system event which is used to verify the
>> functionality of "Compat" matching multiple identifiers and the new event
>> fields "EventIdCode" and "Type".
>>
>> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
>
> Thanks for the tests! I've no issue with them beside the already
> mentioned ';'. This will need updating for:
> https://lore.kernel.org/lkml/20230824183212.374787-1-irogers@google.com/
> https://lore.kernel.org/lkml/20230825024002.801955-1-irogers@google.com/
>
Ok, will do.
Thanks,
Jing
> Thanks,
> Ian
>
>> ---
>> .../pmu-events/arch/test/test_soc/sys/uncore.json | 8 ++++
>> tools/perf/pmu-events/empty-pmu-events.c | 8 ++++
>> tools/perf/tests/pmu-events.c | 55 ++++++++++++++++++++++
>> 3 files changed, 71 insertions(+)
>>
>> diff --git a/tools/perf/pmu-events/arch/test/test_soc/sys/uncore.json b/tools/perf/pmu-events/arch/test/test_soc/sys/uncore.json
>> index c7e7528..06b886d 100644
>> --- a/tools/perf/pmu-events/arch/test/test_soc/sys/uncore.json
>> +++ b/tools/perf/pmu-events/arch/test/test_soc/sys/uncore.json
>> @@ -12,5 +12,13 @@
>> "EventName": "sys_ccn_pmu.read_cycles",
>> "Unit": "sys_ccn_pmu",
>> "Compat": "0x01"
>> + },
>> + {
>> + "BriefDescription": "Counts total cache misses in first lookup result (high priority).",
>> + "NodeType": "0x05",
>> + "EventIdCode": "0x01",
>> + "EventName": "sys_cmn_pmu.hnf_cache_miss",
>> + "Unit": "sys_cmn_pmu",
>> + "Compat": "434*;436*;43c*;43a01"
>> }
>> ]
>> diff --git a/tools/perf/pmu-events/empty-pmu-events.c b/tools/perf/pmu-events/empty-pmu-events.c
>> index e74defb..25be18a 100644
>> --- a/tools/perf/pmu-events/empty-pmu-events.c
>> +++ b/tools/perf/pmu-events/empty-pmu-events.c
>> @@ -245,6 +245,14 @@ struct pmu_events_map {
>> .pmu = "uncore_sys_ccn_pmu",
>> },
>> {
>> + .name = "sys_cmn_pmu.hnf_cache_miss",
>> + .event = "type=0x05,eventid=0x01",
>> + .desc = "Counts total cache misses in first lookup result (high priority). Unit: uncore_sys_cmn_pmu ",
>> + .compat = "434*;436*;43c*;43a01",
>> + .topic = "uncore",
>> + .pmu = "uncore_sys_cmn_pmu",
>> + },
>> + {
>> .name = 0,
>> .event = 0,
>> .desc = 0,
>> diff --git a/tools/perf/tests/pmu-events.c b/tools/perf/tests/pmu-events.c
>> index 3204252..79fb3e2 100644
>> --- a/tools/perf/tests/pmu-events.c
>> +++ b/tools/perf/tests/pmu-events.c
>> @@ -255,9 +255,24 @@ struct perf_pmu_test_pmu {
>> .matching_pmu = "uncore_sys_ccn_pmu4",
>> };
>>
>> +static const struct perf_pmu_test_event sys_cmn_pmu_hnf_cache_miss = {
>> + .event = {
>> + .name = "sys_cmn_pmu.hnf_cache_miss",
>> + .event = "type=0x05,eventid=0x01",
>> + .desc = "Counts total cache misses in first lookup result (high priority). Unit: uncore_sys_cmn_pmu ",
>> + .topic = "uncore",
>> + .pmu = "uncore_sys_cmn_pmu",
>> + .compat = "434*;436*;43c*;43a01",
>> + },
>> + .alias_str = "type=0x5,eventid=0x1",
>> + .alias_long_desc = "Counts total cache misses in first lookup result (high priority). Unit: uncore_sys_cmn_pmu ",
>> + .matching_pmu = "uncore_sys_cmn_pmu0",
>> +};
>> +
>> static const struct perf_pmu_test_event *sys_events[] = {
>> &sys_ddr_pmu_write_cycles,
>> &sys_ccn_pmu_read_cycles,
>> + &sys_cmn_pmu_hnf_cache_miss,
>> NULL
>> };
>>
>> @@ -704,6 +719,46 @@ static int __test_uncore_pmu_event_aliases(struct perf_pmu_test_pmu *test_pmu)
>> &sys_ccn_pmu_read_cycles,
>> },
>> },
>> + {
>> + .pmu = {
>> + .name = (char *)"uncore_sys_cmn_pmu0",
>> + .is_uncore = 1,
>> + .id = (char *)"43401",
>> + },
>> + .aliases = {
>> + &sys_cmn_pmu_hnf_cache_miss,
>> + },
>> + },
>> + {
>> + .pmu = {
>> + .name = (char *)"uncore_sys_cmn_pmu0",
>> + .is_uncore = 1,
>> + .id = (char *)"43602",
>> + },
>> + .aliases = {
>> + &sys_cmn_pmu_hnf_cache_miss,
>> + },
>> + },
>> + {
>> + .pmu = {
>> + .name = (char *)"uncore_sys_cmn_pmu0",
>> + .is_uncore = 1,
>> + .id = (char *)"43c03",
>> + },
>> + .aliases = {
>> + &sys_cmn_pmu_hnf_cache_miss,
>> + },
>> + },
>> + {
>> + .pmu = {
>> + .name = (char *)"uncore_sys_cmn_pmu0",
>> + .is_uncore = 1,
>> + .id = (char *)"43a01",
>> + },
>> + .aliases = {
>> + &sys_cmn_pmu_hnf_cache_miss,
>> + },
>> + }
>> };
>>
>> /* Test that aliases generated are as expected */
>> --
>> 1.8.3.1
>>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v7 8/8] perf vendor events: Add JSON metrics for Arm CMN
2023-08-25 4:13 ` Ian Rogers
@ 2023-08-25 6:47 ` Jing Zhang
0 siblings, 0 replies; 27+ messages in thread
From: Jing Zhang @ 2023-08-25 6:47 UTC (permalink / raw)
To: Ian Rogers
Cc: John Garry, Will Deacon, James Clark, Arnaldo Carvalho de Melo,
Mark Rutland, Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra,
Ingo Molnar, Alexander Shishkin, Jiri Olsa, Adrian Hunter,
linux-kernel, linux-arm-kernel, linux-perf-users, linux-doc,
Zhuo Song, Shuai Xue
在 2023/8/25 下午12:13, Ian Rogers 写道:
> On Mon, Aug 21, 2023 at 1:36 AM Jing Zhang <renyu.zj@linux.alibaba.com> wrote:
>>
>> Add JSON metrics for Arm CMN. Currently just add part of CMN PMU
>> metrics which are general and compatible for any SoC with CMN-ANY.
>>
>> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
>> Reviewed-by: John Garry <john.g.garry@oracle.com>
>> ---
>> .../pmu-events/arch/arm64/arm/cmn/sys/metric.json | 74 ++++++++++++++++++++++
>> 1 file changed, 74 insertions(+)
>> create mode 100644 tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json
>>
>> diff --git a/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json b/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json
>> new file mode 100644
>> index 0000000..64db534
>> --- /dev/null
>> +++ b/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json
>> @@ -0,0 +1,74 @@
>> +[
>> + {
>> + "MetricName": "slc_miss_rate",
>> + "BriefDescription": "The system level cache miss rate.",
>> + "MetricGroup": "cmn",
>> + "MetricExpr": "hnf_cache_miss / hnf_slc_sf_cache_access",
>> + "ScaleUnit": "100%",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>
> Here a ';' is used as a separator, but for "Unit" ',' is used as a
> separator. Is there a reason for the inconsistency?
>
John and I have previously discussed this issue, and in fact, I deliberately used ';'.
I use a semicolon instead of a comma because I want to distinguish it from the function
of the comma in "Unit" and avoid confusion between the use of commas in "Unit" and "Compat".
Because in Unit, commas act as wildcards, and in “Compat”, the semicolon means "or". So
I think semicolons are more appropriate.
Thanks,
Jing
> Thanks,
> Ian
>
>> + },
>> + {
>> + "MetricName": "hnf_message_retry_rate",
>> + "BriefDescription": "HN-F message retry rate indicates whether a lack of credits is causing the bottlenecks.",
>> + "MetricGroup": "cmn",
>> + "MetricExpr": "hnf_pocq_retry / hnf_pocq_reqs_recvd",
>> + "ScaleUnit": "100%",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "MetricName": "sf_hit_rate",
>> + "BriefDescription": "Snoop filter hit rate can be used to measure the snoop filter efficiency.",
>> + "MetricGroup": "cmn",
>> + "MetricExpr": "hnf_sf_hit / hnf_slc_sf_cache_access",
>> + "ScaleUnit": "100%",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "MetricName": "mc_message_retry_rate",
>> + "BriefDescription": "The memory controller request retries rate indicates whether the memory controller is the bottleneck.",
>> + "MetricGroup": "cmn",
>> + "MetricExpr": "hnf_mc_retries / hnf_mc_reqs",
>> + "ScaleUnit": "100%",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "MetricName": "rni_actual_read_bandwidth.all",
>> + "BriefDescription": "This event measure the actual bandwidth that RN-I bridge sends to the interconnect.",
>> + "MetricGroup": "cmn",
>> + "MetricExpr": "rnid_rxdat_flits * 32 / 1e6 / duration_time",
>> + "ScaleUnit": "1MB/s",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "MetricName": "rni_actual_write_bandwidth.all",
>> + "BriefDescription": "This event measures the actual write bandwidth at RN-I bridges.",
>> + "MetricGroup": "cmn",
>> + "MetricExpr": "rnid_txdat_flits * 32 / 1e6 / duration_time",
>> + "ScaleUnit": "1MB/s",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "MetricName": "rni_retry_rate",
>> + "BriefDescription": "RN-I bridge retry rate indicates whether the memory controller is the bottleneck.",
>> + "MetricGroup": "cmn",
>> + "MetricExpr": "rnid_txreq_flits_retried / rnid_txreq_flits_total",
>> + "ScaleUnit": "100%",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + },
>> + {
>> + "MetricName": "sbsx_actual_write_bandwidth.all",
>> + "BriefDescription": "sbsx actual write bandwidth.",
>> + "MetricGroup": "cmn",
>> + "MetricExpr": "sbsx_txdat_flitv * 32 / 1e6 / duration_time",
>> + "ScaleUnit": "1MB/s",
>> + "Unit": "arm_cmn",
>> + "Compat": "434*;436*;43c*;43a*"
>> + }
>> +]
>> --
>> 1.8.3.1
>>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v7 1/8] perf pmu: "Compat" supports matching multiple identifiers
2023-08-24 15:05 ` Robin Murphy
@ 2023-08-25 8:40 ` Jing Zhang
0 siblings, 0 replies; 27+ messages in thread
From: Jing Zhang @ 2023-08-25 8:40 UTC (permalink / raw)
To: Robin Murphy, John Garry, Ian Rogers
Cc: Will Deacon, James Clark, Arnaldo Carvalho de Melo, Mark Rutland,
Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra, Ingo Molnar,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-kernel,
linux-arm-kernel, linux-perf-users, linux-doc, Zhuo Song,
Shuai Xue
在 2023/8/24 下午11:05, Robin Murphy 写道:
> On 21/08/2023 9:36 am, Jing Zhang wrote:
>> The jevent "Compat" is used for uncore PMU alias or metric definitions.
>>
>> The same PMU driver has different PMU identifiers due to different
>> hardware versions and types, but they may have some common PMU event.
>> Since a Compat value can only match one identifier, when adding the
>> same event alias to PMUs with different identifiers, each identifier
>> needs to be defined once, which is not streamlined enough.
>>
>> So let "Compat" supports matching multiple identifiers for uncore PMU
>> alias. For example, the Compat value {43401;436*} can match the PMU
>> identifier "43401", that is, CMN600_r0p0, and the PMU identifier with
>> the prefix "436", that is, all CMN650, where "*" is a wildcard.
>> Tokens in Unit field are delimited by ';' with no spaces.
>
> I wonder is there any possibility of supporting multiple values as a JSON array, rather than a single delimited string? Otherwise, if we're putting restrictions on what characters a driver can expose as an identifier, then I think that really wants explicitly documenting. AFAICT there's currently not even any documentation of the de-facto ABI that it's expected to be a free-form string rather than completely arbitrary binary data.
>
I'm sorry I almost missed this message, as it was in my spam folder.
If we put multiple values as an array, its parsing in jevent.py will become complicated.
I agree that we need to document the character restrictions for driver identifier composition.
Both Unit and Compat have the same problem, so certain characters need to be restricted in
the identifiers and names of drivers. However, it seems that there is no such document.
Thanks,
Jing
> Thanks,
> Robin.
>
>> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
>> Reviewed-by: John Garry <john.g.garry@oracle.com>
>> ---
>> tools/perf/util/pmu.c | 33 +++++++++++++++++++++++++++++++--
>> tools/perf/util/pmu.h | 1 +
>> 2 files changed, 32 insertions(+), 2 deletions(-)
>>
>> diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
>> index ad209c8..6402423 100644
>> --- a/tools/perf/util/pmu.c
>> +++ b/tools/perf/util/pmu.c
>> @@ -776,6 +776,35 @@ static bool pmu_uncore_alias_match(const char *pmu_name, const char *name)
>> return res;
>> }
>> +bool pmu_uncore_identifier_match(const char *id, const char *compat)
>> +{
>> + char *tmp = NULL, *tok, *str;
>> + bool res;
>> + int n;
>> +
>> + /*
>> + * The strdup() call is necessary here because "compat" is a const str*
>> + * type and cannot be used as an argument to strtok_r().
>> + */
>> + str = strdup(compat);
>> + if (!str)
>> + return false;
>> +
>> + tok = strtok_r(str, ";", &tmp);
>> + for (; tok; tok = strtok_r(NULL, ";", &tmp)) {
>> + n = strlen(tok);
>> + if ((tok[n - 1] == '*' && !strncmp(id, tok, n - 1)) ||
>> + !strcmp(id, tok)) {
>> + res = true;
>> + goto out;
>> + }
>> + }
>> + res = false;
>> +out:
>> + free(str);
>> + return res;
>> +}
>> +
>> struct pmu_add_cpu_aliases_map_data {
>> struct list_head *head;
>> const char *name;
>> @@ -847,8 +876,8 @@ static int pmu_add_sys_aliases_iter_fn(const struct pmu_event *pe,
>> if (!pe->compat || !pe->pmu)
>> return 0;
>> - if (!strcmp(pmu->id, pe->compat) &&
>> - pmu_uncore_alias_match(pe->pmu, pmu->name)) {
>> + if (pmu_uncore_alias_match(pe->pmu, pmu->name) &&
>> + pmu_uncore_identifier_match(pmu->id, pe->compat)) {
>> __perf_pmu__new_alias(idata->head, -1,
>> (char *)pe->name,
>> (char *)pe->desc,
>> diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h
>> index b9a02de..9d4385d 100644
>> --- a/tools/perf/util/pmu.h
>> +++ b/tools/perf/util/pmu.h
>> @@ -241,6 +241,7 @@ void pmu_add_cpu_aliases_table(struct list_head *head, struct perf_pmu *pmu,
>> char *perf_pmu__getcpuid(struct perf_pmu *pmu);
>> const struct pmu_events_table *pmu_events_table__find(void);
>> const struct pmu_metrics_table *pmu_metrics_table__find(void);
>> +bool pmu_uncore_identifier_match(const char *id, const char *compat);
>> void perf_pmu_free_alias(struct perf_pmu_alias *alias);
>> int perf_pmu__convert_scale(const char *scale, char **end, double *sval);
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v7 0/8] perf vendor events: Add JSON metrics for Arm CMN
2023-08-21 8:36 [PATCH v7 0/8] perf vendor events: Add JSON metrics for Arm CMN Jing Zhang
` (7 preceding siblings ...)
2023-08-23 8:12 ` [PATCH v7 0/8] " John Garry
@ 2023-09-06 16:05 ` Arnaldo Carvalho de Melo
2023-09-07 2:42 ` Jing Zhang
8 siblings, 1 reply; 27+ messages in thread
From: Arnaldo Carvalho de Melo @ 2023-09-06 16:05 UTC (permalink / raw)
To: Jing Zhang
Cc: John Garry, Ian Rogers, Will Deacon, James Clark, Mark Rutland,
Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra, Ingo Molnar,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-kernel,
linux-arm-kernel, linux-perf-users, linux-doc, Zhuo Song,
Shuai Xue
Em Mon, Aug 21, 2023 at 04:36:09PM +0800, Jing Zhang escreveu:
> Changes since v6:
> - Supplement the omitted EventCode;
> - Keep the original way of ConfigCode;
> - Supplement the test in empty-pmu-events.c, so that the pmu event test
> can succeed when build with NO_JEVENT=1.
> - Link: https://lore.kernel.org/all/1691394685-61240-1-git-send-email-renyu.zj@linux.alibaba.com/
Waiting for a v8, from what I saw there are several more review comments
to address, right?
- Arnaldo
> Jing Zhang (8):
> perf pmu: "Compat" supports matching multiple identifiers
> perf metric: "Compat" supports matching multiple identifiers
> perf vendor events: Supplement the omitted EventCode
> perf jevents: Support more event fields
> perf test: Make matching_pmu effective
> perf test: Add pmu-event test for "Compat" and new event_field.
> perf jevents: Add support for Arm CMN PMU aliasing
> perf vendor events: Add JSON metrics for Arm CMN
>
> .../pmu-events/arch/arm64/arm/cmn/sys/cmn.json | 266 +++++++++++++++++++++
> .../pmu-events/arch/arm64/arm/cmn/sys/metric.json | 74 ++++++
> .../pmu-events/arch/test/test_soc/sys/uncore.json | 8 +
> .../pmu-events/arch/x86/alderlake/pipeline.json | 9 +
> .../pmu-events/arch/x86/alderlaken/pipeline.json | 3 +
> .../pmu-events/arch/x86/broadwell/pipeline.json | 4 +
> .../pmu-events/arch/x86/broadwellde/pipeline.json | 4 +
> .../arch/x86/broadwellde/uncore-cache.json | 2 +
> .../arch/x86/broadwellde/uncore-interconnect.json | 1 +
> .../arch/x86/broadwellde/uncore-memory.json | 1 +
> .../arch/x86/broadwellde/uncore-power.json | 1 +
> .../pmu-events/arch/x86/broadwellx/pipeline.json | 4 +
> .../arch/x86/broadwellx/uncore-cache.json | 2 +
> .../arch/x86/broadwellx/uncore-interconnect.json | 13 +
> .../arch/x86/broadwellx/uncore-memory.json | 2 +
> .../arch/x86/broadwellx/uncore-power.json | 1 +
> .../pmu-events/arch/x86/cascadelakex/pipeline.json | 4 +
> .../arch/x86/cascadelakex/uncore-cache.json | 2 +
> .../arch/x86/cascadelakex/uncore-interconnect.json | 1 +
> .../arch/x86/cascadelakex/uncore-io.json | 1 +
> .../arch/x86/cascadelakex/uncore-memory.json | 1 +
> .../arch/x86/cascadelakex/uncore-power.json | 1 +
> .../pmu-events/arch/x86/elkhartlake/pipeline.json | 2 +
> .../pmu-events/arch/x86/goldmont/pipeline.json | 3 +
> .../pmu-events/arch/x86/goldmontplus/pipeline.json | 3 +
> .../pmu-events/arch/x86/grandridge/pipeline.json | 3 +
> .../arch/x86/graniterapids/pipeline.json | 4 +
> .../perf/pmu-events/arch/x86/haswell/pipeline.json | 4 +
> .../pmu-events/arch/x86/haswellx/pipeline.json | 4 +
> .../pmu-events/arch/x86/haswellx/uncore-cache.json | 2 +
> .../arch/x86/haswellx/uncore-interconnect.json | 14 ++
> .../arch/x86/haswellx/uncore-memory.json | 2 +
> .../pmu-events/arch/x86/haswellx/uncore-power.json | 1 +
> .../perf/pmu-events/arch/x86/icelake/pipeline.json | 4 +
> .../pmu-events/arch/x86/icelakex/pipeline.json | 4 +
> .../pmu-events/arch/x86/icelakex/uncore-cache.json | 1 +
> .../arch/x86/icelakex/uncore-interconnect.json | 1 +
> .../arch/x86/icelakex/uncore-memory.json | 1 +
> .../pmu-events/arch/x86/icelakex/uncore-power.json | 1 +
> .../pmu-events/arch/x86/ivybridge/pipeline.json | 3 +
> .../perf/pmu-events/arch/x86/ivytown/pipeline.json | 4 +
> .../pmu-events/arch/x86/ivytown/uncore-cache.json | 2 +
> .../arch/x86/ivytown/uncore-interconnect.json | 11 +
> .../pmu-events/arch/x86/ivytown/uncore-memory.json | 1 +
> .../pmu-events/arch/x86/ivytown/uncore-power.json | 1 +
> .../pmu-events/arch/x86/jaketown/pipeline.json | 4 +
> .../pmu-events/arch/x86/jaketown/uncore-cache.json | 2 +
> .../arch/x86/jaketown/uncore-interconnect.json | 12 +
> .../arch/x86/jaketown/uncore-memory.json | 1 +
> .../pmu-events/arch/x86/jaketown/uncore-power.json | 2 +
> .../arch/x86/knightslanding/pipeline.json | 3 +
> .../arch/x86/knightslanding/uncore-cache.json | 1 +
> .../arch/x86/knightslanding/uncore-memory.json | 4 +
> .../pmu-events/arch/x86/meteorlake/pipeline.json | 8 +
> .../pmu-events/arch/x86/sandybridge/pipeline.json | 4 +
> .../arch/x86/sapphirerapids/pipeline.json | 5 +
> .../pmu-events/arch/x86/sierraforest/pipeline.json | 4 +
> .../pmu-events/arch/x86/silvermont/pipeline.json | 3 +
> .../perf/pmu-events/arch/x86/skylake/pipeline.json | 4 +
> .../pmu-events/arch/x86/skylakex/pipeline.json | 4 +
> .../pmu-events/arch/x86/skylakex/uncore-cache.json | 2 +
> .../arch/x86/skylakex/uncore-interconnect.json | 1 +
> .../pmu-events/arch/x86/skylakex/uncore-io.json | 1 +
> .../arch/x86/skylakex/uncore-memory.json | 1 +
> .../pmu-events/arch/x86/skylakex/uncore-power.json | 1 +
> .../pmu-events/arch/x86/snowridgex/pipeline.json | 2 +
> .../arch/x86/snowridgex/uncore-cache.json | 1 +
> .../arch/x86/snowridgex/uncore-interconnect.json | 1 +
> .../arch/x86/snowridgex/uncore-memory.json | 1 +
> .../arch/x86/snowridgex/uncore-power.json | 1 +
> .../pmu-events/arch/x86/tigerlake/pipeline.json | 5 +
> tools/perf/pmu-events/empty-pmu-events.c | 8 +
> tools/perf/pmu-events/jevents.py | 21 +-
> tools/perf/tests/pmu-events.c | 64 ++++-
> tools/perf/util/metricgroup.c | 2 +-
> tools/perf/util/pmu.c | 33 ++-
> tools/perf/util/pmu.h | 1 +
> 77 files changed, 679 insertions(+), 9 deletions(-)
> create mode 100644 tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
> create mode 100644 tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json
>
> --
> 1.8.3.1
>
--
- Arnaldo
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v7 0/8] perf vendor events: Add JSON metrics for Arm CMN
2023-09-06 16:05 ` Arnaldo Carvalho de Melo
@ 2023-09-07 2:42 ` Jing Zhang
0 siblings, 0 replies; 27+ messages in thread
From: Jing Zhang @ 2023-09-07 2:42 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: John Garry, Ian Rogers, Will Deacon, James Clark, Mark Rutland,
Mike Leach, Leo Yan, Namhyung Kim, Peter Zijlstra, Ingo Molnar,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-kernel,
linux-arm-kernel, linux-perf-users, linux-doc, Zhuo Song,
Shuai Xue
在 2023/9/7 上午12:05, Arnaldo Carvalho de Melo 写道:
> Em Mon, Aug 21, 2023 at 04:36:09PM +0800, Jing Zhang escreveu:
>> Changes since v6:
>> - Supplement the omitted EventCode;
>> - Keep the original way of ConfigCode;
>> - Supplement the test in empty-pmu-events.c, so that the pmu event test
>> can succeed when build with NO_JEVENT=1.
>> - Link: https://lore.kernel.org/all/1691394685-61240-1-git-send-email-renyu.zj@linux.alibaba.com/
>
> Waiting for a v8, from what I saw there are several more review comments
> to address, right?
>
Yes, I will send v8 soon.
Thanks,
Jing
> - Arnaldo
>
>> Jing Zhang (8):
>> perf pmu: "Compat" supports matching multiple identifiers
>> perf metric: "Compat" supports matching multiple identifiers
>> perf vendor events: Supplement the omitted EventCode
>> perf jevents: Support more event fields
>> perf test: Make matching_pmu effective
>> perf test: Add pmu-event test for "Compat" and new event_field.
>> perf jevents: Add support for Arm CMN PMU aliasing
>> perf vendor events: Add JSON metrics for Arm CMN
>>
>> .../pmu-events/arch/arm64/arm/cmn/sys/cmn.json | 266 +++++++++++++++++++++
>> .../pmu-events/arch/arm64/arm/cmn/sys/metric.json | 74 ++++++
>> .../pmu-events/arch/test/test_soc/sys/uncore.json | 8 +
>> .../pmu-events/arch/x86/alderlake/pipeline.json | 9 +
>> .../pmu-events/arch/x86/alderlaken/pipeline.json | 3 +
>> .../pmu-events/arch/x86/broadwell/pipeline.json | 4 +
>> .../pmu-events/arch/x86/broadwellde/pipeline.json | 4 +
>> .../arch/x86/broadwellde/uncore-cache.json | 2 +
>> .../arch/x86/broadwellde/uncore-interconnect.json | 1 +
>> .../arch/x86/broadwellde/uncore-memory.json | 1 +
>> .../arch/x86/broadwellde/uncore-power.json | 1 +
>> .../pmu-events/arch/x86/broadwellx/pipeline.json | 4 +
>> .../arch/x86/broadwellx/uncore-cache.json | 2 +
>> .../arch/x86/broadwellx/uncore-interconnect.json | 13 +
>> .../arch/x86/broadwellx/uncore-memory.json | 2 +
>> .../arch/x86/broadwellx/uncore-power.json | 1 +
>> .../pmu-events/arch/x86/cascadelakex/pipeline.json | 4 +
>> .../arch/x86/cascadelakex/uncore-cache.json | 2 +
>> .../arch/x86/cascadelakex/uncore-interconnect.json | 1 +
>> .../arch/x86/cascadelakex/uncore-io.json | 1 +
>> .../arch/x86/cascadelakex/uncore-memory.json | 1 +
>> .../arch/x86/cascadelakex/uncore-power.json | 1 +
>> .../pmu-events/arch/x86/elkhartlake/pipeline.json | 2 +
>> .../pmu-events/arch/x86/goldmont/pipeline.json | 3 +
>> .../pmu-events/arch/x86/goldmontplus/pipeline.json | 3 +
>> .../pmu-events/arch/x86/grandridge/pipeline.json | 3 +
>> .../arch/x86/graniterapids/pipeline.json | 4 +
>> .../perf/pmu-events/arch/x86/haswell/pipeline.json | 4 +
>> .../pmu-events/arch/x86/haswellx/pipeline.json | 4 +
>> .../pmu-events/arch/x86/haswellx/uncore-cache.json | 2 +
>> .../arch/x86/haswellx/uncore-interconnect.json | 14 ++
>> .../arch/x86/haswellx/uncore-memory.json | 2 +
>> .../pmu-events/arch/x86/haswellx/uncore-power.json | 1 +
>> .../perf/pmu-events/arch/x86/icelake/pipeline.json | 4 +
>> .../pmu-events/arch/x86/icelakex/pipeline.json | 4 +
>> .../pmu-events/arch/x86/icelakex/uncore-cache.json | 1 +
>> .../arch/x86/icelakex/uncore-interconnect.json | 1 +
>> .../arch/x86/icelakex/uncore-memory.json | 1 +
>> .../pmu-events/arch/x86/icelakex/uncore-power.json | 1 +
>> .../pmu-events/arch/x86/ivybridge/pipeline.json | 3 +
>> .../perf/pmu-events/arch/x86/ivytown/pipeline.json | 4 +
>> .../pmu-events/arch/x86/ivytown/uncore-cache.json | 2 +
>> .../arch/x86/ivytown/uncore-interconnect.json | 11 +
>> .../pmu-events/arch/x86/ivytown/uncore-memory.json | 1 +
>> .../pmu-events/arch/x86/ivytown/uncore-power.json | 1 +
>> .../pmu-events/arch/x86/jaketown/pipeline.json | 4 +
>> .../pmu-events/arch/x86/jaketown/uncore-cache.json | 2 +
>> .../arch/x86/jaketown/uncore-interconnect.json | 12 +
>> .../arch/x86/jaketown/uncore-memory.json | 1 +
>> .../pmu-events/arch/x86/jaketown/uncore-power.json | 2 +
>> .../arch/x86/knightslanding/pipeline.json | 3 +
>> .../arch/x86/knightslanding/uncore-cache.json | 1 +
>> .../arch/x86/knightslanding/uncore-memory.json | 4 +
>> .../pmu-events/arch/x86/meteorlake/pipeline.json | 8 +
>> .../pmu-events/arch/x86/sandybridge/pipeline.json | 4 +
>> .../arch/x86/sapphirerapids/pipeline.json | 5 +
>> .../pmu-events/arch/x86/sierraforest/pipeline.json | 4 +
>> .../pmu-events/arch/x86/silvermont/pipeline.json | 3 +
>> .../perf/pmu-events/arch/x86/skylake/pipeline.json | 4 +
>> .../pmu-events/arch/x86/skylakex/pipeline.json | 4 +
>> .../pmu-events/arch/x86/skylakex/uncore-cache.json | 2 +
>> .../arch/x86/skylakex/uncore-interconnect.json | 1 +
>> .../pmu-events/arch/x86/skylakex/uncore-io.json | 1 +
>> .../arch/x86/skylakex/uncore-memory.json | 1 +
>> .../pmu-events/arch/x86/skylakex/uncore-power.json | 1 +
>> .../pmu-events/arch/x86/snowridgex/pipeline.json | 2 +
>> .../arch/x86/snowridgex/uncore-cache.json | 1 +
>> .../arch/x86/snowridgex/uncore-interconnect.json | 1 +
>> .../arch/x86/snowridgex/uncore-memory.json | 1 +
>> .../arch/x86/snowridgex/uncore-power.json | 1 +
>> .../pmu-events/arch/x86/tigerlake/pipeline.json | 5 +
>> tools/perf/pmu-events/empty-pmu-events.c | 8 +
>> tools/perf/pmu-events/jevents.py | 21 +-
>> tools/perf/tests/pmu-events.c | 64 ++++-
>> tools/perf/util/metricgroup.c | 2 +-
>> tools/perf/util/pmu.c | 33 ++-
>> tools/perf/util/pmu.h | 1 +
>> 77 files changed, 679 insertions(+), 9 deletions(-)
>> create mode 100644 tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
>> create mode 100644 tools/perf/pmu-events/arch/arm64/arm/cmn/sys/metric.json
>>
>> --
>> 1.8.3.1
>>
>
^ permalink raw reply [flat|nested] 27+ messages in thread
end of thread, other threads:[~2023-09-07 2:42 UTC | newest]
Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-21 8:36 [PATCH v7 0/8] perf vendor events: Add JSON metrics for Arm CMN Jing Zhang
2023-08-21 8:36 ` [PATCH v7 1/8] perf pmu: "Compat" supports matching multiple identifiers Jing Zhang
2023-08-24 15:05 ` Robin Murphy
2023-08-25 8:40 ` Jing Zhang
2023-08-25 4:11 ` Ian Rogers
2023-08-25 6:12 ` Jing Zhang
2023-08-21 8:36 ` [PATCH v7 2/8] perf metric: " Jing Zhang
2023-08-25 4:16 ` Ian Rogers
2023-08-21 8:36 ` [PATCH v7 4/8] perf jevents: Support more event fields Jing Zhang
2023-08-23 9:12 ` Robin Murphy
2023-08-25 4:42 ` Ian Rogers
2023-08-21 8:36 ` [PATCH v7 5/8] perf test: Make matching_pmu effective Jing Zhang
2023-08-25 4:27 ` Ian Rogers
2023-08-25 6:30 ` Jing Zhang
2023-08-21 8:36 ` [PATCH v7 6/8] perf test: Add pmu-event test for "Compat" and new event_field Jing Zhang
2023-08-25 4:30 ` Ian Rogers
2023-08-25 6:30 ` Jing Zhang
2023-08-21 8:36 ` [PATCH v7 7/8] perf jevents: Add support for Arm CMN PMU aliasing Jing Zhang
2023-08-23 9:33 ` Robin Murphy
2023-08-24 2:12 ` Jing Zhang
2023-08-21 8:36 ` [PATCH v7 8/8] perf vendor events: Add JSON metrics for Arm CMN Jing Zhang
2023-08-25 4:13 ` Ian Rogers
2023-08-25 6:47 ` Jing Zhang
2023-08-23 8:12 ` [PATCH v7 0/8] " John Garry
2023-08-24 2:33 ` Jing Zhang
2023-09-06 16:05 ` Arnaldo Carvalho de Melo
2023-09-07 2:42 ` Jing Zhang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).