mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
tracing/selftest: Add test to better test subops filtering of function graph
A bug was discovered that showed the accounting of the subops of the ftrace_ops filtering was incorrect. Add a new test to better test the filtering. This test creates two instances, where it will add various filters to both the set_ftrace_filter and the set_ftrace_notrace files and enable function_graph. Then it looks into the enabled_functions file to make sure that the filters are behaving correctly. Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Shuah Khan <skhan@linuxfoundation.org> Cc: Andy Chiu <andybnac@gmail.com> Link: https://lore.kernel.org/20250409152720.380778379@goodmis.org Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
This commit is contained in:
committed by
Steven Rostedt (Google)
parent
0ae6b8ce20
commit
a1fc89d409
@@ -0,0 +1,177 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# description: ftrace - function graph filters
|
||||
# requires: set_ftrace_filter function_graph:tracer
|
||||
|
||||
# Make sure that function graph filtering works
|
||||
|
||||
INSTANCE1="instances/test1_$$"
|
||||
INSTANCE2="instances/test2_$$"
|
||||
|
||||
WD=`pwd`
|
||||
|
||||
do_reset() {
|
||||
cd $WD
|
||||
if [ -d $INSTANCE1 ]; then
|
||||
echo nop > $INSTANCE1/current_tracer
|
||||
rmdir $INSTANCE1
|
||||
fi
|
||||
if [ -d $INSTANCE2 ]; then
|
||||
echo nop > $INSTANCE2/current_tracer
|
||||
rmdir $INSTANCE2
|
||||
fi
|
||||
}
|
||||
|
||||
mkdir $INSTANCE1
|
||||
if ! grep -q function_graph $INSTANCE1/available_tracers; then
|
||||
echo "function_graph not allowed with instances"
|
||||
rmdir $INSTANCE1
|
||||
exit_unsupported
|
||||
fi
|
||||
|
||||
mkdir $INSTANCE2
|
||||
|
||||
fail() { # msg
|
||||
do_reset
|
||||
echo $1
|
||||
exit_fail
|
||||
}
|
||||
|
||||
disable_tracing
|
||||
clear_trace
|
||||
|
||||
function_count() {
|
||||
search=$1
|
||||
vsearch=$2
|
||||
|
||||
if [ -z "$search" ]; then
|
||||
cat enabled_functions | wc -l
|
||||
elif [ -z "$vsearch" ]; then
|
||||
grep $search enabled_functions | wc -l
|
||||
else
|
||||
grep $search enabled_functions | grep $vsearch| wc -l
|
||||
fi
|
||||
}
|
||||
|
||||
set_fgraph() {
|
||||
instance=$1
|
||||
filter="$2"
|
||||
notrace="$3"
|
||||
|
||||
echo "$filter" > $instance/set_ftrace_filter
|
||||
echo "$notrace" > $instance/set_ftrace_notrace
|
||||
echo function_graph > $instance/current_tracer
|
||||
}
|
||||
|
||||
check_functions() {
|
||||
orig_cnt=$1
|
||||
test=$2
|
||||
|
||||
cnt=`function_count $test`
|
||||
if [ $cnt -gt $orig_cnt ]; then
|
||||
fail
|
||||
fi
|
||||
}
|
||||
|
||||
check_cnt() {
|
||||
orig_cnt=$1
|
||||
search=$2
|
||||
vsearch=$3
|
||||
|
||||
cnt=`function_count $search $vsearch`
|
||||
if [ $cnt -gt $orig_cnt ]; then
|
||||
fail
|
||||
fi
|
||||
}
|
||||
|
||||
reset_graph() {
|
||||
instance=$1
|
||||
echo nop > $instance/current_tracer
|
||||
}
|
||||
|
||||
# get any functions that were enabled before the test
|
||||
total_cnt=`function_count`
|
||||
sched_cnt=`function_count sched`
|
||||
lock_cnt=`function_count lock`
|
||||
time_cnt=`function_count time`
|
||||
clock_cnt=`function_count clock`
|
||||
locks_clock_cnt=`function_count locks clock`
|
||||
clock_locks_cnt=`function_count clock locks`
|
||||
|
||||
# Trace functions with "sched" but not "time"
|
||||
set_fgraph $INSTANCE1 '*sched*' '*time*'
|
||||
|
||||
# Make sure "time" isn't listed
|
||||
check_functions $time_cnt 'time'
|
||||
instance1_cnt=`function_count`
|
||||
|
||||
# Trace functions with "lock" but not "clock"
|
||||
set_fgraph $INSTANCE2 '*lock*' '*clock*'
|
||||
instance1_2_cnt=`function_count`
|
||||
|
||||
# Turn off the first instance
|
||||
reset_graph $INSTANCE1
|
||||
|
||||
# The second instance doesn't trace "clock" functions
|
||||
check_functions $clock_cnt 'clock'
|
||||
instance2_cnt=`function_count`
|
||||
|
||||
# Start from a clean slate
|
||||
reset_graph $INSTANCE2
|
||||
check_functions $total_cnt
|
||||
|
||||
# Trace functions with "lock" but not "clock"
|
||||
set_fgraph $INSTANCE2 '*lock*' '*clock*'
|
||||
|
||||
# This should match the last time instance 2 was by itself
|
||||
cnt=`function_count`
|
||||
if [ $instance2_cnt -ne $cnt ]; then
|
||||
fail
|
||||
fi
|
||||
|
||||
# And it should not be tracing "clock" functions
|
||||
check_functions $clock_cnt 'clock'
|
||||
|
||||
# Trace functions with "sched" but not "time"
|
||||
set_fgraph $INSTANCE1 '*sched*' '*time*'
|
||||
|
||||
# This should match the last time both instances were enabled
|
||||
cnt=`function_count`
|
||||
if [ $instance1_2_cnt -ne $cnt ]; then
|
||||
fail
|
||||
fi
|
||||
|
||||
# Turn off the second instance
|
||||
reset_graph $INSTANCE2
|
||||
|
||||
# This should match the last time instance 1 was by itself
|
||||
cnt=`function_count`
|
||||
if [ $instance1_cnt -ne $cnt ]; then
|
||||
fail
|
||||
fi
|
||||
|
||||
# And it should not be tracing "time" functions
|
||||
check_functions $time_cnt 'time'
|
||||
|
||||
# Start from a clean slate
|
||||
reset_graph $INSTANCE1
|
||||
check_functions $total_cnt
|
||||
|
||||
# Enable all functions but those that have "locks"
|
||||
set_fgraph $INSTANCE1 '' '*locks*'
|
||||
|
||||
# Enable all functions but those that have "clock"
|
||||
set_fgraph $INSTANCE2 '' '*clock*'
|
||||
|
||||
# If a function has "locks" it should not have "clock"
|
||||
check_cnt $locks_clock_cnt locks clock
|
||||
|
||||
# If a function has "clock" it should not have "locks"
|
||||
check_cnt $clock_locks_cnt clock locks
|
||||
|
||||
reset_graph $INSTANCE1
|
||||
reset_graph $INSTANCE2
|
||||
|
||||
do_reset
|
||||
|
||||
exit 0
|
||||
Reference in New Issue
Block a user