]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
perf stat: Fix opt->value type for parse_cache_level
authorIan Rogers <irogers@google.com>
Thu, 19 Mar 2026 23:33:49 +0000 (16:33 -0700)
committerNamhyung Kim <namhyung@kernel.org>
Thu, 26 Mar 2026 22:03:47 +0000 (15:03 -0700)
Commit f5803651b4a4 ("perf stat: Choose the most disaggregate command
line option") changed aggregation option handling for `perf stat` but
not `perf stat report` leading to parse_cache_level being passed a
struct in the `perf stat` case but erroneously an aggr_mode enum value
for `perf stat report`. Change the `perf stat report` aggregation
handling to use the same opt_aggr_mode as `perf stat`. Also, just pass
the boolean for consistency with other boolean argument handling.

Fixes: f5803651b4a4 ("perf stat: Choose the most disaggregate command line option")
Signed-off-by: Ian Rogers <irogers@google.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/builtin-stat.c

index 73c2ba7e30760e1455571a569e2299952577de5c..2eb76d7476b7ff12e4fb5dbb7ca06019ded7498d 100644 (file)
@@ -164,7 +164,7 @@ struct opt_aggr_mode {
 };
 
 /* Turn command line option into most generic aggregation mode setting. */
-static enum aggr_mode opt_aggr_mode_to_aggr_mode(struct opt_aggr_mode *opt_mode)
+static enum aggr_mode opt_aggr_mode_to_aggr_mode(const struct opt_aggr_mode *opt_mode)
 {
        enum aggr_mode mode = AGGR_GLOBAL;
 
@@ -1219,8 +1219,8 @@ static int parse_cache_level(const struct option *opt,
                             int unset __maybe_unused)
 {
        int level;
-       struct opt_aggr_mode *opt_aggr_mode = (struct opt_aggr_mode *)opt->value;
-       u32 *aggr_level = (u32 *)opt->data;
+       bool *per_cache = opt->value;
+       u32 *aggr_level = opt->data;
 
        /*
         * If no string is specified, aggregate based on the topology of
@@ -1258,7 +1258,7 @@ static int parse_cache_level(const struct option *opt,
                return -EINVAL;
        }
 out:
-       opt_aggr_mode->cache = true;
+       *per_cache = true;
        *aggr_level = level;
        return 0;
 }
@@ -2305,24 +2305,23 @@ static struct perf_stat perf_stat = {
 static int __cmd_report(int argc, const char **argv)
 {
        struct perf_session *session;
+       struct opt_aggr_mode opt_mode = {};
        const struct option options[] = {
        OPT_STRING('i', "input", &input_name, "file", "input file name"),
-       OPT_SET_UINT(0, "per-socket", &perf_stat.aggr_mode,
-                    "aggregate counts per processor socket", AGGR_SOCKET),
-       OPT_SET_UINT(0, "per-die", &perf_stat.aggr_mode,
-                    "aggregate counts per processor die", AGGR_DIE),
-       OPT_SET_UINT(0, "per-cluster", &perf_stat.aggr_mode,
-                    "aggregate counts perf processor cluster", AGGR_CLUSTER),
-       OPT_CALLBACK_OPTARG(0, "per-cache", &perf_stat.aggr_mode, &perf_stat.aggr_level,
-                           "cache level",
-                           "aggregate count at this cache level (Default: LLC)",
+       OPT_BOOLEAN(0, "per-thread", &opt_mode.thread, "aggregate counts per thread"),
+       OPT_BOOLEAN(0, "per-socket", &opt_mode.socket,
+                   "aggregate counts per processor socket"),
+       OPT_BOOLEAN(0, "per-die", &opt_mode.die, "aggregate counts per processor die"),
+       OPT_BOOLEAN(0, "per-cluster", &opt_mode.cluster,
+                   "aggregate counts per processor cluster"),
+       OPT_CALLBACK_OPTARG(0, "per-cache", &opt_mode.cache, &perf_stat.aggr_level,
+                           "cache level", "aggregate count at this cache level (Default: LLC)",
                            parse_cache_level),
-       OPT_SET_UINT(0, "per-core", &perf_stat.aggr_mode,
-                    "aggregate counts per physical processor core", AGGR_CORE),
-       OPT_SET_UINT(0, "per-node", &perf_stat.aggr_mode,
-                    "aggregate counts per numa node", AGGR_NODE),
-       OPT_SET_UINT('A', "no-aggr", &perf_stat.aggr_mode,
-                    "disable CPU count aggregation", AGGR_NONE),
+       OPT_BOOLEAN(0, "per-core", &opt_mode.core,
+                   "aggregate counts per physical processor core"),
+       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_END()
        };
        struct stat st;
@@ -2330,6 +2329,10 @@ static int __cmd_report(int argc, const char **argv)
 
        argc = parse_options(argc, argv, options, stat_report_usage, 0);
 
+       perf_stat.aggr_mode = opt_aggr_mode_to_aggr_mode(&opt_mode);
+       if (perf_stat.aggr_mode == AGGR_GLOBAL)
+               perf_stat.aggr_mode = AGGR_UNSET; /* No option found so leave unset. */
+
        if (!input_name || !strlen(input_name)) {
                if (!fstat(STDIN_FILENO, &st) && S_ISFIFO(st.st_mode))
                        input_name = "-";
@@ -2506,7 +2509,7 @@ int cmd_stat(int argc, const char **argv)
                OPT_BOOLEAN(0, "per-die", &opt_mode.die, "aggregate counts per processor die"),
                OPT_BOOLEAN(0, "per-cluster", &opt_mode.cluster,
                        "aggregate counts per processor cluster"),
-               OPT_CALLBACK_OPTARG(0, "per-cache", &opt_mode, &stat_config.aggr_level,
+               OPT_CALLBACK_OPTARG(0, "per-cache", &opt_mode.cache, &stat_config.aggr_level,
                                "cache level", "aggregate count at this cache level (Default: LLC)",
                                parse_cache_level),
                OPT_BOOLEAN(0, "per-core", &opt_mode.core,