Skip to content

Commit 54b353a

Browse files
namhyungacmel
authored andcommitted
perf stat: Fix handling of --for-each-cgroup with --bpf-counters to match non BPF mode
The --for-each-cgroup can have the same cgroup multiple times, but this confuses BPF counters (since they have the same cgroup id), making only the last cgroup events to be counted. Let's check the cgroup name before adding a new entry to the cgroups list. Before: $ sudo ./perf stat -a --bpf-counters --for-each-cgroup /,/ sleep 1 Performance counter stats for 'system wide': <not counted> msec cpu-clock / <not counted> context-switches / <not counted> cpu-migrations / <not counted> page-faults / <not counted> cycles / <not counted> instructions / <not counted> branches / <not counted> branch-misses / 8,016.04 msec cpu-clock / # 7.998 CPUs utilized 6,152 context-switches / # 767.461 /sec 250 cpu-migrations / # 31.187 /sec 442 page-faults / # 55.139 /sec 613,111,487 cycles / # 0.076 GHz 280,599,604 instructions / # 0.46 insn per cycle 57,692,724 branches / # 7.197 M/sec 3,385,168 branch-misses / # 5.87% of all branches 1.002220125 seconds time elapsed After it becomes similar to the non-BPF mode: $ sudo ./perf stat -a --bpf-counters --for-each-cgroup /,/ sleep 1 Performance counter stats for 'system wide': 8,013.38 msec cpu-clock / # 7.998 CPUs utilized 6,859 context-switches / # 855.944 /sec 334 cpu-migrations / # 41.680 /sec 345 page-faults / # 43.053 /sec 782,326,119 cycles / # 0.098 GHz 471,645,724 instructions / # 0.60 insn per cycle 94,963,430 branches / # 11.851 M/sec 3,685,511 branch-misses / # 3.88% of all branches 1.001864539 seconds time elapsed Committer notes: As a reminder, to test with BPF counters one has to use BUILD_BPF_SKEL=1 in the make command line and have clang/llvm installed when building perf, otherwise the --bpf-counters option will not be available: # perf stat -a --bpf-counters --for-each-cgroup /,/ sleep 1 Error: unknown option `bpf-counters' Usage: perf stat [<options>] [<command>] -a, --all-cpus system-wide collection from all CPUs <SNIP> # Fixes: bb1c15b ("perf stat: Support regex pattern in --for-each-cgroup") Signed-off-by: Namhyung Kim <[email protected]> Tested-by: Arnaldo Carvalho de Melo <[email protected]> Cc: Adrian Hunter <[email protected]> Cc: [email protected] Cc: Ian Rogers <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Song Liu <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent 2d656b0 commit 54b353a

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

tools/perf/util/cgroup.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,19 @@ static int add_cgroup_name(const char *fpath, const struct stat *sb __maybe_unus
224224
return 0;
225225
}
226226

227+
static int check_and_add_cgroup_name(const char *fpath)
228+
{
229+
struct cgroup_name *cn;
230+
231+
list_for_each_entry(cn, &cgroup_list, list) {
232+
if (!strcmp(cn->name, fpath))
233+
return 0;
234+
}
235+
236+
/* pretend if it's added by ftw() */
237+
return add_cgroup_name(fpath, NULL, FTW_D, NULL);
238+
}
239+
227240
static void release_cgroup_list(void)
228241
{
229242
struct cgroup_name *cn;
@@ -242,7 +255,7 @@ static int list_cgroups(const char *str)
242255
struct cgroup_name *cn;
243256
char *s;
244257

245-
/* use given name as is - for testing purpose */
258+
/* use given name as is when no regex is given */
246259
for (;;) {
247260
p = strchr(str, ',');
248261
e = p ? p : eos;
@@ -253,13 +266,13 @@ static int list_cgroups(const char *str)
253266
s = strndup(str, e - str);
254267
if (!s)
255268
return -1;
256-
/* pretend if it's added by ftw() */
257-
ret = add_cgroup_name(s, NULL, FTW_D, NULL);
269+
270+
ret = check_and_add_cgroup_name(s);
258271
free(s);
259-
if (ret)
272+
if (ret < 0)
260273
return -1;
261274
} else {
262-
if (add_cgroup_name("", NULL, FTW_D, NULL) < 0)
275+
if (check_and_add_cgroup_name("/") < 0)
263276
return -1;
264277
}
265278

0 commit comments

Comments
 (0)