From: Ian Rogers <irogers@google.com>
To: Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>,
Adrian Hunter <adrian.hunter@intel.com>,
James Clark <james.clark@linaro.org>,
linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org
Cc: Ian Rogers <irogers@google.com>
Subject: [PATCH v1 02/14] perf pmu-events: Add API to get metric table name and iterate tables
Date: Wed, 13 May 2026 16:04:38 -0700 [thread overview]
Message-ID: <20260513230450.529380-3-irogers@google.com> (raw)
In-Reply-To: <20260513230450.529380-1-irogers@google.com>
Add name field to struct pmu_metrics_table and populate it in
generated tables.
Add pmu_metrics_table__name() to retrieve the name.
Add pmu_metrics_table__for_each_table() to iterate over all known
metric tables.
This will be used to break apart slow metric tests per table.
Assisted-by: Gemini-CLI:Google Gemini 3
Signed-off-by: Ian Rogers <irogers@google.com>
---
tools/perf/pmu-events/empty-pmu-events.c | 36 +++++++++++++++++--
tools/perf/pmu-events/jevents.py | 44 ++++++++++++++++++++++--
tools/perf/pmu-events/pmu-events.h | 4 +++
3 files changed, 80 insertions(+), 4 deletions(-)
diff --git a/tools/perf/pmu-events/empty-pmu-events.c b/tools/perf/pmu-events/empty-pmu-events.c
index 322e6c2d58cb..f51062ef25d3 100644
--- a/tools/perf/pmu-events/empty-pmu-events.c
+++ b/tools/perf/pmu-events/empty-pmu-events.c
@@ -5403,6 +5403,7 @@ struct pmu_events_table {
/* Struct used to make the PMU metric table implementation opaque to callers. */
struct pmu_metrics_table {
+ const char *name;
const struct pmu_table_entry *pmus;
uint32_t num_pmus;
};
@@ -5435,6 +5436,7 @@ static const struct pmu_events_map pmu_events_map[] = {
.num_pmus = ARRAY_SIZE(pmu_events__common),
},
.metric_table = {
+ .name = "common",
.pmus = pmu_metrics__common,
.num_pmus = ARRAY_SIZE(pmu_metrics__common),
},
@@ -5447,6 +5449,7 @@ static const struct pmu_events_map pmu_events_map[] = {
.num_pmus = ARRAY_SIZE(pmu_events__test_soc_cpu),
},
.metric_table = {
+ .name = "test_soc_cpu",
.pmus = pmu_metrics__test_soc_cpu,
.num_pmus = ARRAY_SIZE(pmu_metrics__test_soc_cpu),
}
@@ -5455,7 +5458,7 @@ static const struct pmu_events_map pmu_events_map[] = {
.arch = 0,
.cpuid = 0,
.event_table = { 0, 0 },
- .metric_table = { 0, 0 },
+ .metric_table = { 0 },
}
};
@@ -5475,7 +5478,7 @@ static const struct pmu_sys_events pmu_sys_event_tables[] = {
},
{
.event_table = { 0, 0 },
- .metric_table = { 0, 0 },
+ .metric_table = { 0 },
},
};
/* clang-format on */
@@ -5992,6 +5995,35 @@ int pmu_for_each_sys_metric(pmu_metric_iter_fn fn, void *data)
return 0;
}
+const char *pmu_metrics_table__name(const struct pmu_metrics_table *table)
+{
+ return table ? table->name : NULL;
+}
+
+int pmu_metrics_table__for_each_table(
+ int (*fn)(const struct pmu_metrics_table *table, void *data),
+ void *data)
+{
+ size_t i;
+ int ret;
+
+ for (i = 0; pmu_events_map[i].cpuid; i++) {
+ if (!pmu_events_map[i].metric_table.pmus)
+ continue;
+ ret = fn(&pmu_events_map[i].metric_table, data);
+ if (ret)
+ return ret;
+ }
+ for (i = 0; pmu_sys_event_tables[i].name; i++) {
+ if (!pmu_sys_event_tables[i].metric_table.pmus)
+ continue;
+ ret = fn(&pmu_sys_event_tables[i].metric_table, data);
+ if (ret)
+ return ret;
+ }
+ return 0;
+}
+
static const int metricgroups[][2] = {
};
diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jevents.py
index 7d325604f04d..a74c5e828bd1 100755
--- a/tools/perf/pmu-events/jevents.py
+++ b/tools/perf/pmu-events/jevents.py
@@ -712,6 +712,7 @@ struct pmu_events_table {
/* Struct used to make the PMU metric table implementation opaque to callers. */
struct pmu_metrics_table {
+\tconst char *name;
\tconst struct pmu_table_entry *pmus;
\tuint32_t num_pmus;
};
@@ -747,6 +748,7 @@ static const struct pmu_events_map pmu_events_map[] = {
\t\t.num_pmus = ARRAY_SIZE(pmu_events__test_soc_cpu),
\t},
\t.metric_table = {
+\t\t.name = "test_soc_cpu",
\t\t.pmus = pmu_metrics__test_soc_cpu,
\t\t.num_pmus = ARRAY_SIZE(pmu_metrics__test_soc_cpu),
\t}
@@ -761,6 +763,7 @@ static const struct pmu_events_map pmu_events_map[] = {
\t\t.num_pmus = ARRAY_SIZE(pmu_events__common),
\t},
\t.metric_table = {
+\t\t.name = "common",
\t\t.pmus = pmu_metrics__common,
\t\t.num_pmus = ARRAY_SIZE(pmu_metrics__common),
\t},
@@ -796,6 +799,7 @@ static const struct pmu_events_map pmu_events_map[] = {
\t\t.num_pmus = {event_size}
\t}},
\t.metric_table = {{
+\t\t.name = "{metric_tblname.replace('pmu_metrics__', '')}",
\t\t.pmus = {metric_tblname},
\t\t.num_pmus = {metric_size}
\t}}
@@ -807,12 +811,45 @@ static const struct pmu_events_map pmu_events_map[] = {
\t.arch = 0,
\t.cpuid = 0,
\t.event_table = { 0, 0 },
-\t.metric_table = { 0, 0 },
+\t.metric_table = { 0 },
}
};
""")
+def print_metric_table_functions() -> None:
+ _args.output_file.write("""
+const char *pmu_metrics_table__name(const struct pmu_metrics_table *table)
+{
+\treturn table ? table->name : NULL;
+}
+
+int pmu_metrics_table__for_each_table(
+\tint (*fn)(const struct pmu_metrics_table *table, void *data),
+\tvoid *data)
+{
+\tsize_t i;
+\tint ret;
+
+\tfor (i = 0; pmu_events_map[i].cpuid; i++) {
+\t\tif (!pmu_events_map[i].metric_table.pmus)
+\t\t\tcontinue;
+\t\tret = fn(&pmu_events_map[i].metric_table, data);
+\t\tif (ret)
+\t\t\treturn ret;
+\t}
+\tfor (i = 0; pmu_sys_event_tables[i].name; i++) {
+\t\tif (!pmu_sys_event_tables[i].metric_table.pmus)
+\t\t\tcontinue;
+\t\tret = fn(&pmu_sys_event_tables[i].metric_table, data);
+\t\tif (ret)
+\t\t\treturn ret;
+\t}
+\treturn 0;
+}
+""")
+
+
def print_system_mapping_table() -> None:
"""C struct mapping table array for tables from /sys directories."""
_args.output_file.write("""
@@ -835,6 +872,7 @@ static const struct pmu_sys_events pmu_sys_event_tables[] = {
if metric_tblname in _sys_metric_tables:
_args.output_file.write(f"""
\t\t.metric_table = {{
+\t\t\t.name = "{metric_tblname.replace('pmu_metrics__', '')}",
\t\t\t.pmus = {metric_tblname},
\t\t\t.num_pmus = ARRAY_SIZE({metric_tblname})
\t\t}},""")
@@ -848,6 +886,7 @@ static const struct pmu_sys_events pmu_sys_event_tables[] = {
continue
_args.output_file.write(f"""\t{{
\t\t.metric_table = {{
+\t\t\t.name = "{tblname.replace('pmu_metrics__', '')}",
\t\t\t.pmus = {tblname},
\t\t\t.num_pmus = ARRAY_SIZE({tblname})
\t\t}},
@@ -856,7 +895,7 @@ static const struct pmu_sys_events pmu_sys_event_tables[] = {
""")
_args.output_file.write("""\t{
\t\t.event_table = { 0, 0 },
-\t\t.metric_table = { 0, 0 },
+\t\t.metric_table = { 0 },
\t},
};
/* clang-format on */
@@ -1475,6 +1514,7 @@ struct pmu_table_entry {
print_mapping_table(archs)
print_system_mapping_table()
+ print_metric_table_functions()
print_metricgroups()
if __name__ == '__main__':
diff --git a/tools/perf/pmu-events/pmu-events.h b/tools/perf/pmu-events/pmu-events.h
index d3b24014c6ff..9cac617c9702 100644
--- a/tools/perf/pmu-events/pmu-events.h
+++ b/tools/perf/pmu-events/pmu-events.h
@@ -112,6 +112,10 @@ size_t pmu_events_table__num_events(const struct pmu_events_table *table,
int pmu_metrics_table__for_each_metric(const struct pmu_metrics_table *table, pmu_metric_iter_fn fn,
void *data);
+const char *pmu_metrics_table__name(const struct pmu_metrics_table *table);
+int pmu_metrics_table__for_each_table(
+ int (*fn)(const struct pmu_metrics_table *table, void *data),
+ void *data);
/*
* Search for a table and entry matching with pmu__name_wildcard_match or any
* tables if pmu is NULL. Each matching metric has fn called on it. 0 implies to
--
2.54.0.563.g4f69b47b94-goog
next prev parent reply other threads:[~2026-05-13 23:05 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-13 23:04 [PATCH v1 00/14] perf test: Harness improvements Ian Rogers
2026-05-13 23:04 ` [PATCH v1 01/14] perf jevents.py: Make generated C code more kernel style Ian Rogers
2026-05-13 23:04 ` Ian Rogers [this message]
2026-05-14 11:42 ` [PATCH v1 02/14] perf pmu-events: Add API to get metric table name and iterate tables sashiko-bot
2026-05-13 23:04 ` [PATCH v1 03/14] perf test: Drain pipe after child finishes to avoid losing output Ian Rogers
2026-05-13 23:04 ` [PATCH v1 04/14] perf test: Support dynamic test suites with setup callback and private data Ian Rogers
2026-05-14 12:10 ` sashiko-bot
2026-05-13 23:04 ` [PATCH v1 05/14] perf test pmu-events: A sub-test per metric table Ian Rogers
2026-05-13 23:04 ` [PATCH v1 06/14] perf test: Refactor parallel poll loop to drain all pipes simultaneously Ian Rogers
2026-05-14 14:27 ` sashiko-bot
2026-05-13 23:04 ` [PATCH v1 07/14] perf test: Show snippet failure output for verbose=1 Ian Rogers
2026-05-14 15:50 ` sashiko-bot
2026-05-13 23:04 ` [PATCH v1 08/14] perf test: Add summary reporting Ian Rogers
2026-05-14 16:10 ` sashiko-bot
2026-05-13 23:04 ` [PATCH v1 09/14] perf test: Fix subtest status alignment for multi-digit indexes Ian Rogers
2026-05-13 23:04 ` [PATCH v1 10/14] perf test: Skip shebang and SPDX comments in shell test descriptions Ian Rogers
2026-05-13 23:04 ` [PATCH v1 11/14] perf test: Split monolithic 'util' test suite into sub-tests Ian Rogers
2026-05-13 23:04 ` [PATCH v1 12/14] perf test: Add -j/--junit option for JUnit XML test reports Ian Rogers
2026-05-14 17:48 ` sashiko-bot
2026-05-13 23:04 ` [PATCH v1 13/14] perf test: Add shell test to validate JUnit XML reporting output Ian Rogers
2026-05-13 23:04 ` [PATCH v1 14/14] perf test: Remove /usr/bin/cc dependency from Intel PT shell test Ian Rogers
2026-05-14 18:28 ` sashiko-bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260513230450.529380-3-irogers@google.com \
--to=irogers@google.com \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=james.clark@linaro.org \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.