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

perf stat: Use evsel->core.cpus to iterate cpus in BPF cgroup counters

If it mixes core and uncore events, each evsel would have different cpu map.
But it assumed they are same with evlist's all_cpus and accessed by the same
index. This resulted in a crash like below.

$ perf stat -a --bpf-counters --for-each_cgroup ^. -e cycles,imc/cas_count_read/ sleep 1
Segmentation fault

While it's not recommended to use uncore events for cgroup aggregation, it
should not crash.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Song Liu <songliubraving@fb.com>
Cc: bpf@vger.kernel.org
Link: https://lore.kernel.org/r/20220916184132.1161506-4-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Namhyung Kim and committed by
Arnaldo Carvalho de Melo
8a92605d 3da35231

+3 -3
+3 -3
tools/perf/util/bpf_counter_cgroup.c
··· 115 115 evsel->cgrp = NULL; 116 116 117 117 /* open single copy of the events w/o cgroup */ 118 - err = evsel__open_per_cpu(evsel, evlist->core.all_cpus, -1); 118 + err = evsel__open_per_cpu(evsel, evsel->core.cpus, -1); 119 119 if (err) { 120 120 pr_err("Failed to open first cgroup events\n"); 121 121 goto out; 122 122 } 123 123 124 124 map_fd = bpf_map__fd(skel->maps.events); 125 - perf_cpu_map__for_each_cpu(cpu, j, evlist->core.all_cpus) { 125 + perf_cpu_map__for_each_cpu(cpu, j, evsel->core.cpus) { 126 126 int fd = FD(evsel, j); 127 127 __u32 idx = evsel->core.idx * total_cpus + cpu.cpu; 128 128 ··· 269 269 goto out; 270 270 } 271 271 272 - perf_cpu_map__for_each_cpu(cpu, i, evlist->core.all_cpus) { 272 + perf_cpu_map__for_each_cpu(cpu, i, evsel->core.cpus) { 273 273 counts = perf_counts(evsel->counts, i, 0); 274 274 counts->val = values[cpu.cpu].counter; 275 275 counts->ena = values[cpu.cpu].enabled;