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>, Jiri Olsa <jolsa@kernel.org>,
Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>,
James Clark <james.clark@linaro.org>
Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH v2 28/30] perf stat report: Display metrics for recorded events
Date: Fri, 13 Nov 2026 11:53:33 -0800 [thread overview]
Message-ID: <20261113195335.2865725-29-irogers@google.com> (raw)
In-Reply-To: <20261113195335.2865725-1-irogers@google.com>
perf stat report displays the recorded counts but not the metrics that
perf stat record displayed, as metrics aren't recorded in the perf.data
file. Inspect the recorded command line in struct perf_env and display
the metrics requested on the perf stat record command line (or the
default metrics when no events or metrics were explicitly specified),
for example:
$ perf stat record -M insn_per_cycle -a sleep 1
$ perf stat report
...
784,599,279 cpu_atom/cpu-cycles/ # 0.7 instructions insn_per_cycle
586,070,692 cpu_atom/instructions/
776,737,361 cpu_core/cpu-cycles/ # 1.3 instructions insn_per_cycle
1,011,699,468 cpu_core/instructions/
1.004467030 seconds time elapsed
Also add --all-metrics (and the stat.all-metrics config option) to
display all metrics whose events were recorded in the perf.data file,
as well as -M/--metrics and --metric-only options to perf stat report.
Set stat_config.system_wide from the recorded thread map as metrics
such as CPUs_utilized depend upon it.
Signed-off-by: Ian Rogers <irogers@google.com>
---
tools/perf/Documentation/perf-config.txt | 7 +++
tools/perf/Documentation/perf-stat.txt | 5 +++
tools/perf/builtin-stat.c | 54 +++++++++++++++++++++---
tools/perf/util/config.c | 3 ++
tools/perf/util/stat.h | 1 +
5 files changed, 65 insertions(+), 5 deletions(-)
diff --git a/tools/perf/Documentation/perf-config.txt b/tools/perf/Documentation/perf-config.txt
index 6cff6f26af8d..906e59c7e9d5 100644
--- a/tools/perf/Documentation/perf-config.txt
+++ b/tools/perf/Documentation/perf-config.txt
@@ -713,6 +713,13 @@ stat.*::
(boolean) Change the default for "--big-num". To make
"--no-big-num" the default, set "stat.big-num=false".
+ stat.all-metrics::
+ (boolean) Change the default for "--all-metrics" in
+ "perf stat report" and "perf script". When true, all metrics
+ whose events were recorded in the data file are displayed rather
+ than only the metrics requested on the "perf stat record"
+ command line.
+
intel-pt.*::
intel-pt.cache-divisor::
diff --git a/tools/perf/Documentation/perf-stat.txt b/tools/perf/Documentation/perf-stat.txt
index 8ea17da89976..7258ec280770 100644
--- a/tools/perf/Documentation/perf-stat.txt
+++ b/tools/perf/Documentation/perf-stat.txt
@@ -426,6 +426,11 @@ information at the boundary of the level 3 cache in the system.
--per-core::
Aggregate counts per physical processor for system-wide mode measurements.
+--all-metrics::
+Display all metrics that match the recorded events in the perf data file,
+rather than only the metrics requested on the 'perf stat record' command line.
+Default setting can be changed with "perf config stat.all-metrics=true".
+
-M::
--metrics::
Print metrics or metricgroups specified in a comma separated list.
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 2b563382cf43..64883e7cb6aa 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -2246,6 +2246,29 @@ static int process_stat_round_event(const struct perf_tool *tool __maybe_unused,
struct perf_env *env = perf_session__env(session);
const char **argv = env->cmdline_argv;
int argc = env->nr_cmdline;
+ static bool metrics_added;
+
+ if (!metrics_added) {
+ struct perf_thread_map *threads = evlist__core(session->evlist)->threads;
+ bool system_wide = !threads || perf_thread_map__nr(threads) < 1 ||
+ perf_thread_map__pid(threads, /*idx=*/0) == -1;
+
+ /* Metrics may use system_wide, such as for #target_cpu. */
+ stat_config.system_wide = system_wide;
+ metricgroup__add_recorded_metrics(session->evlist, metrics,
+ parse_events_option_args.pmu_filter,
+ parse_events_option_args.cputype_filter,
+ stat_config.metric_no_group,
+ stat_config.metric_no_merge,
+ stat_config.metric_no_threshold,
+ stat_config.all_metrics,
+ system_wide,
+ /*default_metricgroup=*/true,
+ force_metric_only ? NULL
+ : &stat_config.metric_only);
+ zfree(&metrics);
+ metrics_added = true;
+ }
process_counters();
@@ -2296,6 +2319,8 @@ int process_stat_config_event(const struct perf_tool *tool,
static int set_maps(struct perf_stat *st)
{
+ struct evsel *counter;
+
if (!st->cpus || !st->threads)
return 0;
@@ -2307,6 +2332,9 @@ static int set_maps(struct perf_stat *st)
if (evlist__alloc_stats(&stat_config, evsel_list, /*alloc_raw=*/true))
return -ENOMEM;
+ evlist__for_each_entry(evsel_list, counter)
+ counter->supported = false;
+
st->maps_allocated = true;
return 0;
}
@@ -2365,7 +2393,7 @@ static int __cmd_report(int argc, const char **argv)
{
struct perf_session *session;
struct opt_aggr_mode opt_mode = {};
- const struct option options[] = {
+ struct option options[] = {
OPT_STRING('i', "input", &input_name, "file", "input file name"),
OPT_BOOLEAN(0, "per-thread", &opt_mode.thread, "aggregate counts per thread"),
OPT_BOOLEAN(0, "per-socket", &opt_mode.socket,
@@ -2381,11 +2409,20 @@ static int __cmd_report(int argc, const char **argv)
OPT_BOOLEAN(0, "per-node", &opt_mode.node, "aggregate counts per numa node"),
OPT_BOOLEAN('A', "no-aggr", &opt_mode.no_aggr,
"disable aggregation across CPUs or PMUs"),
+ OPT_CALLBACK('M', "metrics", &evsel_list, "metric/metric group list",
+ "display specified metrics or metric groups (separated by ,)",
+ append_metric_groups),
+ OPT_BOOLEAN(0, "all-metrics", &stat_config.all_metrics,
+ "display all metrics matching recorded events"),
+ OPT_CALLBACK_NOOPT(0, "metric-only", &stat_config.metric_only, NULL,
+ "Only print computed metrics. No raw values",
+ enable_metric_only),
OPT_END()
};
struct stat st;
int ret;
+ set_option_flag(options, 'M', "metrics", PARSE_OPT_NONEG);
argc = parse_options(argc, argv, options, stat_report_usage, 0);
perf_stat.aggr_mode = opt_aggr_mode_to_aggr_mode(&opt_mode);
@@ -2412,8 +2449,10 @@ static int __cmd_report(int argc, const char **argv)
perf_stat.tool.stat_round = process_stat_round_event;
session = perf_session__new(&perf_stat.data, &perf_stat.tool);
- if (IS_ERR(session))
- return PTR_ERR(session);
+ if (IS_ERR(session)) {
+ ret = PTR_ERR(session);
+ goto out;
+ }
perf_stat.session = session;
stat_config.output = stderr;
@@ -2422,10 +2461,13 @@ static int __cmd_report(int argc, const char **argv)
ret = perf_session__process_events(session);
if (ret)
- return ret;
+ goto out;
perf_session__delete(session);
- return 0;
+out:
+ /* Freed when processing the first stat round, if there was one. */
+ zfree(&metrics);
+ return ret;
}
static void setup_system_wide(int forks)
@@ -2603,6 +2645,8 @@ int cmd_stat(int argc, const char **argv)
OPT_CALLBACK('M', "metrics", &evsel_list, "metric/metric group list",
"monitor specified metrics or metric groups (separated by ,)",
append_metric_groups),
+ OPT_BOOLEAN(0, "all-metrics", &stat_config.all_metrics,
+ "display all metrics matching recorded events (report only)"),
OPT_BOOLEAN_FLAG(0, "all-kernel", &stat_config.all_kernel,
"Configure all used events to run in kernel space.",
PARSE_OPT_EXCLUSIVE),
diff --git a/tools/perf/util/config.c b/tools/perf/util/config.c
index 287401f159e6..d64d0db51d8e 100644
--- a/tools/perf/util/config.c
+++ b/tools/perf/util/config.c
@@ -514,6 +514,9 @@ static int perf_stat_config(const char *var, const char *value)
if (!strcmp(var, "stat.bpf-counter-events"))
evsel__bpf_counter_events = strdup(value);
+ if (!strcmp(var, "stat.all-metrics"))
+ stat_config.all_metrics = perf_config_bool(var, value);
+
/* Add other config variables here. */
return 0;
}
diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h
index e3598037a6aa..a957479804c1 100644
--- a/tools/perf/util/stat.h
+++ b/tools/perf/util/stat.h
@@ -82,6 +82,7 @@ struct perf_stat_config {
bool metric_no_group;
bool metric_no_merge;
bool metric_no_threshold;
+ bool all_metrics;
bool hardware_aware_grouping;
bool stop_read_counter;
bool iostat_run;
--
2.56.1.703.gf848ed807c-goog
next prev parent reply other threads:[~2026-11-13 19:54 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-13 19:53 [PATCH v2 00/30] perf: Per-env PMUs, metric event sharing, and recorded event metrics Ian Rogers
2026-11-13 19:53 ` [PATCH v2 01/30] perf pmus: Don't skip core PMUs as duplicates Ian Rogers
2026-11-13 19:53 ` [PATCH v2 02/30] perf script: Fix metrics computed from samples Ian Rogers
2026-11-13 19:53 ` [PATCH v2 03/30] perf script: Don't drop metric samples for CPUs missing from the evsel Ian Rogers
2026-11-13 19:53 ` [PATCH v2 04/30] perf metricgroup: Don't prefer tool events for displaying a metric Ian Rogers
2026-11-13 19:53 ` [PATCH v2 05/30] perf env: Make lazy perf_env initialization thread-safe Ian Rogers
2026-11-13 19:53 ` [PATCH v2 06/30] perf env: Add host_env() singleton Ian Rogers
2026-11-13 19:53 ` [PATCH v2 07/30] perf pmu: Add from_env parameter to perf_pmu__init() Ian Rogers
2026-11-13 19:53 ` [PATCH v2 08/30] perf pmus: Introduce struct perf_pmus and perf_env__pmus() Ian Rogers
2026-11-13 19:53 ` [PATCH v2 09/30] perf pmus: Pass struct perf_pmus to find helpers Ian Rogers
2026-11-13 19:53 ` [PATCH v2 10/30] perf pmus: Pass struct perf_pmus to scan helpers Ian Rogers
2026-11-13 19:53 ` [PATCH v2 11/30] perf pmu-events: Add e_machine to struct pmu_events_map Ian Rogers
2026-11-13 19:53 ` [PATCH v2 12/30] perf pmu-events: Pass e_machine to find_core_*_table() Ian Rogers
2026-11-13 19:53 ` [PATCH v2 13/30] perf header: Pass e_machine to strcmp_cpuid_str() Ian Rogers
2026-11-13 19:53 ` [PATCH v2 14/30] perf header: Support CPUID matching across all architectures Ian Rogers
2026-11-13 19:53 ` [PATCH v2 15/30] perf test: Make the CPUID matching test architecture independent Ian Rogers
2026-11-13 19:53 ` [PATCH v2 16/30] perf test: Add CPUID matching tests for other architectures Ian Rogers
2026-11-13 19:53 ` [PATCH v2 17/30] perf dwarf-regs: Add e_machine__same_arch() Ian Rogers
2026-11-13 19:53 ` [PATCH v2 18/30] perf metricgroup: Pass struct perf_pmus to metricgroup__for_each_metric() Ian Rogers
2026-11-13 19:53 ` [PATCH v2 19/30] perf metricgroup: Move matching of metrics to recorded events from perf script Ian Rogers
2026-11-13 19:53 ` [PATCH v2 20/30] perf parse-events: Decode metric-id terms when adding events Ian Rogers
2026-11-13 19:53 ` [PATCH v2 21/30] perf evsel: Generalize metric_id to a set of metric_ids Ian Rogers
2026-11-13 19:53 ` [PATCH v2 22/30] perf pmu: Add perf_pmu__for_each_name_from_config() Ian Rogers
2026-11-13 19:53 ` [PATCH v2 23/30] perf metricgroup: Share metric events by their counter encoding Ian Rogers
2026-11-13 19:53 ` [PATCH v2 24/30] perf stat: Share events between metrics and command line events Ian Rogers
2026-11-13 19:53 ` [PATCH v2 25/30] perf pmus: Add perf_pmus__read_from_env() Ian Rogers
2026-11-13 19:53 ` [PATCH v2 26/30] perf metricgroup: Improve matching of metrics to recorded events Ian Rogers
2026-11-13 19:53 ` [PATCH v2 27/30] perf metricgroup: Add metricgroup__add_recorded_metrics() Ian Rogers
2026-11-13 19:53 ` Ian Rogers [this message]
2026-11-13 19:53 ` [PATCH v2 29/30] perf script: Display metrics for perf stat record data Ian Rogers
2026-11-13 19:53 ` [PATCH v2 30/30] perf test: Add stat record metrics test Ian Rogers
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=20261113195335.2865725-29-irogers@google.com \
--to=irogers@google.com \
--cc=acme@kernel.org \
--cc=adrian.hunter@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®