]> git.itanic.dy.fi Git - linux-stable/commitdiff
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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 15 Sep 2022 08:47:19 +0000 (10:47 +0200)
[ Upstream commit a9c1ecdabc4f2ef04ef5334b8deb3a5c5910136d ]

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>
Stable-dep-of: f0c86a2bae4f ("perf stat: Fix L2 Topdown metrics disappear for raw events")
Signed-off-by: Sasha Levin <sashal@kernel.org>
tools/perf/arch/x86/util/evlist.c
tools/perf/builtin-stat.c
tools/perf/util/evlist.c
tools/perf/util/evlist.h

index 68f681ad54c1e338afcd706828275289ee75016a..777bdf182a582bdce67e7b3969b22705c3567c53 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 5f0333a8acd8a2ea1ba04496508da8b55599f55f..5aacb7ed8c24a7a3fb51732a5a4157ad8b98bcb1 100644 (file)
@@ -1778,6 +1778,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;
@@ -1959,7 +1962,8 @@ static int add_default_attributes(void)
                        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 48af7d379d822881745393a0904b3e7589b02ae4..efa5f006b5c61e86f11b5a51b6fd148b8098ff51 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 1bde9ccf4e7da707cd3681dace86f027abf65add..129095c0fe6d3fae8e0aa2e6a7ae24d27fe70b9e 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);