linux-yocto/tools/perf/tests/shell/stat_bpf_counters_cgrp.sh
Namhyung Kim a84260e314 perf test stat_bpf_counters_cgrp: Enhance perf stat cgroup BPF counter test
It has system-wide test and cpu-list test but the cpu-list test fails
sometimes.  It runs sleep command on CPU1 and measure both user.slice
and system.slice cgroups by default (on systemd-based systems).

But if the system was idle enough, sometime the system.slice gets no
count and it makes the test failing.  Maybe that's because it only looks
at the CPU1, let's add CPU0 to increase the chance it finds some tasks.

Fixes: 7901086014 ("perf test: Add a new test for perf stat cgroup BPF counter")
Reported-by: Arnaldo Carvalho de Melo <acme@kernel.org>
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: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: bpf@vger.kernel.org
Link: https://lore.kernel.org/r/20230825164152.165610-3-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2023-08-29 14:16:15 -03:00

80 lines
2.1 KiB
Bash
Executable File

#!/bin/sh
# perf stat --bpf-counters --for-each-cgroup test
# SPDX-License-Identifier: GPL-2.0
set -e
test_cgroups=
if [ "$1" = "-v" ]; then
verbose="1"
fi
# skip if --bpf-counters --for-each-cgroup is not supported
check_bpf_counter()
{
if ! perf stat -a --bpf-counters --for-each-cgroup / true > /dev/null 2>&1; then
if [ "${verbose}" = "1" ]; then
echo "Skipping: --bpf-counters --for-each-cgroup not supported"
perf --no-pager stat -a --bpf-counters --for-each-cgroup / true || true
fi
exit 2
fi
}
# find two cgroups to measure
find_cgroups()
{
# try usual systemd slices first
if [ -d /sys/fs/cgroup/system.slice ] && [ -d /sys/fs/cgroup/user.slice ]; then
test_cgroups="system.slice,user.slice"
return
fi
# try root and self cgroups
find_cgroups_self_cgrp=$(grep perf_event /proc/self/cgroup | cut -d: -f3)
if [ -z ${find_cgroups_self_cgrp} ]; then
# cgroup v2 doesn't specify perf_event
find_cgroups_self_cgrp=$(grep ^0: /proc/self/cgroup | cut -d: -f3)
fi
if [ -z ${find_cgroups_self_cgrp} ]; then
test_cgroups="/"
else
test_cgroups="/,${find_cgroups_self_cgrp}"
fi
}
# As cgroup events are cpu-wide, we cannot simply compare the result.
# Just check if it runs without failure and has non-zero results.
check_system_wide_counted()
{
check_system_wide_counted_output=$(perf stat -a --bpf-counters --for-each-cgroup ${test_cgroups} -e cpu-clock -x, sleep 1 2>&1)
if echo ${check_system_wide_counted_output} | grep -q -F "<not "; then
echo "Some system-wide events are not counted"
if [ "${verbose}" = "1" ]; then
echo ${check_system_wide_counted_output}
fi
exit 1
fi
}
check_cpu_list_counted()
{
check_cpu_list_counted_output=$(perf stat -C 0,1 --bpf-counters --for-each-cgroup ${test_cgroups} -e cpu-clock -x, taskset -c 1 sleep 1 2>&1)
if echo ${check_cpu_list_counted_output} | grep -q -F "<not "; then
echo "Some CPU events are not counted"
if [ "${verbose}" = "1" ]; then
echo ${check_cpu_list_counted_output}
fi
exit 1
fi
}
check_bpf_counter
find_cgroups
check_system_wide_counted
check_cpu_list_counted
exit 0