perf evlist: Add evlist__findnew_tracking_event() helper
authorYang Jihong <yangjihong1@huawei.com>
Mon, 4 Sep 2023 02:33:36 +0000 (02:33 +0000)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 12 Sep 2023 20:31:32 +0000 (17:31 -0300)
Currently, intel-bts, intel-pt, and arm-spe may add tracking event to the
evlist. We may need to search for the tracking event for some settings.

Therefore, add evlist__findnew_tracking_event() helper.

If system_wide is true, evlist__findnew_tracking_event() set the cpu map
of the evsel to all online CPUs.

Signed-off-by: Yang Jihong <yangjihong1@huawei.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Tested-by: Ravi Bangoria <ravi.bangoria@amd.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Anshuman Khandual <anshuman.khandual@arm.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Richter <tmricht@linux.ibm.com>
Link: https://lore.kernel.org/r/20230904023340.12707-3-yangjihong1@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-record.c
tools/perf/util/evlist.c
tools/perf/util/evlist.h

index 34bb31f..12edad8 100644 (file)
@@ -1293,14 +1293,9 @@ static int record__open(struct record *rec)
         */
        if (opts->target.initial_delay || target__has_cpu(&opts->target) ||
            perf_pmus__num_core_pmus() > 1) {
-               pos = evlist__get_tracking_event(evlist);
-               if (!evsel__is_dummy_event(pos)) {
-                       /* Set up dummy event. */
-                       if (evlist__add_dummy(evlist))
-                               return -ENOMEM;
-                       pos = evlist__last(evlist);
-                       evlist__set_tracking_event(evlist, pos);
-               }
+               pos = evlist__findnew_tracking_event(evlist, false);
+               if (!pos)
+                       return -ENOMEM;
 
                /*
                 * Enable the dummy event when the process is forked for
index 7ef43f7..25c3ebe 100644 (file)
@@ -1694,6 +1694,24 @@ void evlist__set_tracking_event(struct evlist *evlist, struct evsel *tracking_ev
        tracking_evsel->tracking = true;
 }
 
+struct evsel *evlist__findnew_tracking_event(struct evlist *evlist, bool system_wide)
+{
+       struct evsel *evsel;
+
+       evsel = evlist__get_tracking_event(evlist);
+       if (!evsel__is_dummy_event(evsel)) {
+               evsel = evlist__add_aux_dummy(evlist, system_wide);
+               if (!evsel)
+                       return NULL;
+
+               evlist__set_tracking_event(evlist, evsel);
+       } else if (system_wide) {
+               perf_evlist__go_system_wide(&evlist->core, &evsel->core);
+       }
+
+       return evsel;
+}
+
 struct evsel *evlist__find_evsel_by_str(struct evlist *evlist, const char *str)
 {
        struct evsel *evsel;
index 664c6bf..98e7ddb 100644 (file)
@@ -387,6 +387,7 @@ bool evlist_cpu_iterator__end(const struct evlist_cpu_iterator *evlist_cpu_itr);
 
 struct evsel *evlist__get_tracking_event(struct evlist *evlist);
 void evlist__set_tracking_event(struct evlist *evlist, struct evsel *tracking_evsel);
+struct evsel *evlist__findnew_tracking_event(struct evlist *evlist, bool system_wide);
 
 struct evsel *evlist__find_evsel_by_str(struct evlist *evlist, const char *str);