mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-08-21 16:31:14 +02:00

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>
80 lines
2.1 KiB
Bash
Executable File
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
|