perf metricgroup: Delay events string creation
authorIan Rogers <irogers@google.com>
Wed, 20 May 2020 18:20:07 +0000 (11:20 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 28 May 2020 13:03:28 +0000 (10:03 -0300)
Currently event groups are placed into groups_list at the same time as
the events string containing the events is built. Separate these two
operations and build the groups_list first, then the event string from
the groups_list. This adds an ability to reorder the groups_list that
will be used in a later patch.

Signed-off-by: Ian Rogers <irogers@google.com>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Andrii Nakryiko <andriin@fb.com>
Cc: Cong Wang <xiyou.wangcong@gmail.com>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: John Garry <john.garry@huawei.com>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Kim Phillips <kim.phillips@amd.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Clarke <pc@us.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Song Liu <songliubraving@fb.com>
Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Cc: Stephane Eranian <eranian@google.com>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Cc: bpf@vger.kernel.org
Cc: netdev@vger.kernel.org
Link: http://lore.kernel.org/lkml/20200520182011.32236-4-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/metricgroup.c

index 70f3f92..6247c9c 100644 (file)
@@ -90,6 +90,7 @@ struct egroup {
        const char *metric_expr;
        const char *metric_unit;
        int runtime;
+       bool has_constraint;
 };
 
 static struct evsel *find_evsel_group(struct evlist *perf_evlist,
@@ -488,8 +489,8 @@ int __weak arch_get_runtimeparam(void)
        return 1;
 }
 
-static int __metricgroup__add_metric(struct strbuf *events,
-               struct list_head *group_list, struct pmu_event *pe, int runtime)
+static int __metricgroup__add_metric(struct list_head *group_list,
+                                    struct pmu_event *pe, int runtime)
 {
        struct egroup *eg;
 
@@ -502,6 +503,7 @@ static int __metricgroup__add_metric(struct strbuf *events,
        eg->metric_expr = pe->metric_expr;
        eg->metric_unit = pe->unit;
        eg->runtime = runtime;
+       eg->has_constraint = metricgroup__has_constraint(pe);
 
        if (expr__find_other(pe->metric_expr, NULL, &eg->pctx, runtime) < 0) {
                expr__ctx_clear(&eg->pctx);
@@ -509,14 +511,6 @@ static int __metricgroup__add_metric(struct strbuf *events,
                return -EINVAL;
        }
 
-       if (events->len > 0)
-               strbuf_addf(events, ",");
-
-       if (metricgroup__has_constraint(pe))
-               metricgroup__add_metric_non_group(events, &eg->pctx);
-       else
-               metricgroup__add_metric_weak_group(events, &eg->pctx);
-
        list_add_tail(&eg->nd, group_list);
 
        return 0;
@@ -527,6 +521,7 @@ static int metricgroup__add_metric(const char *metric, struct strbuf *events,
 {
        struct pmu_events_map *map = perf_pmu__find_map(NULL);
        struct pmu_event *pe;
+       struct egroup *eg;
        int i, ret;
        bool has_match = false;
 
@@ -550,7 +545,8 @@ static int metricgroup__add_metric(const char *metric, struct strbuf *events,
                        pr_debug("metric expr %s for %s\n", pe->metric_expr, pe->metric_name);
 
                        if (!strstr(pe->metric_expr, "?")) {
-                               ret = __metricgroup__add_metric(events, group_list, pe, 1);
+                               ret = __metricgroup__add_metric(group_list,
+                                                               pe, 1);
                                if (ret)
                                        return ret;
                        } else {
@@ -564,13 +560,26 @@ static int metricgroup__add_metric(const char *metric, struct strbuf *events,
                                 */
 
                                for (j = 0; j < count; j++) {
-                                       ret = __metricgroup__add_metric(events, group_list, pe, j);
+                                       ret = __metricgroup__add_metric(
+                                               group_list, pe, j);
                                        if (ret)
                                                return ret;
                                }
                        }
                }
        }
+       list_for_each_entry(eg, group_list, nd) {
+               if (events->len > 0)
+                       strbuf_addf(events, ",");
+
+               if (eg->has_constraint) {
+                       metricgroup__add_metric_non_group(events,
+                                                         &eg->pctx);
+               } else {
+                       metricgroup__add_metric_weak_group(events,
+                                                          &eg->pctx);
+               }
+       }
        return 0;
 }