mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-08-09 06:14:34 +02:00
Currently trigger-hist-poll.tc uses sched_process_free to test the polling of the histogram file. The way it does that is to run sleep, then execute the poll.c code that polls on the sched_process_free for up to 4 seconds to test that when sleep triggers the sched_process_free trace event, it will update the histogram and wake the poll.c code up. The issue is that sched_process_free trace event is called by delayed_put_task_struct() which is called after a RCU grace period has ended. If CONFIG_RCU_LAZY is enabled, RCU callbacks are batched together and do not execute right away. This causes the delayed_put_task_struct() to be called after the poll.c function finishes and it will report an error that it did not wake up on the event. That's because the event didn't trigger during its wait time. Use sched_process_exit instead, which is called when a process exits and doesn't depend on RCU callbacks that may be delayed. Link: https://lore.kernel.org/r/20260708163436.058cc3df@gandalf.local.home Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
75 lines
1.5 KiB
Bash
75 lines
1.5 KiB
Bash
#!/bin/sh
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
# description: event trigger - test poll wait on histogram
|
|
# requires: set_event events/sched/sched_process_exit/trigger events/sched/sched_process_exit/hist
|
|
# flags: instance
|
|
|
|
POLL=${FTRACETEST_ROOT}/poll
|
|
|
|
if [ ! -x ${POLL} ]; then
|
|
echo "poll program is not compiled!"
|
|
exit_unresolved
|
|
fi
|
|
|
|
EVENT=events/sched/sched_process_exit/
|
|
|
|
# Check poll ops is supported. Before implementing poll on hist file, it
|
|
# returns soon with POLLIN | POLLOUT, but not POLLPRI.
|
|
|
|
# This must wait >1 sec and return 1 (timeout).
|
|
set +e
|
|
${POLL} -I -t 1000 ${EVENT}/hist
|
|
ret=$?
|
|
set -e
|
|
if [ ${ret} != 1 ]; then
|
|
echo "poll on hist file is not supported"
|
|
exit_unsupported
|
|
fi
|
|
|
|
# Test POLLIN
|
|
echo > trace
|
|
echo 'hist:key=comm if comm =="sleep"' > ${EVENT}/trigger
|
|
echo 1 > ${EVENT}/enable
|
|
|
|
# This sleep command will exit after 2 seconds.
|
|
sleep 2 &
|
|
BGPID=$!
|
|
# if timeout happens, poll returns 1.
|
|
${POLL} -I -t 4000 ${EVENT}/hist
|
|
echo 0 > tracing_on
|
|
|
|
if [ -d /proc/${BGPID} ]; then
|
|
echo "poll exits too soon"
|
|
kill -KILL ${BGPID} ||:
|
|
exit_fail
|
|
fi
|
|
|
|
if ! grep -qw "sleep" trace; then
|
|
echo "poll exits before event happens"
|
|
exit_fail
|
|
fi
|
|
|
|
# Test POLLPRI
|
|
echo > trace
|
|
echo 1 > tracing_on
|
|
|
|
# This sleep command will exit after 2 seconds.
|
|
sleep 2 &
|
|
BGPID=$!
|
|
# if timeout happens, poll returns 1.
|
|
${POLL} -P -t 4000 ${EVENT}/hist
|
|
echo 0 > tracing_on
|
|
|
|
if [ -d /proc/${BGPID} ]; then
|
|
echo "poll exits too soon"
|
|
kill -KILL ${BGPID} ||:
|
|
exit_fail
|
|
fi
|
|
|
|
if ! grep -qw "sleep" trace; then
|
|
echo "poll exits before event happens"
|
|
exit_fail
|
|
fi
|
|
|
|
exit_pass
|