perf stat: Fix metrics with --no-merge
authorAndi Kleen <ak@linux.intel.com>
Mon, 24 Jun 2019 19:37:11 +0000 (12:37 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 2 Jul 2019 01:50:41 +0000 (22:50 -0300)
Since Fixes: 8c5421c016a4 ("perf pmu: Display pmu name when printing
unmerged events in stat") using --no-merge adds the PMU name to the
evsel name.

This breaks the metric value lookup because the parser doesn't know
about this.

Remove the extra postfixes for the metric evaluation.

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Agustin Vega-Frias <agustinv@codeaurora.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Fixes: 8c5421c016a4 ("perf pmu: Display pmu name when printing unmerged events in stat")
Link: http://lkml.kernel.org/r/20190624193711.35241-5-andi@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/stat-shadow.c

index 3f8fd127d31e0a8053462e54fa25073291603ee1..cb891e5c29696a240a0872f0f06039eccc04fe6d 100644 (file)
@@ -724,6 +724,7 @@ static void generic_metric(struct perf_stat_config *config,
        double ratio;
        int i;
        void *ctxp = out->ctx;
+       char *n, *pn;
 
        expr__ctx_init(&pctx);
        expr__add_id(&pctx, name, avg);
@@ -743,7 +744,19 @@ static void generic_metric(struct perf_stat_config *config,
                        stats = &v->stats;
                        scale = 1.0;
                }
-               expr__add_id(&pctx, metric_events[i]->name, avg_stats(stats)*scale);
+
+               n = strdup(metric_events[i]->name);
+               if (!n)
+                       return;
+               /*
+                * This display code with --no-merge adds [cpu] postfixes.
+                * These are not supported by the parser. Remove everything
+                * after the space.
+                */
+               pn = strchr(n, ' ');
+               if (pn)
+                       *pn = 0;
+               expr__add_id(&pctx, n, avg_stats(stats)*scale);
        }
        if (!metric_events[i]) {
                const char *p = metric_expr;
@@ -760,6 +773,9 @@ static void generic_metric(struct perf_stat_config *config,
                                     (metric_name ? metric_name : name) : "", 0);
        } else
                print_metric(config, ctxp, NULL, NULL, "", 0);
+
+       for (i = 1; i < pctx.num_ids; i++)
+               free((void *)pctx.ids[i].name);
 }
 
 void perf_stat__print_shadow_stats(struct perf_stat_config *config,