mirror of
https://github.com/raspberrypi/linux.git
synced 2026-01-02 07:43:34 +00:00
On s390 using linux-next the test case:
87: perf record offcpu profiling tests
fails. The root cause is this command
# ./perf record --off-cpu -e dummy -- ./perf bench sched messaging -l 10
# Running 'sched/messaging' benchmark:
# 20 sender and receiver processes per group
# 10 groups == 400 processes run
Total time: 0.231 [sec]
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.077 MB perf.data (401 samples) ]
#
It does not generate 800+ sample entries, on s390 usually around
40[1-9], sometimes a few more, but never more than 450. The higher the
number of CPUs the lower the number of samples.
Looking at function chain:
bench_sched_messaging()
+--> group()
the senders and receiver threads are created. The senders and receivers
call function ready() which writes one bytes and wait for a reply using
poll system() call.
As context switches are counted, the function ready() will trigger a
context switch when no input data is available after the write system
call. The write system call does not trigger context switches when the
data size is small. And writing 1000 bytes (10 iterations with
100 bytes) is not much and certainly won't block.
The 400+ context switch on s390 occur when the some receiver/sender
threads call ready() and wait for the response from function
bench_sched_messaging() being kicked off.
Lower the number of expected context switches to 400 to succeed on s390.
Suggested-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Thomas Richter <tmricht@linux.ibm.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: Sumanth Korikkar <sumanthk@linux.ibm.com>
Cc: Sven Schnelle <svens@linux.ibm.com>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Co-developed-by: Ilya Leoshkevich <iii@linux.ibm.com>
Link: https://lore.kernel.org/r/20231106091627.2022530-1-tmricht@linux.ibm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
104 lines
2.1 KiB
Bash
Executable File
104 lines
2.1 KiB
Bash
Executable File
#!/bin/sh
|
|
# perf record offcpu profiling tests
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
set -e
|
|
|
|
err=0
|
|
perfdata=$(mktemp /tmp/__perf_test.perf.data.XXXXX)
|
|
|
|
cleanup() {
|
|
rm -f ${perfdata}
|
|
rm -f ${perfdata}.old
|
|
trap - EXIT TERM INT
|
|
}
|
|
|
|
trap_cleanup() {
|
|
cleanup
|
|
exit 1
|
|
}
|
|
trap trap_cleanup EXIT TERM INT
|
|
|
|
test_offcpu_priv() {
|
|
echo "Checking off-cpu privilege"
|
|
|
|
if [ "$(id -u)" != 0 ]
|
|
then
|
|
echo "off-cpu test [Skipped permission]"
|
|
err=2
|
|
return
|
|
fi
|
|
if perf version --build-options 2>&1 | grep HAVE_BPF_SKEL | grep -q OFF
|
|
then
|
|
echo "off-cpu test [Skipped missing BPF support]"
|
|
err=2
|
|
return
|
|
fi
|
|
}
|
|
|
|
test_offcpu_basic() {
|
|
echo "Basic off-cpu test"
|
|
|
|
if ! perf record --off-cpu -e dummy -o ${perfdata} sleep 1 2> /dev/null
|
|
then
|
|
echo "Basic off-cpu test [Failed record]"
|
|
err=1
|
|
return
|
|
fi
|
|
if ! perf evlist -i ${perfdata} | grep -q "offcpu-time"
|
|
then
|
|
echo "Basic off-cpu test [Failed no event]"
|
|
err=1
|
|
return
|
|
fi
|
|
if ! perf report -i ${perfdata} -q --percent-limit=90 | grep -E -q sleep
|
|
then
|
|
echo "Basic off-cpu test [Failed missing output]"
|
|
err=1
|
|
return
|
|
fi
|
|
echo "Basic off-cpu test [Success]"
|
|
}
|
|
|
|
test_offcpu_child() {
|
|
echo "Child task off-cpu test"
|
|
|
|
# perf bench sched messaging creates 400 processes
|
|
if ! perf record --off-cpu -e dummy -o ${perfdata} -- \
|
|
perf bench sched messaging -g 10 > /dev/null 2>&1
|
|
then
|
|
echo "Child task off-cpu test [Failed record]"
|
|
err=1
|
|
return
|
|
fi
|
|
if ! perf evlist -i ${perfdata} | grep -q "offcpu-time"
|
|
then
|
|
echo "Child task off-cpu test [Failed no event]"
|
|
err=1
|
|
return
|
|
fi
|
|
# each process waits at least for poll, so it should be more than 400 events
|
|
if ! perf report -i ${perfdata} -s comm -q -n -t ';' --percent-limit=90 | \
|
|
awk -F ";" '{ if (NF > 3 && int($3) < 400) exit 1; }'
|
|
then
|
|
echo "Child task off-cpu test [Failed invalid output]"
|
|
err=1
|
|
return
|
|
fi
|
|
echo "Child task off-cpu test [Success]"
|
|
}
|
|
|
|
|
|
test_offcpu_priv
|
|
|
|
if [ $err = 0 ]; then
|
|
test_offcpu_basic
|
|
fi
|
|
|
|
if [ $err = 0 ]; then
|
|
test_offcpu_child
|
|
fi
|
|
|
|
cleanup
|
|
exit $err
|