perf metric: Add macros for iterating map events
authorJiri Olsa <jolsa@kernel.org>
Sun, 19 Jul 2020 18:13:06 +0000 (20:13 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 30 Jul 2020 10:01:49 +0000 (07:01 -0300)
Adding following macros to iterate events and metric:

  map_for_each_event(__pe, __idx, __map)
    - iterates over all pmu_events_map events

  map_for_each_metric(__pe, __idx, __map, __metric)
    - iterates over all metrics that match __metric argument

and use it in metricgroup__add_metric function. Macros will be be used
from other places in following changes.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Reviewed-by: Kajol Jain <kjain@linux.ibm.com>
Acked-by: Ian Rogers <irogers@google.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: John Garry <john.garry@huawei.com>
Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Clarke <pc@us.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lore.kernel.org/lkml/20200719181320.785305-6-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/metricgroup.c

index df0356e..b37008f 100644 (file)
@@ -614,6 +614,17 @@ static int __metricgroup__add_metric(struct list_head *group_list,
        return 0;
 }
 
+#define map_for_each_event(__pe, __idx, __map)                         \
+       for (__idx = 0, __pe = &__map->table[__idx];                    \
+            __pe->name || __pe->metric_group || __pe->metric_name;     \
+            __pe = &__map->table[++__idx])
+
+#define map_for_each_metric(__pe, __idx, __map, __metric)              \
+       map_for_each_event(__pe, __idx, __map)                          \
+               if (__pe->metric_expr &&                                \
+                   (match_metric(__pe->metric_group, __metric) ||      \
+                    match_metric(__pe->metric_name, __metric)))
+
 static int metricgroup__add_metric(const char *metric, bool metric_no_group,
                                   struct strbuf *events,
                                   struct list_head *group_list,
@@ -624,49 +635,41 @@ static int metricgroup__add_metric(const char *metric, bool metric_no_group,
        int i, ret;
        bool has_match = false;
 
-       for (i = 0; ; i++) {
-               pe = &map->table[i];
-
-               if (!pe->name && !pe->metric_group && !pe->metric_name) {
-                       /* End of pmu events. */
-                       if (!has_match)
-                               return -EINVAL;
-                       break;
-               }
-               if (!pe->metric_expr)
-                       continue;
-               if (match_metric(pe->metric_group, metric) ||
-                   match_metric(pe->metric_name, metric)) {
-                       has_match = true;
-                       pr_debug("metric expr %s for %s\n", pe->metric_expr, pe->metric_name);
-
-                       if (!strstr(pe->metric_expr, "?")) {
-                               ret = __metricgroup__add_metric(group_list,
-                                                               pe,
-                                                               metric_no_group,
-                                                               1);
-                               if (ret)
-                                       return ret;
-                       } else {
-                               int j, count;
+       map_for_each_metric(pe, i, map, metric) {
+               pr_debug("metric expr %s for %s\n", pe->metric_expr, pe->metric_name);
+               has_match = true;
+
+               if (!strstr(pe->metric_expr, "?")) {
+                       ret = __metricgroup__add_metric(group_list,
+                                                       pe,
+                                                       metric_no_group,
+                                                       1);
+                       if (ret)
+                               return ret;
+               } else {
+                       int j, count;
 
-                               count = arch_get_runtimeparam();
+                       count = arch_get_runtimeparam();
 
-                               /* This loop is added to create multiple
-                                * events depend on count value and add
-                                * those events to group_list.
-                                */
+                       /* This loop is added to create multiple
+                        * events depend on count value and add
+                        * those events to group_list.
+                        */
 
-                               for (j = 0; j < count; j++) {
-                                       ret = __metricgroup__add_metric(
-                                               group_list, pe,
-                                               metric_no_group, j);
-                                       if (ret)
-                                               return ret;
-                               }
+                       for (j = 0; j < count; j++) {
+                               ret = __metricgroup__add_metric(
+                                       group_list, pe,
+                                       metric_no_group, j);
+                               if (ret)
+                                       return ret;
                        }
                }
        }
+
+       /* End of pmu events. */
+       if (!has_match)
+               return -EINVAL;
+
        list_for_each_entry(eg, group_list, nd) {
                if (events->len > 0)
                        strbuf_addf(events, ",");