Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

libperf: Propagate maps only if necessary

The current code propagate evsel's cpu map settings to evlist when it's
added to an evlist. But the evlist->all_cpus and each evsel's cpus will
be updated in perf_evlist__set_maps() later. No need to do it before
evlist's cpus are set actually.

In fact it discards this intermediate all_cpus maps at the beginning
of perf_evlist__set_maps(). Let's not do this. It's only needed when
an evsel is added after the evlist cpu/thread maps are set.

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-3-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Namhyung Kim and committed by
Arnaldo Carvalho de Melo
7e2450bb 06b552ee

+5 -7
+4 -7
tools/lib/perf/evlist.c
··· 67 67 { 68 68 struct perf_evsel *evsel; 69 69 70 - /* Recomputing all_cpus, so start with a blank slate. */ 71 - perf_cpu_map__put(evlist->all_cpus); 72 - evlist->all_cpus = NULL; 70 + evlist->needs_map_propagation = true; 73 71 74 72 perf_evlist__for_each_evsel(evlist, evsel) 75 73 __perf_evlist__propagate_maps(evlist, evsel); ··· 79 81 evsel->idx = evlist->nr_entries; 80 82 list_add_tail(&evsel->node, &evlist->entries); 81 83 evlist->nr_entries += 1; 82 - __perf_evlist__propagate_maps(evlist, evsel); 84 + 85 + if (evlist->needs_map_propagation) 86 + __perf_evlist__propagate_maps(evlist, evsel); 83 87 } 84 88 85 89 void perf_evlist__remove(struct perf_evlist *evlist, ··· 176 176 perf_thread_map__put(evlist->threads); 177 177 evlist->threads = perf_thread_map__get(threads); 178 178 } 179 - 180 - if (!evlist->all_cpus && cpus) 181 - evlist->all_cpus = perf_cpu_map__get(cpus); 182 179 183 180 perf_evlist__propagate_maps(evlist); 184 181 }
+1
tools/lib/perf/include/internal/evlist.h
··· 19 19 int nr_entries; 20 20 int nr_groups; 21 21 bool has_user_cpus; 22 + bool needs_map_propagation; 22 23 /** 23 24 * The cpus passed from the command line or all online CPUs by 24 25 * default.