libperf: Populate system-wide evsel maps
authorNamhyung Kim <namhyung@kernel.org>
Mon, 3 Oct 2022 20:46:43 +0000 (13:46 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 6 Oct 2022 11:03:53 +0000 (08:03 -0300)
Setting proper cpu and thread maps for system wide evsels regardless of
user requested cpu in __perf_evlist__propagate_maps().  Those evsels
need to be active on all cpus always.  Do it in the libperf so that we
can guarantee it has proper maps.

Reviewed-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20221003204647.1481128-2-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/lib/perf/evlist.c

index 0e7347d1583dcbb69ab5fe8a8298fea7d5f1595f..19eaea99aa4f12e027e5a7d8def27c2e31f6e3db 100644 (file)
@@ -40,11 +40,11 @@ static void __perf_evlist__propagate_maps(struct perf_evlist *evlist,
         * We already have cpus for evsel (via PMU sysfs) so
         * keep it, if there's no target cpu list defined.
         */
-       if (!evsel->own_cpus ||
-           (!evsel->system_wide && evlist->has_user_cpus) ||
-           (!evsel->system_wide &&
-            !evsel->requires_cpu &&
-            perf_cpu_map__empty(evlist->user_requested_cpus))) {
+       if (evsel->system_wide) {
+               perf_cpu_map__put(evsel->cpus);
+               evsel->cpus = perf_cpu_map__new(NULL);
+       } else if (!evsel->own_cpus || evlist->has_user_cpus ||
+                  (!evsel->requires_cpu && perf_cpu_map__empty(evlist->user_requested_cpus))) {
                perf_cpu_map__put(evsel->cpus);
                evsel->cpus = perf_cpu_map__get(evlist->user_requested_cpus);
        } else if (evsel->cpus != evsel->own_cpus) {
@@ -52,7 +52,10 @@ static void __perf_evlist__propagate_maps(struct perf_evlist *evlist,
                evsel->cpus = perf_cpu_map__get(evsel->own_cpus);
        }
 
-       if (!evsel->system_wide) {
+       if (evsel->system_wide) {
+               perf_thread_map__put(evsel->threads);
+               evsel->threads = perf_thread_map__new_dummy();
+       } else {
                perf_thread_map__put(evsel->threads);
                evsel->threads = perf_thread_map__get(evlist->threads);
        }