[RFC PATCH v2 3/5] perf stat: Topdown json metrics setup function

From: Andrew Kilroy
Date: Tue Jan 11 2022 - 10:08:40 EST


Move into its own function, the set up of json metrics to measure L1
topdown statistics

Also move the setup of the metrics_only member of stat_config outside,
since its supposed to be common to both the kernel events and json
metrics implementations

Signed-off-by: Andrew Kilroy <andrew.kilroy@xxxxxxx>
---
tools/perf/builtin-stat.c | 31 +++++++++++++++++++------------
1 file changed, 19 insertions(+), 12 deletions(-)

diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index ab956ac97d94..6122f3a764f8 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -1651,15 +1651,12 @@ static int perf_stat_init_aggr_mode_file(struct perf_stat *st)

static int try_non_json_metrics_topdown(void)
{
- int err;
+ int err = 0;
const char **metric_attrs = topdown_metric_attrs;
unsigned int max_level = 1;
char *str = NULL;
bool warn = false;

- if (!force_metric_only)
- stat_config.metric_only = true;
-
if (pmu_have_event("cpu", topdown_metric_L2_attrs[5])) {
metric_attrs = topdown_metric_L2_attrs;
max_level = 2;
@@ -1727,6 +1724,18 @@ static int try_non_json_metrics_topdown(void)
return err;
}

+static int try_json_metrics_topdown(void)
+{
+ if (metricgroup__parse_groups_to_evlist(evsel_list, "TopDownL1",
+ stat_config.metric_no_group,
+ stat_config.metric_no_merge,
+ &stat_config.metric_events) < 0) {
+ pr_err("Could not form list of metrics for topdown\n");
+ return -1;
+ }
+ return 0;
+}
+
/*
* Add default attributes, if there were no attributes specified or
* if -d/--detailed, -d -d or -d -d -d is used:
@@ -1926,20 +1935,18 @@ static int add_default_attributes(void)
}

if (topdown_run) {
+ if (!force_metric_only)
+ stat_config.metric_only = true;
+
if (topdown_can_use_json_metrics()) {
- if (metricgroup__parse_groups_to_evlist(evsel_list, "TopDownL1",
- stat_config.metric_no_group,
- stat_config.metric_no_merge,
- &stat_config.metric_events) < 0) {
- pr_err("Could not form list of metrics for topdown\n");
- return -1;
- }
+ err = try_json_metrics_topdown();
+ if (err)
+ return err;
} else {
err = try_non_json_metrics_topdown();
if (err)
return err;
}
-
}

if (!evsel_list->core.nr_entries) {
--
2.17.1