perf metricgroup: Split up metricgroup__print()
authorJohn Garry <john.garry@huawei.com>
Fri, 4 Dec 2020 11:10:13 +0000 (19:10 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 17 Dec 2020 17:36:17 +0000 (14:36 -0300)
To aid supporting system event metric groups, break up the function
metricgroup__print() into a part which iterates metrics and a part which
actually "prints" the metric.

No functional change intended.

Signed-off-by: John Garry <john.garry@huawei.com>
Acked-by: Kajol Jain <kjain@linux.ibm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Joakim Zhang <qiangqing.zhang@nxp.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Kim Phillips <kim.phillips@amd.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Shaokun Zhang <zhangshaokun@hisilicon.com>
Cc: Will Deacon <will@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linuxarm@huawei.com
Link: http://lore.kernel.org/lkml/1607080216-36968-8-git-send-email-john.garry@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/metricgroup.c

index b891607..4c6a686 100644 (file)
@@ -493,6 +493,72 @@ static void metricgroup__print_strlist(struct strlist *metrics, bool raw)
                putchar('\n');
 }
 
+static int metricgroup__print_pmu_event(struct pmu_event *pe,
+                                       bool metricgroups, char *filter,
+                                       bool raw, bool details,
+                                       struct rblist *groups,
+                                       struct strlist *metriclist)
+{
+       const char *g;
+       char *omg, *mg;
+
+       g = pe->metric_group;
+       if (!g && pe->metric_name) {
+               if (pe->name)
+                       return 0;
+               g = "No_group";
+       }
+
+       if (!g)
+               return 0;
+
+       mg = strdup(g);
+
+       if (!mg)
+               return -ENOMEM;
+       omg = mg;
+       while ((g = strsep(&mg, ";")) != NULL) {
+               struct mep *me;
+               char *s;
+
+               g = skip_spaces(g);
+               if (*g == 0)
+                       g = "No_group";
+               if (filter && !strstr(g, filter))
+                       continue;
+               if (raw)
+                       s = (char *)pe->metric_name;
+               else {
+                       if (asprintf(&s, "%s\n%*s%s]",
+                                    pe->metric_name, 8, "[", pe->desc) < 0)
+                               return -1;
+                       if (details) {
+                               if (asprintf(&s, "%s\n%*s%s]",
+                                            s, 8, "[", pe->metric_expr) < 0)
+                                       return -1;
+                       }
+               }
+
+               if (!s)
+                       continue;
+
+               if (!metricgroups) {
+                       strlist__add(metriclist, s);
+               } else {
+                       me = mep_lookup(groups, g);
+                       if (!me)
+                               continue;
+                       strlist__add(me->metrics, s);
+               }
+
+               if (!raw)
+                       free(s);
+       }
+       free(omg);
+
+       return 0;
+}
+
 void metricgroup__print(bool metrics, bool metricgroups, char *filter,
                        bool raw, bool details)
 {
@@ -517,66 +583,16 @@ void metricgroup__print(bool metrics, bool metricgroups, char *filter,
        groups.node_cmp = mep_cmp;
        groups.node_delete = mep_delete;
        for (i = 0; ; i++) {
-               const char *g;
                pe = &map->table[i];
 
                if (!pe->name && !pe->metric_group && !pe->metric_name)
                        break;
                if (!pe->metric_expr)
                        continue;
-               g = pe->metric_group;
-               if (!g && pe->metric_name) {
-                       if (pe->name)
-                               continue;
-                       g = "No_group";
-               }
-               if (g) {
-                       char *omg;
-                       char *mg = strdup(g);
-
-                       if (!mg)
-                               return;
-                       omg = mg;
-                       while ((g = strsep(&mg, ";")) != NULL) {
-                               struct mep *me;
-                               char *s;
-
-                               g = skip_spaces(g);
-                               if (*g == 0)
-                                       g = "No_group";
-                               if (filter && !strstr(g, filter))
-                                       continue;
-                               if (raw)
-                                       s = (char *)pe->metric_name;
-                               else {
-                                       if (asprintf(&s, "%s\n%*s%s]",
-                                                    pe->metric_name, 8, "[", pe->desc) < 0)
-                                               return;
-
-                                       if (details) {
-                                               if (asprintf(&s, "%s\n%*s%s]",
-                                                            s, 8, "[", pe->metric_expr) < 0)
-                                                       return;
-                                       }
-                               }
-
-                               if (!s)
-                                       continue;
-
-                               if (!metricgroups) {
-                                       strlist__add(metriclist, s);
-                               } else {
-                                       me = mep_lookup(&groups, g);
-                                       if (!me)
-                                               continue;
-                                       strlist__add(me->metrics, s);
-                               }
-
-                               if (!raw)
-                                       free(s);
-                       }
-                       free(omg);
-               }
+               if (metricgroup__print_pmu_event(pe, metricgroups, filter,
+                                                raw, details, &groups,
+                                                metriclist) < 0)
+                       return;
        }
 
        if (!filter || !rblist__empty(&groups)) {