perf evlist: Always use arch_evlist__add_default_attrs()
authorKan Liang <kan.liang@linux.intel.com>
Thu, 21 Jul 2022 06:57:04 +0000 (14:57 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 29 Jul 2022 16:41:59 +0000 (13:41 -0300)
Current perf stat uses the evlist__add_default_attrs() to add the
generic default attrs, and uses arch_evlist__add_default_attrs() to add
the Arch specific default attrs, e.g., Topdown for x86.

It works well for the non-hybrid platforms. However, for a hybrid
platform, the hard code generic default attrs don't work.

Uses arch_evlist__add_default_attrs() to replace the
evlist__add_default_attrs(). The arch_evlist__add_default_attrs() is
modified to invoke the same __evlist__add_default_attrs() for the
generic default attrs. No functional change.

Add default_null_attrs[] to indicate the arch specific attrs.
No functional change for the arch specific default attrs either.

Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Acked-by: Ian Rogers <irogers@google.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220721065706.2886112-4-zhengjun.xing@linux.intel.com
Signed-off-by: Xing Zhengjun <zhengjun.xing@linux.intel.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/arch/x86/util/evlist.c
tools/perf/builtin-stat.c
tools/perf/util/evlist.c
tools/perf/util/evlist.h

index 68f681a..777bdf1 100644 (file)
@@ -8,8 +8,13 @@
 #define TOPDOWN_L1_EVENTS      "{slots,topdown-retiring,topdown-bad-spec,topdown-fe-bound,topdown-be-bound}"
 #define TOPDOWN_L2_EVENTS      "{slots,topdown-retiring,topdown-bad-spec,topdown-fe-bound,topdown-be-bound,topdown-heavy-ops,topdown-br-mispredict,topdown-fetch-lat,topdown-mem-bound}"
 
-int arch_evlist__add_default_attrs(struct evlist *evlist)
+int arch_evlist__add_default_attrs(struct evlist *evlist,
+                                  struct perf_event_attr *attrs,
+                                  size_t nr_attrs)
 {
+       if (nr_attrs)
+               return __evlist__add_default_attrs(evlist, attrs, nr_attrs);
+
        if (!pmu_have_event("cpu", "slots"))
                return 0;
 
index 86f838c..e8c639c 100644 (file)
@@ -1777,6 +1777,9 @@ static int add_default_attributes(void)
        (PERF_COUNT_HW_CACHE_OP_PREFETCH        <<  8) |
        (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)                          },
 };
+
+       struct perf_event_attr default_null_attrs[] = {};
+
        /* Set attrs if no event is selected and !null_run: */
        if (stat_config.null_run)
                return 0;
@@ -1958,7 +1961,8 @@ setup_metrics:
                        return -1;
 
                stat_config.topdown_level = TOPDOWN_MAX_LEVEL;
-               if (arch_evlist__add_default_attrs(evsel_list) < 0)
+               /* Platform specific attrs */
+               if (evlist__add_default_attrs(evsel_list, default_null_attrs) < 0)
                        return -1;
        }
 
index 64f5a80..0c97a2d 100644 (file)
@@ -342,9 +342,14 @@ int __evlist__add_default_attrs(struct evlist *evlist, struct perf_event_attr *a
        return evlist__add_attrs(evlist, attrs, nr_attrs);
 }
 
-__weak int arch_evlist__add_default_attrs(struct evlist *evlist __maybe_unused)
+__weak int arch_evlist__add_default_attrs(struct evlist *evlist,
+                                         struct perf_event_attr *attrs,
+                                         size_t nr_attrs)
 {
-       return 0;
+       if (!nr_attrs)
+               return 0;
+
+       return __evlist__add_default_attrs(evlist, attrs, nr_attrs);
 }
 
 struct evsel *evlist__find_tracepoint_by_id(struct evlist *evlist, int id)
index 1bde9cc..129095c 100644 (file)
@@ -107,10 +107,13 @@ static inline int evlist__add_default(struct evlist *evlist)
 int __evlist__add_default_attrs(struct evlist *evlist,
                                     struct perf_event_attr *attrs, size_t nr_attrs);
 
+int arch_evlist__add_default_attrs(struct evlist *evlist,
+                                  struct perf_event_attr *attrs,
+                                  size_t nr_attrs);
+
 #define evlist__add_default_attrs(evlist, array) \
-       __evlist__add_default_attrs(evlist, array, ARRAY_SIZE(array))
+       arch_evlist__add_default_attrs(evlist, array, ARRAY_SIZE(array))
 
-int arch_evlist__add_default_attrs(struct evlist *evlist);
 struct evsel *arch_evlist__leader(struct list_head *list);
 
 int evlist__add_dummy(struct evlist *evlist);