All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v6 0/7] Add aliases and metrics for Arm CMN
@ 2023-08-07  7:51 ` Jing Zhang
  0 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07  7:51 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 v5:
- Split the first patch out into 1st pmu.c change and 2nd metricgroup.c
  change.
- Change order to check alias and then identifier.
- Fix matching_pmu.
- Add event documentation links.

Jing Zhang (7):
  perf pmu: "Compat" supports matching multiple identifiers
  perf metric: "Compat" supports matching multiple identifiers
  perf jevents: Support more event fields
  perf test: Fix matching_pmu
  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 +
 tools/perf/pmu-events/jevents.py                   |  22 +-
 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 +
 8 files changed, 457 insertions(+), 13 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] 44+ messages in thread

* [PATCH v6 0/7] Add aliases and metrics for Arm CMN
@ 2023-08-07  7:51 ` Jing Zhang
  0 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07  7:51 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 v5:
- Split the first patch out into 1st pmu.c change and 2nd metricgroup.c
  change.
- Change order to check alias and then identifier.
- Fix matching_pmu.
- Add event documentation links.

Jing Zhang (7):
  perf pmu: "Compat" supports matching multiple identifiers
  perf metric: "Compat" supports matching multiple identifiers
  perf jevents: Support more event fields
  perf test: Fix matching_pmu
  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 +
 tools/perf/pmu-events/jevents.py                   |  22 +-
 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 +
 8 files changed, 457 insertions(+), 13 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


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 44+ messages in thread

* [PATCH v6 1/7] perf pmu: "Compat" supports matching multiple identifiers
  2023-08-07  7:51 ` Jing Zhang
@ 2023-08-07  7:51   ` Jing Zhang
  -1 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07  7:51 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>
---
 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] 44+ messages in thread

* [PATCH v6 1/7] perf pmu: "Compat" supports matching multiple identifiers
@ 2023-08-07  7:51   ` Jing Zhang
  0 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07  7:51 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>
---
 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


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [PATCH v6 2/7] perf metric: "Compat" supports matching multiple identifiers
  2023-08-07  7:51 ` Jing Zhang
@ 2023-08-07  7:51   ` Jing Zhang
  -1 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07  7:51 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>
---
 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] 44+ messages in thread

* [PATCH v6 2/7] perf metric: "Compat" supports matching multiple identifiers
@ 2023-08-07  7:51   ` Jing Zhang
  0 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07  7:51 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>
---
 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


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [PATCH v6 3/7] perf jevents: Support more event fields
  2023-08-07  7:51 ` Jing Zhang
@ 2023-08-07  7:51   ` Jing Zhang
  -1 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07  7:51 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 usual event descriptions are "event=xxx" or "config=xxx", while the
event descriptions of CMN are "type=xxx, eventid=xxx" or more complex.

$cat /sys/bus/event_source/devices/arm_cmn_0/events/hnf_cache_fill
type=0x5,eventid=0x3

When adding aliases for events described as "event=xxx" or "config=xxx",
EventCode or ConfigCode can be used in the JSON files to describe the
events. But "eventid=xxx, type=xxx" cannot be supported at present.

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 to supplement "eventid=xxx" and "type=xxx", the 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. EventIdCode and Type are added to the event
field, and ConfigCode is moved into the event_field array which can also
guarantee its original function.

Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
---
 tools/perf/pmu-events/jevents.py | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jevents.py
index f57a8f2..9c0f63a 100755
--- a/tools/perf/pmu-events/jevents.py
+++ b/tools/perf/pmu-events/jevents.py
@@ -275,12 +275,6 @@ class JsonEvent:
       }
       return table[unit] if unit in table else f'uncore_{unit.lower()}'
 
-    eventcode = 0
-    if 'EventCode' in jd:
-      eventcode = int(jd['EventCode'].split(',', 1)[0], 0)
-    if 'ExtSel' in jd:
-      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 = ''
     self.compat = jd.get('Compat')
@@ -317,7 +311,15 @@ 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)}'
+    eventcode = None
+    if 'EventCode' in jd:
+      eventcode = int(jd['EventCode'].split(',', 1)[0], 0)
+    if 'ExtSel' in jd:
+      if eventcode is None:
+        eventcode = int(jd['ExtSel']) << 8
+      else:
+        eventcode |= int(jd['ExtSel']) << 8
+    event = f'event={llx(eventcode)}' if eventcode is not None else None
     event_fields = [
         ('AnyThread', 'any='),
         ('PortMask', 'ch_mask='),
@@ -327,10 +329,13 @@ class JsonEvent:
         ('Invert', 'inv='),
         ('SampleAfterValue', 'period='),
         ('UMask', 'umask='),
+        ('ConfigCode', 'config='),
+        ('Type', 'type='),
+        ('EventIdCode', 'eventid='),
     ]
     for key, value in event_fields:
       if key in jd and jd[key] != '0':
-        event += ',' + value + jd[key]
+        event = event + ',' + value + jd[key] if event is not None else value + jd[key]
     if filter:
       event += f',{filter}'
     if msr:
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [PATCH v6 3/7] perf jevents: Support more event fields
@ 2023-08-07  7:51   ` Jing Zhang
  0 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07  7:51 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 usual event descriptions are "event=xxx" or "config=xxx", while the
event descriptions of CMN are "type=xxx, eventid=xxx" or more complex.

$cat /sys/bus/event_source/devices/arm_cmn_0/events/hnf_cache_fill
type=0x5,eventid=0x3

When adding aliases for events described as "event=xxx" or "config=xxx",
EventCode or ConfigCode can be used in the JSON files to describe the
events. But "eventid=xxx, type=xxx" cannot be supported at present.

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 to supplement "eventid=xxx" and "type=xxx", the 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. EventIdCode and Type are added to the event
field, and ConfigCode is moved into the event_field array which can also
guarantee its original function.

Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
---
 tools/perf/pmu-events/jevents.py | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jevents.py
index f57a8f2..9c0f63a 100755
--- a/tools/perf/pmu-events/jevents.py
+++ b/tools/perf/pmu-events/jevents.py
@@ -275,12 +275,6 @@ class JsonEvent:
       }
       return table[unit] if unit in table else f'uncore_{unit.lower()}'
 
-    eventcode = 0
-    if 'EventCode' in jd:
-      eventcode = int(jd['EventCode'].split(',', 1)[0], 0)
-    if 'ExtSel' in jd:
-      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 = ''
     self.compat = jd.get('Compat')
@@ -317,7 +311,15 @@ 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)}'
+    eventcode = None
+    if 'EventCode' in jd:
+      eventcode = int(jd['EventCode'].split(',', 1)[0], 0)
+    if 'ExtSel' in jd:
+      if eventcode is None:
+        eventcode = int(jd['ExtSel']) << 8
+      else:
+        eventcode |= int(jd['ExtSel']) << 8
+    event = f'event={llx(eventcode)}' if eventcode is not None else None
     event_fields = [
         ('AnyThread', 'any='),
         ('PortMask', 'ch_mask='),
@@ -327,10 +329,13 @@ class JsonEvent:
         ('Invert', 'inv='),
         ('SampleAfterValue', 'period='),
         ('UMask', 'umask='),
+        ('ConfigCode', 'config='),
+        ('Type', 'type='),
+        ('EventIdCode', 'eventid='),
     ]
     for key, value in event_fields:
       if key in jd and jd[key] != '0':
-        event += ',' + value + jd[key]
+        event = event + ',' + value + jd[key] if event is not None else value + jd[key]
     if filter:
       event += f',{filter}'
     if msr:
-- 
1.8.3.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [PATCH v6 4/7] perf test: Fix matching_pmu
  2023-08-07  7:51 ` Jing Zhang
@ 2023-08-07  7:51   ` Jing Zhang
  -1 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07  7:51 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.

Fixes: 5a65c0c8f6fd ("perf test: Re-add pmu-event uncore PMU alias test")
Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.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] 44+ messages in thread

* [PATCH v6 4/7] perf test: Fix matching_pmu
@ 2023-08-07  7:51   ` Jing Zhang
  0 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07  7:51 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.

Fixes: 5a65c0c8f6fd ("perf test: Re-add pmu-event uncore PMU alias test")
Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.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


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [PATCH v6 5/7] perf test: Add pmu-event test for "Compat" and new event_field.
  2023-08-07  7:51 ` Jing Zhang
@ 2023-08-07  7:51   ` Jing Zhang
  -1 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07  7:51 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/tests/pmu-events.c                      | 55 ++++++++++++++++++++++
 2 files changed, 63 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..19ec595 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).",
+           "Type": "0x05",
+           "EventIdCode": "0x01",
+           "EventName": "sys_cmn_pmu.hnf_cache_miss",
+           "Unit": "sys_cmn_pmu",
+           "Compat": "434*;436*;43c*;43a01"
    }
 ]
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] 44+ messages in thread

* [PATCH v6 5/7] perf test: Add pmu-event test for "Compat" and new event_field.
@ 2023-08-07  7:51   ` Jing Zhang
  0 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07  7:51 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/tests/pmu-events.c                      | 55 ++++++++++++++++++++++
 2 files changed, 63 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..19ec595 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).",
+           "Type": "0x05",
+           "EventIdCode": "0x01",
+           "EventName": "sys_cmn_pmu.hnf_cache_miss",
+           "Unit": "sys_cmn_pmu",
+           "Compat": "434*;436*;43c*;43a01"
    }
 ]
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


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [PATCH v6 6/7] perf jevents: Add support for Arm CMN PMU aliasing
  2023-08-07  7:51 ` Jing Zhang
@ 2023-08-07  7:51   ` Jing Zhang
  -1 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07  7:51 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..e54036c
--- /dev/null
+++ b/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
@@ -0,0 +1,266 @@
+[
+	{
+		"EventName": "hnf_cache_miss",
+		"EventIdCode": "0x1",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "0x5",
+		"BriefDescription": "Counts number of retried requests.",
+		"Unit": "arm_cmn",
+		"Compat": "434*;436*;43c*;43a*"
+	},
+	{
+		"EventName": "hnf_pocq_reqs_recvd",
+		"EventIdCode": "0x5",
+		"Type": "0x5",
+		"BriefDescription": "Counts number of requests that HN receives.",
+		"Unit": "arm_cmn",
+		"Compat": "434*;436*;43c*;43a*"
+	},
+	{
+		"EventName": "hnf_sf_hit",
+		"EventIdCode": "0x6",
+		"Type": "0x5",
+		"BriefDescription": "Counts number of SF hits.",
+		"Unit": "arm_cmn",
+		"Compat": "434*;436*;43c*;43a*"
+	},
+	{
+		"EventName": "hnf_sf_evictions",
+		"EventIdCode": "0x7",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "0x5",
+		"BriefDescription": "Counts number of retried transactions by the MC.",
+		"Unit": "arm_cmn",
+		"Compat": "434*;436*;43c*;43a*"
+	},
+	{
+		"EventName": "hnf_mc_reqs",
+		"EventIdCode": "0xd",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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 9c0f63a..bfdfb67 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] 44+ messages in thread

* [PATCH v6 6/7] perf jevents: Add support for Arm CMN PMU aliasing
@ 2023-08-07  7:51   ` Jing Zhang
  0 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07  7:51 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..e54036c
--- /dev/null
+++ b/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
@@ -0,0 +1,266 @@
+[
+	{
+		"EventName": "hnf_cache_miss",
+		"EventIdCode": "0x1",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "0x5",
+		"BriefDescription": "Counts number of retried requests.",
+		"Unit": "arm_cmn",
+		"Compat": "434*;436*;43c*;43a*"
+	},
+	{
+		"EventName": "hnf_pocq_reqs_recvd",
+		"EventIdCode": "0x5",
+		"Type": "0x5",
+		"BriefDescription": "Counts number of requests that HN receives.",
+		"Unit": "arm_cmn",
+		"Compat": "434*;436*;43c*;43a*"
+	},
+	{
+		"EventName": "hnf_sf_hit",
+		"EventIdCode": "0x6",
+		"Type": "0x5",
+		"BriefDescription": "Counts number of SF hits.",
+		"Unit": "arm_cmn",
+		"Compat": "434*;436*;43c*;43a*"
+	},
+	{
+		"EventName": "hnf_sf_evictions",
+		"EventIdCode": "0x7",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "0x5",
+		"BriefDescription": "Counts number of retried transactions by the MC.",
+		"Unit": "arm_cmn",
+		"Compat": "434*;436*;43c*;43a*"
+	},
+	{
+		"EventName": "hnf_mc_reqs",
+		"EventIdCode": "0xd",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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",
+		"Type": "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 9c0f63a..bfdfb67 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


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* [PATCH v6 7/7] perf vendor events: Add JSON metrics for Arm CMN
  2023-08-07  7:51 ` Jing Zhang
@ 2023-08-07  7:51   ` Jing Zhang
  -1 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07  7:51 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] 44+ messages in thread

* [PATCH v6 7/7] perf vendor events: Add JSON metrics for Arm CMN
@ 2023-08-07  7:51   ` Jing Zhang
  0 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07  7:51 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


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 1/7] perf pmu: "Compat" supports matching multiple identifiers
  2023-08-07  7:51   ` Jing Zhang
@ 2023-08-07  9:19     ` John Garry
  -1 siblings, 0 replies; 44+ messages in thread
From: John Garry @ 2023-08-07  9:19 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 07/08/2023 08:51, 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.
> 
> Signed-off-by: Jing Zhang<renyu.zj@linux.alibaba.com>
> ---

Reviewed-by: John Garry <john.g.garry@oracle.com>

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 1/7] perf pmu: "Compat" supports matching multiple identifiers
@ 2023-08-07  9:19     ` John Garry
  0 siblings, 0 replies; 44+ messages in thread
From: John Garry @ 2023-08-07  9:19 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 07/08/2023 08:51, 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.
> 
> Signed-off-by: Jing Zhang<renyu.zj@linux.alibaba.com>
> ---

Reviewed-by: John Garry <john.g.garry@oracle.com>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 2/7] perf metric: "Compat" supports matching multiple identifiers
  2023-08-07  7:51   ` Jing Zhang
@ 2023-08-07  9:20     ` John Garry
  -1 siblings, 0 replies; 44+ messages in thread
From: John Garry @ 2023-08-07  9:20 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 07/08/2023 08:51, 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 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>

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 2/7] perf metric: "Compat" supports matching multiple identifiers
@ 2023-08-07  9:20     ` John Garry
  0 siblings, 0 replies; 44+ messages in thread
From: John Garry @ 2023-08-07  9:20 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 07/08/2023 08:51, 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 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>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 4/7] perf test: Fix matching_pmu
  2023-08-07  7:51   ` Jing Zhang
@ 2023-08-07  9:21     ` John Garry
  -1 siblings, 0 replies; 44+ messages in thread
From: John Garry @ 2023-08-07  9:21 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 07/08/2023 08:51, Jing Zhang 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.
> 
> Fixes: 5a65c0c8f6fd ("perf test: Re-add pmu-event uncore PMU alias test")

Is this tag correct, as I was not sure if this ever worked?

BTW, I am not sure how useful fixes tags are for self-test anyway...

> Signed-off-by: Jing Zhang<renyu.zj@linux.alibaba.com>

Reviewed-by: John Garry <john.g.garry@oracle.com>

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 4/7] perf test: Fix matching_pmu
@ 2023-08-07  9:21     ` John Garry
  0 siblings, 0 replies; 44+ messages in thread
From: John Garry @ 2023-08-07  9:21 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 07/08/2023 08:51, Jing Zhang 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.
> 
> Fixes: 5a65c0c8f6fd ("perf test: Re-add pmu-event uncore PMU alias test")

Is this tag correct, as I was not sure if this ever worked?

BTW, I am not sure how useful fixes tags are for self-test anyway...

> Signed-off-by: Jing Zhang<renyu.zj@linux.alibaba.com>

Reviewed-by: John Garry <john.g.garry@oracle.com>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 5/7] perf test: Add pmu-event test for "Compat" and new event_field.
  2023-08-07  7:51   ` Jing Zhang
@ 2023-08-07  9:23     ` John Garry
  -1 siblings, 0 replies; 44+ messages in thread
From: John Garry @ 2023-08-07  9:23 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 07/08/2023 08:51, Jing Zhang 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>


Reviewed-by: John Garry <john.g.garry@oracle.com>

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 5/7] perf test: Add pmu-event test for "Compat" and new event_field.
@ 2023-08-07  9:23     ` John Garry
  0 siblings, 0 replies; 44+ messages in thread
From: John Garry @ 2023-08-07  9:23 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 07/08/2023 08:51, Jing Zhang 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>


Reviewed-by: John Garry <john.g.garry@oracle.com>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 3/7] perf jevents: Support more event fields
  2023-08-07  7:51   ` Jing Zhang
@ 2023-08-07  9:24     ` John Garry
  -1 siblings, 0 replies; 44+ messages in thread
From: John Garry @ 2023-08-07  9:24 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 07/08/2023 08:51, Jing Zhang wrote:
> The usual event descriptions are "event=xxx" or "config=xxx", while the
> event descriptions of CMN are "type=xxx, eventid=xxx" or more complex.
> 
> $cat /sys/bus/event_source/devices/arm_cmn_0/events/hnf_cache_fill
> type=0x5,eventid=0x3
> 
> When adding aliases for events described as "event=xxx" or "config=xxx",
> EventCode or ConfigCode can be used in the JSON files to describe the
> events. But "eventid=xxx, type=xxx" cannot be supported at present.
> 
> 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 to supplement "eventid=xxx" and "type=xxx", the 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. EventIdCode and Type are added to the event
> field, and ConfigCode is moved into the event_field array which can also
> guarantee its original function.
> 
> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>

I'll let Ian check this change as he is more familiar with this code.

Thanks


^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 3/7] perf jevents: Support more event fields
@ 2023-08-07  9:24     ` John Garry
  0 siblings, 0 replies; 44+ messages in thread
From: John Garry @ 2023-08-07  9:24 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 07/08/2023 08:51, Jing Zhang wrote:
> The usual event descriptions are "event=xxx" or "config=xxx", while the
> event descriptions of CMN are "type=xxx, eventid=xxx" or more complex.
> 
> $cat /sys/bus/event_source/devices/arm_cmn_0/events/hnf_cache_fill
> type=0x5,eventid=0x3
> 
> When adding aliases for events described as "event=xxx" or "config=xxx",
> EventCode or ConfigCode can be used in the JSON files to describe the
> events. But "eventid=xxx, type=xxx" cannot be supported at present.
> 
> 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 to supplement "eventid=xxx" and "type=xxx", the 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. EventIdCode and Type are added to the event
> field, and ConfigCode is moved into the event_field array which can also
> guarantee its original function.
> 
> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>

I'll let Ian check this change as he is more familiar with this code.

Thanks


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 3/7] perf jevents: Support more event fields
  2023-08-07  9:24     ` John Garry
@ 2023-08-07 11:52       ` Jing Zhang
  -1 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07 11:52 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/7 下午5:24, John Garry 写道:
> On 07/08/2023 08:51, Jing Zhang wrote:
>> The usual event descriptions are "event=xxx" or "config=xxx", while the
>> event descriptions of CMN are "type=xxx, eventid=xxx" or more complex.
>>
>> $cat /sys/bus/event_source/devices/arm_cmn_0/events/hnf_cache_fill
>> type=0x5,eventid=0x3
>>
>> When adding aliases for events described as "event=xxx" or "config=xxx",
>> EventCode or ConfigCode can be used in the JSON files to describe the
>> events. But "eventid=xxx, type=xxx" cannot be supported at present.
>>
>> 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 to supplement "eventid=xxx" and "type=xxx", the 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. EventIdCode and Type are added to the event
>> field, and ConfigCode is moved into the event_field array which can also
>> guarantee its original function.
>>
>> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
> 
> I'll let Ian check this change as he is more familiar with this code.
> 

Ok, thanks!

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 3/7] perf jevents: Support more event fields
@ 2023-08-07 11:52       ` Jing Zhang
  0 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07 11:52 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/7 下午5:24, John Garry 写道:
> On 07/08/2023 08:51, Jing Zhang wrote:
>> The usual event descriptions are "event=xxx" or "config=xxx", while the
>> event descriptions of CMN are "type=xxx, eventid=xxx" or more complex.
>>
>> $cat /sys/bus/event_source/devices/arm_cmn_0/events/hnf_cache_fill
>> type=0x5,eventid=0x3
>>
>> When adding aliases for events described as "event=xxx" or "config=xxx",
>> EventCode or ConfigCode can be used in the JSON files to describe the
>> events. But "eventid=xxx, type=xxx" cannot be supported at present.
>>
>> 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 to supplement "eventid=xxx" and "type=xxx", the 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. EventIdCode and Type are added to the event
>> field, and ConfigCode is moved into the event_field array which can also
>> guarantee its original function.
>>
>> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
> 
> I'll let Ian check this change as he is more familiar with this code.
> 

Ok, thanks!

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 4/7] perf test: Fix matching_pmu
  2023-08-07  9:21     ` John Garry
@ 2023-08-07 12:02       ` Jing Zhang
  -1 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07 12:02 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/7 下午5:21, John Garry 写道:
> On 07/08/2023 08:51, Jing Zhang 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.
>>
>> Fixes: 5a65c0c8f6fd ("perf test: Re-add pmu-event uncore PMU alias test")
> 
> Is this tag correct, as I was not sure if this ever worked?
> 

I added the tag with reference to the previous fixed patch, and it seems correct.

> BTW, I am not sure how useful fixes tags are for self-test anyway...
> 

I'm not sure if it's useful either, but I added it anyway.:)

>> Signed-off-by: Jing Zhang<renyu.zj@linux.alibaba.com>
> 
> Reviewed-by: John Garry <john.g.garry@oracle.com>

Thank you sincerely!

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 4/7] perf test: Fix matching_pmu
@ 2023-08-07 12:02       ` Jing Zhang
  0 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-07 12:02 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/7 下午5:21, John Garry 写道:
> On 07/08/2023 08:51, Jing Zhang 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.
>>
>> Fixes: 5a65c0c8f6fd ("perf test: Re-add pmu-event uncore PMU alias test")
> 
> Is this tag correct, as I was not sure if this ever worked?
> 

I added the tag with reference to the previous fixed patch, and it seems correct.

> BTW, I am not sure how useful fixes tags are for self-test anyway...
> 

I'm not sure if it's useful either, but I added it anyway.:)

>> Signed-off-by: Jing Zhang<renyu.zj@linux.alibaba.com>
> 
> Reviewed-by: John Garry <john.g.garry@oracle.com>

Thank you sincerely!

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 3/7] perf jevents: Support more event fields
  2023-08-07  9:24     ` John Garry
@ 2023-08-14  6:08       ` Jing Zhang
  -1 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-14  6:08 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/7 下午5:24, John Garry 写道:
> On 07/08/2023 08:51, Jing Zhang wrote:
>> The usual event descriptions are "event=xxx" or "config=xxx", while the
>> event descriptions of CMN are "type=xxx, eventid=xxx" or more complex.
>>
>> $cat /sys/bus/event_source/devices/arm_cmn_0/events/hnf_cache_fill
>> type=0x5,eventid=0x3
>>
>> When adding aliases for events described as "event=xxx" or "config=xxx",
>> EventCode or ConfigCode can be used in the JSON files to describe the
>> events. But "eventid=xxx, type=xxx" cannot be supported at present.
>>
>> 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 to supplement "eventid=xxx" and "type=xxx", the 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. EventIdCode and Type are added to the event
>> field, and ConfigCode is moved into the event_field array which can also
>> guarantee its original function.
>>
>> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
> 
> I'll let Ian check this change as he is more familiar with this code.
> 

Hi Ian,

Could you please help to review this change?:)

Thanks,
Jing

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 3/7] perf jevents: Support more event fields
@ 2023-08-14  6:08       ` Jing Zhang
  0 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-14  6:08 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/7 下午5:24, John Garry 写道:
> On 07/08/2023 08:51, Jing Zhang wrote:
>> The usual event descriptions are "event=xxx" or "config=xxx", while the
>> event descriptions of CMN are "type=xxx, eventid=xxx" or more complex.
>>
>> $cat /sys/bus/event_source/devices/arm_cmn_0/events/hnf_cache_fill
>> type=0x5,eventid=0x3
>>
>> When adding aliases for events described as "event=xxx" or "config=xxx",
>> EventCode or ConfigCode can be used in the JSON files to describe the
>> events. But "eventid=xxx, type=xxx" cannot be supported at present.
>>
>> 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 to supplement "eventid=xxx" and "type=xxx", the 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. EventIdCode and Type are added to the event
>> field, and ConfigCode is moved into the event_field array which can also
>> guarantee its original function.
>>
>> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
> 
> I'll let Ian check this change as he is more familiar with this code.
> 

Hi Ian,

Could you please help to review this change?:)

Thanks,
Jing

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 3/7] perf jevents: Support more event fields
  2023-08-07  7:51   ` Jing Zhang
@ 2023-08-14 22:31     ` Ian Rogers
  -1 siblings, 0 replies; 44+ messages in thread
From: Ian Rogers @ 2023-08-14 22:31 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 7, 2023 at 12:51 AM Jing Zhang <renyu.zj@linux.alibaba.com> wrote:
>
> The usual event descriptions are "event=xxx" or "config=xxx", while the
> event descriptions of CMN are "type=xxx, eventid=xxx" or more complex.

I found this difficult to read in relation to the code. Perhaps:

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".

I think the use of the name "type" here is unfortunate. It conflicts
with the PMU's type as defined in perf_event_attr.

In general I think the jevents.py code needs improving, the
event_fields dictionary is convoluted, we shouldn't be afraid to
change the event json for example to get rid of things like ExtSel, we
should really ensure the formats in the events are valid for the PMU
they are for.

> $cat /sys/bus/event_source/devices/arm_cmn_0/events/hnf_cache_fill
> type=0x5,eventid=0x3
>
> When adding aliases for events described as "event=xxx" or "config=xxx",
> EventCode or ConfigCode can be used in the JSON files to describe the
> events. But "eventid=xxx, type=xxx" cannot be supported at present.
>
> 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 to supplement "eventid=xxx" and "type=xxx", the 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. EventIdCode and Type are added to the event
> field, and ConfigCode is moved into the event_field array which can also
> guarantee its original function.

A useful test can be to build with JEVENTS_ARCH=all and confirm the
before and after change generated pmu-events.c is the same.

> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
> ---
>  tools/perf/pmu-events/jevents.py | 21 +++++++++++++--------
>  1 file changed, 13 insertions(+), 8 deletions(-)
>
> diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jevents.py
> index f57a8f2..9c0f63a 100755
> --- a/tools/perf/pmu-events/jevents.py
> +++ b/tools/perf/pmu-events/jevents.py
> @@ -275,12 +275,6 @@ class JsonEvent:
>        }
>        return table[unit] if unit in table else f'uncore_{unit.lower()}'
>
> -    eventcode = 0
> -    if 'EventCode' in jd:
> -      eventcode = int(jd['EventCode'].split(',', 1)[0], 0)
> -    if 'ExtSel' in jd:
> -      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 = ''
>      self.compat = jd.get('Compat')
> @@ -317,7 +311,15 @@ 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)}'
> +    eventcode = None
> +    if 'EventCode' in jd:
> +      eventcode = int(jd['EventCode'].split(',', 1)[0], 0)
> +    if 'ExtSel' in jd:
> +      if eventcode is None:
> +        eventcode = int(jd['ExtSel']) << 8
> +      else:
> +        eventcode |= int(jd['ExtSel']) << 8
> +    event = f'event={llx(eventcode)}' if eventcode is not None else None
>      event_fields = [
>          ('AnyThread', 'any='),
>          ('PortMask', 'ch_mask='),
> @@ -327,10 +329,13 @@ class JsonEvent:
>          ('Invert', 'inv='),
>          ('SampleAfterValue', 'period='),
>          ('UMask', 'umask='),
> +        ('ConfigCode', 'config='),

This loses the int and potential base conversion of ConfigCode.
Clearly the code was taking care to maintain this behavior so I
suspect this change has broken something. JEVENTS_ARCH=all should
reveal the answer.

> +        ('Type', 'type='),
> +        ('EventIdCode', 'eventid='),
>      ]
>      for key, value in event_fields:
>        if key in jd and jd[key] != '0':
> -        event += ',' + value + jd[key]
> +        event = event + ',' + value + jd[key] if event is not None else value + jd[key]

Perhaps initialize event above to the empty string then:

if key in jd and jd[key] != '0':
  if event:
     event += ','
  event += value + jd[key]

Thanks,
Ian

>      if filter:
>        event += f',{filter}'
>      if msr:
> --
> 1.8.3.1
>

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 3/7] perf jevents: Support more event fields
@ 2023-08-14 22:31     ` Ian Rogers
  0 siblings, 0 replies; 44+ messages in thread
From: Ian Rogers @ 2023-08-14 22:31 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 7, 2023 at 12:51 AM Jing Zhang <renyu.zj@linux.alibaba.com> wrote:
>
> The usual event descriptions are "event=xxx" or "config=xxx", while the
> event descriptions of CMN are "type=xxx, eventid=xxx" or more complex.

I found this difficult to read in relation to the code. Perhaps:

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".

I think the use of the name "type" here is unfortunate. It conflicts
with the PMU's type as defined in perf_event_attr.

In general I think the jevents.py code needs improving, the
event_fields dictionary is convoluted, we shouldn't be afraid to
change the event json for example to get rid of things like ExtSel, we
should really ensure the formats in the events are valid for the PMU
they are for.

> $cat /sys/bus/event_source/devices/arm_cmn_0/events/hnf_cache_fill
> type=0x5,eventid=0x3
>
> When adding aliases for events described as "event=xxx" or "config=xxx",
> EventCode or ConfigCode can be used in the JSON files to describe the
> events. But "eventid=xxx, type=xxx" cannot be supported at present.
>
> 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 to supplement "eventid=xxx" and "type=xxx", the 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. EventIdCode and Type are added to the event
> field, and ConfigCode is moved into the event_field array which can also
> guarantee its original function.

A useful test can be to build with JEVENTS_ARCH=all and confirm the
before and after change generated pmu-events.c is the same.

> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
> ---
>  tools/perf/pmu-events/jevents.py | 21 +++++++++++++--------
>  1 file changed, 13 insertions(+), 8 deletions(-)
>
> diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jevents.py
> index f57a8f2..9c0f63a 100755
> --- a/tools/perf/pmu-events/jevents.py
> +++ b/tools/perf/pmu-events/jevents.py
> @@ -275,12 +275,6 @@ class JsonEvent:
>        }
>        return table[unit] if unit in table else f'uncore_{unit.lower()}'
>
> -    eventcode = 0
> -    if 'EventCode' in jd:
> -      eventcode = int(jd['EventCode'].split(',', 1)[0], 0)
> -    if 'ExtSel' in jd:
> -      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 = ''
>      self.compat = jd.get('Compat')
> @@ -317,7 +311,15 @@ 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)}'
> +    eventcode = None
> +    if 'EventCode' in jd:
> +      eventcode = int(jd['EventCode'].split(',', 1)[0], 0)
> +    if 'ExtSel' in jd:
> +      if eventcode is None:
> +        eventcode = int(jd['ExtSel']) << 8
> +      else:
> +        eventcode |= int(jd['ExtSel']) << 8
> +    event = f'event={llx(eventcode)}' if eventcode is not None else None
>      event_fields = [
>          ('AnyThread', 'any='),
>          ('PortMask', 'ch_mask='),
> @@ -327,10 +329,13 @@ class JsonEvent:
>          ('Invert', 'inv='),
>          ('SampleAfterValue', 'period='),
>          ('UMask', 'umask='),
> +        ('ConfigCode', 'config='),

This loses the int and potential base conversion of ConfigCode.
Clearly the code was taking care to maintain this behavior so I
suspect this change has broken something. JEVENTS_ARCH=all should
reveal the answer.

> +        ('Type', 'type='),
> +        ('EventIdCode', 'eventid='),
>      ]
>      for key, value in event_fields:
>        if key in jd and jd[key] != '0':
> -        event += ',' + value + jd[key]
> +        event = event + ',' + value + jd[key] if event is not None else value + jd[key]

Perhaps initialize event above to the empty string then:

if key in jd and jd[key] != '0':
  if event:
     event += ','
  event += value + jd[key]

Thanks,
Ian

>      if filter:
>        event += f',{filter}'
>      if msr:
> --
> 1.8.3.1
>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 6/7] perf jevents: Add support for Arm CMN PMU aliasing
  2023-08-07  7:51   ` Jing Zhang
@ 2023-08-14 22:36     ` Ian Rogers
  -1 siblings, 0 replies; 44+ messages in thread
From: Ian Rogers @ 2023-08-14 22:36 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 7, 2023 at 12:51 AM Jing Zhang <renyu.zj@linux.alibaba.com> 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:

nit: The use of the words "events" and "aliases" can be confusing -
aliases isn't specific as there may be a notion of other aliases like
for PMU names. I think in the code base we should avoid to use
"aliases" and just use "events".

Thanks,
Ian

> [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..e54036c
> --- /dev/null
> +++ b/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
> @@ -0,0 +1,266 @@
> +[
> +       {
> +               "EventName": "hnf_cache_miss",
> +               "EventIdCode": "0x1",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "0x5",
> +               "BriefDescription": "Counts number of retried requests.",
> +               "Unit": "arm_cmn",
> +               "Compat": "434*;436*;43c*;43a*"
> +       },
> +       {
> +               "EventName": "hnf_pocq_reqs_recvd",
> +               "EventIdCode": "0x5",
> +               "Type": "0x5",
> +               "BriefDescription": "Counts number of requests that HN receives.",
> +               "Unit": "arm_cmn",
> +               "Compat": "434*;436*;43c*;43a*"
> +       },
> +       {
> +               "EventName": "hnf_sf_hit",
> +               "EventIdCode": "0x6",
> +               "Type": "0x5",
> +               "BriefDescription": "Counts number of SF hits.",
> +               "Unit": "arm_cmn",
> +               "Compat": "434*;436*;43c*;43a*"
> +       },
> +       {
> +               "EventName": "hnf_sf_evictions",
> +               "EventIdCode": "0x7",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "0x5",
> +               "BriefDescription": "Counts number of retried transactions by the MC.",
> +               "Unit": "arm_cmn",
> +               "Compat": "434*;436*;43c*;43a*"
> +       },
> +       {
> +               "EventName": "hnf_mc_reqs",
> +               "EventIdCode": "0xd",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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 9c0f63a..bfdfb67 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
>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 6/7] perf jevents: Add support for Arm CMN PMU aliasing
@ 2023-08-14 22:36     ` Ian Rogers
  0 siblings, 0 replies; 44+ messages in thread
From: Ian Rogers @ 2023-08-14 22:36 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 7, 2023 at 12:51 AM Jing Zhang <renyu.zj@linux.alibaba.com> 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:

nit: The use of the words "events" and "aliases" can be confusing -
aliases isn't specific as there may be a notion of other aliases like
for PMU names. I think in the code base we should avoid to use
"aliases" and just use "events".

Thanks,
Ian

> [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..e54036c
> --- /dev/null
> +++ b/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
> @@ -0,0 +1,266 @@
> +[
> +       {
> +               "EventName": "hnf_cache_miss",
> +               "EventIdCode": "0x1",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "0x5",
> +               "BriefDescription": "Counts number of retried requests.",
> +               "Unit": "arm_cmn",
> +               "Compat": "434*;436*;43c*;43a*"
> +       },
> +       {
> +               "EventName": "hnf_pocq_reqs_recvd",
> +               "EventIdCode": "0x5",
> +               "Type": "0x5",
> +               "BriefDescription": "Counts number of requests that HN receives.",
> +               "Unit": "arm_cmn",
> +               "Compat": "434*;436*;43c*;43a*"
> +       },
> +       {
> +               "EventName": "hnf_sf_hit",
> +               "EventIdCode": "0x6",
> +               "Type": "0x5",
> +               "BriefDescription": "Counts number of SF hits.",
> +               "Unit": "arm_cmn",
> +               "Compat": "434*;436*;43c*;43a*"
> +       },
> +       {
> +               "EventName": "hnf_sf_evictions",
> +               "EventIdCode": "0x7",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "0x5",
> +               "BriefDescription": "Counts number of retried transactions by the MC.",
> +               "Unit": "arm_cmn",
> +               "Compat": "434*;436*;43c*;43a*"
> +       },
> +       {
> +               "EventName": "hnf_mc_reqs",
> +               "EventIdCode": "0xd",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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",
> +               "Type": "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 9c0f63a..bfdfb67 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	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 5/7] perf test: Add pmu-event test for "Compat" and new event_field.
  2023-08-07  7:51   ` Jing Zhang
@ 2023-08-15  1:11     ` Ian Rogers
  -1 siblings, 0 replies; 44+ messages in thread
From: Ian Rogers @ 2023-08-15  1: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 7, 2023 at 12:51 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>

Did you test with NO_JEVENTS=1?

> ---
>  .../pmu-events/arch/test/test_soc/sys/uncore.json  |  8 ++++
>  tools/perf/tests/pmu-events.c                      | 55 ++++++++++++++++++++++
>  2 files changed, 63 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..19ec595 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).",
> +           "Type": "0x05",
> +           "EventIdCode": "0x01",
> +           "EventName": "sys_cmn_pmu.hnf_cache_miss",
> +           "Unit": "sys_cmn_pmu",
> +           "Compat": "434*;436*;43c*;43a01"

I suspect this needs adding here:
https://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git/tree/tools/perf/pmu-events/empty-pmu-events.c?h=perf-tools-next#n247

Thanks,
Ian

>     }
>  ]
> 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] 44+ messages in thread

* Re: [PATCH v6 5/7] perf test: Add pmu-event test for "Compat" and new event_field.
@ 2023-08-15  1:11     ` Ian Rogers
  0 siblings, 0 replies; 44+ messages in thread
From: Ian Rogers @ 2023-08-15  1: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 7, 2023 at 12:51 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>

Did you test with NO_JEVENTS=1?

> ---
>  .../pmu-events/arch/test/test_soc/sys/uncore.json  |  8 ++++
>  tools/perf/tests/pmu-events.c                      | 55 ++++++++++++++++++++++
>  2 files changed, 63 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..19ec595 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).",
> +           "Type": "0x05",
> +           "EventIdCode": "0x01",
> +           "EventName": "sys_cmn_pmu.hnf_cache_miss",
> +           "Unit": "sys_cmn_pmu",
> +           "Compat": "434*;436*;43c*;43a01"

I suspect this needs adding here:
https://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git/tree/tools/perf/pmu-events/empty-pmu-events.c?h=perf-tools-next#n247

Thanks,
Ian

>     }
>  ]
> 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
>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 3/7] perf jevents: Support more event fields
  2023-08-14 22:31     ` Ian Rogers
@ 2023-08-15 12:24       ` Jing Zhang
  -1 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-15 12:24 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/15 上午6:31, Ian Rogers 写道:
> On Mon, Aug 7, 2023 at 12:51 AM Jing Zhang <renyu.zj@linux.alibaba.com> wrote:
>>
>> The usual event descriptions are "event=xxx" or "config=xxx", while the
>> event descriptions of CMN are "type=xxx, eventid=xxx" or more complex.
> 
> I found this difficult to read in relation to the code. Perhaps:
> 
> 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".
> 

Thank you for providing a more accurate and readable description.
I was indeed struggling with how to describe the problem more accurately before.

> I think the use of the name "type" here is unfortunate. It conflicts
> with the PMU's type as defined in perf_event_attr.
> 

I agree, but it would require modifying the driver, which is not currently being
considered. In the meantime, I can describe the event_field as ('NodeType', 'type=').

> In general I think the jevents.py code needs improving, the
> event_fields dictionary is convoluted, we shouldn't be afraid to
> change the event json for example to get rid of things like ExtSel, we
> should really ensure the formats in the events are valid for the PMU
> they are for.
> 
>> $cat /sys/bus/event_source/devices/arm_cmn_0/events/hnf_cache_fill
>> type=0x5,eventid=0x3
>>
>> When adding aliases for events described as "event=xxx" or "config=xxx",
>> EventCode or ConfigCode can be used in the JSON files to describe the
>> events. But "eventid=xxx, type=xxx" cannot be supported at present.
>>
>> 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 to supplement "eventid=xxx" and "type=xxx", the 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. EventIdCode and Type are added to the event
>> field, and ConfigCode is moved into the event_field array which can also
>> guarantee its original function.
> 
> A useful test can be to build with JEVENTS_ARCH=all and confirm the
> before and after change generated pmu-events.c is the same.
> 

Okay, I will test it right away.

>> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
>> ---
>>  tools/perf/pmu-events/jevents.py | 21 +++++++++++++--------
>>  1 file changed, 13 insertions(+), 8 deletions(-)
>>
>> diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jevents.py
>> index f57a8f2..9c0f63a 100755
>> --- a/tools/perf/pmu-events/jevents.py
>> +++ b/tools/perf/pmu-events/jevents.py
>> @@ -275,12 +275,6 @@ class JsonEvent:
>>        }
>>        return table[unit] if unit in table else f'uncore_{unit.lower()}'
>>
>> -    eventcode = 0
>> -    if 'EventCode' in jd:
>> -      eventcode = int(jd['EventCode'].split(',', 1)[0], 0)
>> -    if 'ExtSel' in jd:
>> -      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 = ''
>>      self.compat = jd.get('Compat')
>> @@ -317,7 +311,15 @@ 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)}'
>> +    eventcode = None
>> +    if 'EventCode' in jd:
>> +      eventcode = int(jd['EventCode'].split(',', 1)[0], 0)
>> +    if 'ExtSel' in jd:
>> +      if eventcode is None:
>> +        eventcode = int(jd['ExtSel']) << 8
>> +      else:
>> +        eventcode |= int(jd['ExtSel']) << 8
>> +    event = f'event={llx(eventcode)}' if eventcode is not None else None
>>      event_fields = [
>>          ('AnyThread', 'any='),
>>          ('PortMask', 'ch_mask='),
>> @@ -327,10 +329,13 @@ class JsonEvent:
>>          ('Invert', 'inv='),
>>          ('SampleAfterValue', 'period='),
>>          ('UMask', 'umask='),
>> +        ('ConfigCode', 'config='),
> 
> This loses the int and potential base conversion of ConfigCode.
> Clearly the code was taking care to maintain this behavior so I
> suspect this change has broken something. JEVENTS_ARCH=all should
> reveal the answer.
> 

You are correct, I compared the generated pmu-events.c files before and after,
and they are indeed different, with before:config=0x5 vs after:config=0x05. I will keep the
original way of handling ConfigCode in the next version.

>> +        ('Type', 'type='),
>> +        ('EventIdCode', 'eventid='),
>>      ]
>>      for key, value in event_fields:
>>        if key in jd and jd[key] != '0':
>> -        event += ',' + value + jd[key]
>> +        event = event + ',' + value + jd[key] if event is not None else value + jd[key]
> 
> Perhaps initialize event above to the empty string then:
> 
> if key in jd and jd[key] != '0':
>   if event:
>      event += ','
>   event += value + jd[key]
> 

If the event is None, the statement event += value + jd[key] would result in an error.
So, maybe I can use the following way:

if event:
    event += ',' + value + jd[key]
else:
    event = value + jd[key]


Thanks,
Jing

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 3/7] perf jevents: Support more event fields
@ 2023-08-15 12:24       ` Jing Zhang
  0 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-15 12:24 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/15 上午6:31, Ian Rogers 写道:
> On Mon, Aug 7, 2023 at 12:51 AM Jing Zhang <renyu.zj@linux.alibaba.com> wrote:
>>
>> The usual event descriptions are "event=xxx" or "config=xxx", while the
>> event descriptions of CMN are "type=xxx, eventid=xxx" or more complex.
> 
> I found this difficult to read in relation to the code. Perhaps:
> 
> 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".
> 

Thank you for providing a more accurate and readable description.
I was indeed struggling with how to describe the problem more accurately before.

> I think the use of the name "type" here is unfortunate. It conflicts
> with the PMU's type as defined in perf_event_attr.
> 

I agree, but it would require modifying the driver, which is not currently being
considered. In the meantime, I can describe the event_field as ('NodeType', 'type=').

> In general I think the jevents.py code needs improving, the
> event_fields dictionary is convoluted, we shouldn't be afraid to
> change the event json for example to get rid of things like ExtSel, we
> should really ensure the formats in the events are valid for the PMU
> they are for.
> 
>> $cat /sys/bus/event_source/devices/arm_cmn_0/events/hnf_cache_fill
>> type=0x5,eventid=0x3
>>
>> When adding aliases for events described as "event=xxx" or "config=xxx",
>> EventCode or ConfigCode can be used in the JSON files to describe the
>> events. But "eventid=xxx, type=xxx" cannot be supported at present.
>>
>> 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 to supplement "eventid=xxx" and "type=xxx", the 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. EventIdCode and Type are added to the event
>> field, and ConfigCode is moved into the event_field array which can also
>> guarantee its original function.
> 
> A useful test can be to build with JEVENTS_ARCH=all and confirm the
> before and after change generated pmu-events.c is the same.
> 

Okay, I will test it right away.

>> Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
>> ---
>>  tools/perf/pmu-events/jevents.py | 21 +++++++++++++--------
>>  1 file changed, 13 insertions(+), 8 deletions(-)
>>
>> diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jevents.py
>> index f57a8f2..9c0f63a 100755
>> --- a/tools/perf/pmu-events/jevents.py
>> +++ b/tools/perf/pmu-events/jevents.py
>> @@ -275,12 +275,6 @@ class JsonEvent:
>>        }
>>        return table[unit] if unit in table else f'uncore_{unit.lower()}'
>>
>> -    eventcode = 0
>> -    if 'EventCode' in jd:
>> -      eventcode = int(jd['EventCode'].split(',', 1)[0], 0)
>> -    if 'ExtSel' in jd:
>> -      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 = ''
>>      self.compat = jd.get('Compat')
>> @@ -317,7 +311,15 @@ 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)}'
>> +    eventcode = None
>> +    if 'EventCode' in jd:
>> +      eventcode = int(jd['EventCode'].split(',', 1)[0], 0)
>> +    if 'ExtSel' in jd:
>> +      if eventcode is None:
>> +        eventcode = int(jd['ExtSel']) << 8
>> +      else:
>> +        eventcode |= int(jd['ExtSel']) << 8
>> +    event = f'event={llx(eventcode)}' if eventcode is not None else None
>>      event_fields = [
>>          ('AnyThread', 'any='),
>>          ('PortMask', 'ch_mask='),
>> @@ -327,10 +329,13 @@ class JsonEvent:
>>          ('Invert', 'inv='),
>>          ('SampleAfterValue', 'period='),
>>          ('UMask', 'umask='),
>> +        ('ConfigCode', 'config='),
> 
> This loses the int and potential base conversion of ConfigCode.
> Clearly the code was taking care to maintain this behavior so I
> suspect this change has broken something. JEVENTS_ARCH=all should
> reveal the answer.
> 

You are correct, I compared the generated pmu-events.c files before and after,
and they are indeed different, with before:config=0x5 vs after:config=0x05. I will keep the
original way of handling ConfigCode in the next version.

>> +        ('Type', 'type='),
>> +        ('EventIdCode', 'eventid='),
>>      ]
>>      for key, value in event_fields:
>>        if key in jd and jd[key] != '0':
>> -        event += ',' + value + jd[key]
>> +        event = event + ',' + value + jd[key] if event is not None else value + jd[key]
> 
> Perhaps initialize event above to the empty string then:
> 
> if key in jd and jd[key] != '0':
>   if event:
>      event += ','
>   event += value + jd[key]
> 

If the event is None, the statement event += value + jd[key] would result in an error.
So, maybe I can use the following way:

if event:
    event += ',' + value + jd[key]
else:
    event = value + jd[key]


Thanks,
Jing

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 5/7] perf test: Add pmu-event test for "Compat" and new event_field.
  2023-08-15  1:11     ` Ian Rogers
@ 2023-08-15 12:33       ` Jing Zhang
  -1 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-15 12:33 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/15 上午9:11, Ian Rogers 写道:
> On Mon, Aug 7, 2023 at 12:51 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>
> 
> Did you test with NO_JEVENTS=1?
> 

You are absolutely right. I completely overlooked the case where NO_JEVENTS=1.


>> ---
>>  .../pmu-events/arch/test/test_soc/sys/uncore.json  |  8 ++++
>>  tools/perf/tests/pmu-events.c                      | 55 ++++++++++++++++++++++
>>  2 files changed, 63 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..19ec595 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).",
>> +           "Type": "0x05",
>> +           "EventIdCode": "0x01",
>> +           "EventName": "sys_cmn_pmu.hnf_cache_miss",
>> +           "Unit": "sys_cmn_pmu",
>> +           "Compat": "434*;436*;43c*;43a01"
> 
> I suspect this needs adding here:
> https://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git/tree/tools/perf/pmu-events/empty-pmu-events.c?h=perf-tools-next#n247
> 
After adding the relevant code in empty-pmu-events.c, it can successfully test with NO_JEVENTS=1.

Thanks,
Jing

> Thanks,
> Ian
> 
>>     }
>>  ]
>> 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
>>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 5/7] perf test: Add pmu-event test for "Compat" and new event_field.
@ 2023-08-15 12:33       ` Jing Zhang
  0 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-15 12:33 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/15 上午9:11, Ian Rogers 写道:
> On Mon, Aug 7, 2023 at 12:51 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>
> 
> Did you test with NO_JEVENTS=1?
> 

You are absolutely right. I completely overlooked the case where NO_JEVENTS=1.


>> ---
>>  .../pmu-events/arch/test/test_soc/sys/uncore.json  |  8 ++++
>>  tools/perf/tests/pmu-events.c                      | 55 ++++++++++++++++++++++
>>  2 files changed, 63 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..19ec595 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).",
>> +           "Type": "0x05",
>> +           "EventIdCode": "0x01",
>> +           "EventName": "sys_cmn_pmu.hnf_cache_miss",
>> +           "Unit": "sys_cmn_pmu",
>> +           "Compat": "434*;436*;43c*;43a01"
> 
> I suspect this needs adding here:
> https://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git/tree/tools/perf/pmu-events/empty-pmu-events.c?h=perf-tools-next#n247
> 
After adding the relevant code in empty-pmu-events.c, it can successfully test with NO_JEVENTS=1.

Thanks,
Jing

> Thanks,
> Ian
> 
>>     }
>>  ]
>> 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] 44+ messages in thread

* Re: [PATCH v6 6/7] perf jevents: Add support for Arm CMN PMU aliasing
  2023-08-14 22:36     ` Ian Rogers
@ 2023-08-15 12:43       ` Jing Zhang
  -1 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-15 12:43 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/15 上午6:36, Ian Rogers 写道:
> On Mon, Aug 7, 2023 at 12:51 AM Jing Zhang <renyu.zj@linux.alibaba.com> 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:
> 
> nit: The use of the words "events" and "aliases" can be confusing -
> aliases isn't specific as there may be a notion of other aliases like
> for PMU names. I think in the code base we should avoid to use
> "aliases" and just use "events".
> 

Thank you for your suggestions. But if I use "event" instead of "alias" here,
it may not describe it clearly because essentially I am adding aliases to
existing events rather than adding new events.

Thanks,
Jing

> Thanks,
> Ian
> 
>> [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..e54036c
>> --- /dev/null
>> +++ b/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
>> @@ -0,0 +1,266 @@
>> +[
>> +       {
>> +               "EventName": "hnf_cache_miss",
>> +               "EventIdCode": "0x1",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "0x5",
>> +               "BriefDescription": "Counts number of retried requests.",
>> +               "Unit": "arm_cmn",
>> +               "Compat": "434*;436*;43c*;43a*"
>> +       },
>> +       {
>> +               "EventName": "hnf_pocq_reqs_recvd",
>> +               "EventIdCode": "0x5",
>> +               "Type": "0x5",
>> +               "BriefDescription": "Counts number of requests that HN receives.",
>> +               "Unit": "arm_cmn",
>> +               "Compat": "434*;436*;43c*;43a*"
>> +       },
>> +       {
>> +               "EventName": "hnf_sf_hit",
>> +               "EventIdCode": "0x6",
>> +               "Type": "0x5",
>> +               "BriefDescription": "Counts number of SF hits.",
>> +               "Unit": "arm_cmn",
>> +               "Compat": "434*;436*;43c*;43a*"
>> +       },
>> +       {
>> +               "EventName": "hnf_sf_evictions",
>> +               "EventIdCode": "0x7",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "0x5",
>> +               "BriefDescription": "Counts number of retried transactions by the MC.",
>> +               "Unit": "arm_cmn",
>> +               "Compat": "434*;436*;43c*;43a*"
>> +       },
>> +       {
>> +               "EventName": "hnf_mc_reqs",
>> +               "EventIdCode": "0xd",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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 9c0f63a..bfdfb67 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
>>

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 44+ messages in thread

* Re: [PATCH v6 6/7] perf jevents: Add support for Arm CMN PMU aliasing
@ 2023-08-15 12:43       ` Jing Zhang
  0 siblings, 0 replies; 44+ messages in thread
From: Jing Zhang @ 2023-08-15 12:43 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/15 上午6:36, Ian Rogers 写道:
> On Mon, Aug 7, 2023 at 12:51 AM Jing Zhang <renyu.zj@linux.alibaba.com> 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:
> 
> nit: The use of the words "events" and "aliases" can be confusing -
> aliases isn't specific as there may be a notion of other aliases like
> for PMU names. I think in the code base we should avoid to use
> "aliases" and just use "events".
> 

Thank you for your suggestions. But if I use "event" instead of "alias" here,
it may not describe it clearly because essentially I am adding aliases to
existing events rather than adding new events.

Thanks,
Jing

> Thanks,
> Ian
> 
>> [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..e54036c
>> --- /dev/null
>> +++ b/tools/perf/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
>> @@ -0,0 +1,266 @@
>> +[
>> +       {
>> +               "EventName": "hnf_cache_miss",
>> +               "EventIdCode": "0x1",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "0x5",
>> +               "BriefDescription": "Counts number of retried requests.",
>> +               "Unit": "arm_cmn",
>> +               "Compat": "434*;436*;43c*;43a*"
>> +       },
>> +       {
>> +               "EventName": "hnf_pocq_reqs_recvd",
>> +               "EventIdCode": "0x5",
>> +               "Type": "0x5",
>> +               "BriefDescription": "Counts number of requests that HN receives.",
>> +               "Unit": "arm_cmn",
>> +               "Compat": "434*;436*;43c*;43a*"
>> +       },
>> +       {
>> +               "EventName": "hnf_sf_hit",
>> +               "EventIdCode": "0x6",
>> +               "Type": "0x5",
>> +               "BriefDescription": "Counts number of SF hits.",
>> +               "Unit": "arm_cmn",
>> +               "Compat": "434*;436*;43c*;43a*"
>> +       },
>> +       {
>> +               "EventName": "hnf_sf_evictions",
>> +               "EventIdCode": "0x7",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "0x5",
>> +               "BriefDescription": "Counts number of retried transactions by the MC.",
>> +               "Unit": "arm_cmn",
>> +               "Compat": "434*;436*;43c*;43a*"
>> +       },
>> +       {
>> +               "EventName": "hnf_mc_reqs",
>> +               "EventIdCode": "0xd",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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",
>> +               "Type": "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 9c0f63a..bfdfb67 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	[flat|nested] 44+ messages in thread

end of thread, other threads:[~2023-08-15 12:44 UTC | newest]

Thread overview: 44+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-07  7:51 [PATCH v6 0/7] Add aliases and metrics for Arm CMN Jing Zhang
2023-08-07  7:51 ` Jing Zhang
2023-08-07  7:51 ` [PATCH v6 1/7] perf pmu: "Compat" supports matching multiple identifiers Jing Zhang
2023-08-07  7:51   ` Jing Zhang
2023-08-07  9:19   ` John Garry
2023-08-07  9:19     ` John Garry
2023-08-07  7:51 ` [PATCH v6 2/7] perf metric: " Jing Zhang
2023-08-07  7:51   ` Jing Zhang
2023-08-07  9:20   ` John Garry
2023-08-07  9:20     ` John Garry
2023-08-07  7:51 ` [PATCH v6 3/7] perf jevents: Support more event fields Jing Zhang
2023-08-07  7:51   ` Jing Zhang
2023-08-07  9:24   ` John Garry
2023-08-07  9:24     ` John Garry
2023-08-07 11:52     ` Jing Zhang
2023-08-07 11:52       ` Jing Zhang
2023-08-14  6:08     ` Jing Zhang
2023-08-14  6:08       ` Jing Zhang
2023-08-14 22:31   ` Ian Rogers
2023-08-14 22:31     ` Ian Rogers
2023-08-15 12:24     ` Jing Zhang
2023-08-15 12:24       ` Jing Zhang
2023-08-07  7:51 ` [PATCH v6 4/7] perf test: Fix matching_pmu Jing Zhang
2023-08-07  7:51   ` Jing Zhang
2023-08-07  9:21   ` John Garry
2023-08-07  9:21     ` John Garry
2023-08-07 12:02     ` Jing Zhang
2023-08-07 12:02       ` Jing Zhang
2023-08-07  7:51 ` [PATCH v6 5/7] perf test: Add pmu-event test for "Compat" and new event_field Jing Zhang
2023-08-07  7:51   ` Jing Zhang
2023-08-07  9:23   ` John Garry
2023-08-07  9:23     ` John Garry
2023-08-15  1:11   ` Ian Rogers
2023-08-15  1:11     ` Ian Rogers
2023-08-15 12:33     ` Jing Zhang
2023-08-15 12:33       ` Jing Zhang
2023-08-07  7:51 ` [PATCH v6 6/7] perf jevents: Add support for Arm CMN PMU aliasing Jing Zhang
2023-08-07  7:51   ` Jing Zhang
2023-08-14 22:36   ` Ian Rogers
2023-08-14 22:36     ` Ian Rogers
2023-08-15 12:43     ` Jing Zhang
2023-08-15 12:43       ` Jing Zhang
2023-08-07  7:51 ` [PATCH v6 7/7] perf vendor events: Add JSON metrics for Arm CMN Jing Zhang
2023-08-07  7:51   ` Jing Zhang

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.