mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-28 23:24:50 +00:00
Updates for the ftrace self tests:
o Added kprobes on ftrace testcase o Sort test cases o Add file to hold helper functions o Use logfile name supported by busybox's mktemp o Clear trace buffer after running kprobe test o Fix show descriptions when run on dash shell o Add --verbose option for showing echo output -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJUhbSvAAoJEEjnJuOKh9ldB84H+gNuE2PPvsxmgSxFP0bdo+Uw k/8C2QBU6xLXZFZvqXnH7P0gLP2OIjpOBOTKt+yjkB/Elm+XnMVV1Xy+k7VLBiMD g+DRoIcpJL2dOy/D8t/P4SjVNXt4Btwxf/tCTabbubLc+aBmvkEG4DL2Vk/Xl5+Y XH1dBgYvI9irAxgnYpBnPlN7WIWg1+WCshdOtqkNGRuyJ1G9gn0VlxGmNF7B+0ye cjFj19loPMGzmYBDgGCa9ypQHEP1F97t+WUEDrwCZsXLtaA7Z4bumXTrxKQWsmdT bDZQTEFcQ9EYQGvqbaz+nHb94P8cyFrSNvSiAAqhuc2ZqigYWUYDEvFjYxSSGAE= =eiD2 -----END PGP SIGNATURE----- Merge tag 'ftracetest-3.19' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace Pull ftrace self-test updates from Steven Rostedt: "Updates for the ftrace self tests: - Added kprobes on ftrace testcase - Sort test cases - Add file to hold helper functions - Use logfile name supported by busybox's mktemp - Clear trace buffer after running kprobe test - Fix show descriptions when run on dash shell - Add --verbose option for showing echo output" * tag 'ftracetest-3.19' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: ftracetest: Add --verbose option for showing echo output ftracetest: Fix to show descriptions on dash ftracetest: Add basic event tracing test cases ftracetest: Clear trace buffer after running kprobe testcases ftracetest: Use logfile name supported by busybox's mktemp ftracetest: Add a couple of ftrace test cases ftracetest: Add functions file that holds helper functions ftracetest: Sort testcases ftracetest: Add kprobes on ftrace testcase
This commit is contained in:
commit
c32809521d
14 changed files with 484 additions and 13 deletions
|
@ -13,6 +13,7 @@ echo "Usage: ftracetest [options] [testcase(s)] [testcase-directory(s)]"
|
||||||
echo " Options:"
|
echo " Options:"
|
||||||
echo " -h|--help Show help message"
|
echo " -h|--help Show help message"
|
||||||
echo " -k|--keep Keep passed test logs"
|
echo " -k|--keep Keep passed test logs"
|
||||||
|
echo " -v|--verbose Show all stdout messages in testcases"
|
||||||
echo " -d|--debug Debug mode (trace all shell commands)"
|
echo " -d|--debug Debug mode (trace all shell commands)"
|
||||||
exit $1
|
exit $1
|
||||||
}
|
}
|
||||||
|
@ -37,7 +38,7 @@ abspath() {
|
||||||
}
|
}
|
||||||
|
|
||||||
find_testcases() { #directory
|
find_testcases() { #directory
|
||||||
echo `find $1 -name \*.tc`
|
echo `find $1 -name \*.tc | sort`
|
||||||
}
|
}
|
||||||
|
|
||||||
parse_opts() { # opts
|
parse_opts() { # opts
|
||||||
|
@ -53,6 +54,10 @@ parse_opts() { # opts
|
||||||
KEEP_LOG=1
|
KEEP_LOG=1
|
||||||
shift 1
|
shift 1
|
||||||
;;
|
;;
|
||||||
|
--verbose|-v)
|
||||||
|
VERBOSE=1
|
||||||
|
shift 1
|
||||||
|
;;
|
||||||
--debug|-d)
|
--debug|-d)
|
||||||
DEBUG=1
|
DEBUG=1
|
||||||
shift 1
|
shift 1
|
||||||
|
@ -90,6 +95,7 @@ TEST_CASES=`find_testcases $TEST_DIR`
|
||||||
LOG_DIR=$TOP_DIR/logs/`date +%Y%m%d-%H%M%S`/
|
LOG_DIR=$TOP_DIR/logs/`date +%Y%m%d-%H%M%S`/
|
||||||
KEEP_LOG=0
|
KEEP_LOG=0
|
||||||
DEBUG=0
|
DEBUG=0
|
||||||
|
VERBOSE=0
|
||||||
# Parse command-line options
|
# Parse command-line options
|
||||||
parse_opts $*
|
parse_opts $*
|
||||||
|
|
||||||
|
@ -135,15 +141,12 @@ TOTAL_RESULT=0
|
||||||
CASENO=0
|
CASENO=0
|
||||||
testcase() { # testfile
|
testcase() { # testfile
|
||||||
CASENO=$((CASENO+1))
|
CASENO=$((CASENO+1))
|
||||||
prlog -n "[$CASENO]"`grep "^#[ \t]*description:" $1 | cut -f2 -d:`
|
desc=`grep "^#[ \t]*description:" $1 | cut -f2 -d:`
|
||||||
|
prlog -n "[$CASENO]$desc"
|
||||||
}
|
}
|
||||||
|
|
||||||
eval_result() { # retval sigval
|
eval_result() { # sigval
|
||||||
local retval=$2
|
case $1 in
|
||||||
if [ $2 -eq 0 ]; then
|
|
||||||
test $1 -ne 0 && retval=$FAIL
|
|
||||||
fi
|
|
||||||
case $retval in
|
|
||||||
$PASS)
|
$PASS)
|
||||||
prlog " [PASS]"
|
prlog " [PASS]"
|
||||||
PASSED_CASES="$PASSED_CASES $CASENO"
|
PASSED_CASES="$PASSED_CASES $CASENO"
|
||||||
|
@ -187,6 +190,9 @@ SIG_RESULT=
|
||||||
SIG_BASE=36 # Use realtime signals
|
SIG_BASE=36 # Use realtime signals
|
||||||
SIG_PID=$$
|
SIG_PID=$$
|
||||||
|
|
||||||
|
SIG_FAIL=$((SIG_BASE + FAIL))
|
||||||
|
trap 'SIG_RESULT=$FAIL' $SIG_FAIL
|
||||||
|
|
||||||
SIG_UNRESOLVED=$((SIG_BASE + UNRESOLVED))
|
SIG_UNRESOLVED=$((SIG_BASE + UNRESOLVED))
|
||||||
exit_unresolved () {
|
exit_unresolved () {
|
||||||
kill -s $SIG_UNRESOLVED $SIG_PID
|
kill -s $SIG_UNRESOLVED $SIG_PID
|
||||||
|
@ -215,17 +221,25 @@ exit_xfail () {
|
||||||
}
|
}
|
||||||
trap 'SIG_RESULT=$XFAIL' $SIG_XFAIL
|
trap 'SIG_RESULT=$XFAIL' $SIG_XFAIL
|
||||||
|
|
||||||
|
__run_test() { # testfile
|
||||||
|
# setup PID and PPID, $$ is not updated.
|
||||||
|
(cd $TRACING_DIR; read PID _ < /proc/self/stat ; set -e; set -x; . $1)
|
||||||
|
[ $? -ne 0 ] && kill -s $SIG_FAIL $SIG_PID
|
||||||
|
}
|
||||||
|
|
||||||
# Run one test case
|
# Run one test case
|
||||||
run_test() { # testfile
|
run_test() { # testfile
|
||||||
local testname=`basename $1`
|
local testname=`basename $1`
|
||||||
local testlog=`mktemp --tmpdir=$LOG_DIR ${testname}-XXXXXX.log`
|
local testlog=`mktemp $LOG_DIR/${testname}-log.XXXXXX`
|
||||||
testcase $1
|
testcase $1
|
||||||
echo "execute: "$1 > $testlog
|
echo "execute: "$1 > $testlog
|
||||||
SIG_RESULT=0
|
SIG_RESULT=0
|
||||||
# setup PID and PPID, $$ is not updated.
|
if [ $VERBOSE -ne 0 ]; then
|
||||||
(cd $TRACING_DIR; read PID _ < /proc/self/stat ;
|
__run_test $1 2>> $testlog | tee -a $testlog
|
||||||
set -e; set -x; . $1) >> $testlog 2>&1
|
else
|
||||||
eval_result $? $SIG_RESULT
|
__run_test $1 >> $testlog 2>&1
|
||||||
|
fi
|
||||||
|
eval_result $SIG_RESULT
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
# Remove test log if the test was done as it was expected.
|
# Remove test log if the test was done as it was expected.
|
||||||
[ $KEEP_LOG -eq 0 ] && rm $testlog
|
[ $KEEP_LOG -eq 0 ] && rm $testlog
|
||||||
|
@ -235,6 +249,9 @@ run_test() { # testfile
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# load in the helper functions
|
||||||
|
. $TEST_DIR/functions
|
||||||
|
|
||||||
# Main loop
|
# Main loop
|
||||||
for t in $TEST_CASES; do
|
for t in $TEST_CASES; do
|
||||||
run_test $t
|
run_test $t
|
||||||
|
|
5
tools/testing/selftests/ftrace/test.d/00basic/basic4.tc
Normal file
5
tools/testing/selftests/ftrace/test.d/00basic/basic4.tc
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# description: Basic event tracing check
|
||||||
|
test -f available_events -a -f set_event -a -d events
|
||||||
|
# check scheduler events are available
|
||||||
|
grep -q sched available_events && exit 0 || exit -1
|
53
tools/testing/selftests/ftrace/test.d/event/event-enable.tc
Normal file
53
tools/testing/selftests/ftrace/test.d/event/event-enable.tc
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# description: event tracing - enable/disable with event level files
|
||||||
|
|
||||||
|
do_reset() {
|
||||||
|
echo > set_event
|
||||||
|
clear_trace
|
||||||
|
}
|
||||||
|
|
||||||
|
fail() { #msg
|
||||||
|
do_reset
|
||||||
|
echo $1
|
||||||
|
exit -1
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ ! -f set_event -o ! -d events/sched ]; then
|
||||||
|
echo "event tracing is not supported"
|
||||||
|
exit_unsupported
|
||||||
|
fi
|
||||||
|
|
||||||
|
reset_tracer
|
||||||
|
do_reset
|
||||||
|
|
||||||
|
echo 'sched:sched_switch' > set_event
|
||||||
|
usleep 1
|
||||||
|
|
||||||
|
count=`cat trace | grep sched_switch | wc -l`
|
||||||
|
if [ $count -eq 0 ]; then
|
||||||
|
fail "sched_switch events are not recorded"
|
||||||
|
fi
|
||||||
|
|
||||||
|
do_reset
|
||||||
|
|
||||||
|
echo 1 > events/sched/sched_switch/enable
|
||||||
|
usleep 1
|
||||||
|
|
||||||
|
count=`cat trace | grep sched_switch | wc -l`
|
||||||
|
if [ $count -eq 0 ]; then
|
||||||
|
fail "sched_switch events are not recorded"
|
||||||
|
fi
|
||||||
|
|
||||||
|
do_reset
|
||||||
|
|
||||||
|
echo 0 > events/sched/sched_switch/enable
|
||||||
|
usleep 1
|
||||||
|
|
||||||
|
count=`cat trace | grep sched_switch | wc -l`
|
||||||
|
if [ $count -ne 0 ]; then
|
||||||
|
fail "sched_switch events should not be recorded"
|
||||||
|
fi
|
||||||
|
|
||||||
|
do_reset
|
||||||
|
|
||||||
|
exit 0
|
|
@ -0,0 +1,53 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# description: event tracing - enable/disable with subsystem level files
|
||||||
|
|
||||||
|
do_reset() {
|
||||||
|
echo > set_event
|
||||||
|
clear_trace
|
||||||
|
}
|
||||||
|
|
||||||
|
fail() { #msg
|
||||||
|
do_reset
|
||||||
|
echo $1
|
||||||
|
exit -1
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ ! -f set_event -o ! -d events/sched ]; then
|
||||||
|
echo "event tracing is not supported"
|
||||||
|
exit_unsupported
|
||||||
|
fi
|
||||||
|
|
||||||
|
reset_tracer
|
||||||
|
do_reset
|
||||||
|
|
||||||
|
echo 'sched:*' > set_event
|
||||||
|
usleep 1
|
||||||
|
|
||||||
|
count=`cat trace | grep -v ^# | awk '{ print $5 }' | sort -u | wc -l`
|
||||||
|
if [ $count -lt 3 ]; then
|
||||||
|
fail "at least fork, exec and exit events should be recorded"
|
||||||
|
fi
|
||||||
|
|
||||||
|
do_reset
|
||||||
|
|
||||||
|
echo 1 > events/sched/enable
|
||||||
|
usleep 1
|
||||||
|
|
||||||
|
count=`cat trace | grep -v ^# | awk '{ print $5 }' | sort -u | wc -l`
|
||||||
|
if [ $count -lt 3 ]; then
|
||||||
|
fail "at least fork, exec and exit events should be recorded"
|
||||||
|
fi
|
||||||
|
|
||||||
|
do_reset
|
||||||
|
|
||||||
|
echo 0 > events/sched/enable
|
||||||
|
usleep 1
|
||||||
|
|
||||||
|
count=`cat trace | grep -v ^# | awk '{ print $5 }' | sort -u | wc -l`
|
||||||
|
if [ $count -ne 0 ]; then
|
||||||
|
fail "any of scheduler events should not be recorded"
|
||||||
|
fi
|
||||||
|
|
||||||
|
do_reset
|
||||||
|
|
||||||
|
exit 0
|
|
@ -0,0 +1,47 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# description: event tracing - enable/disable with top level files
|
||||||
|
|
||||||
|
do_reset() {
|
||||||
|
echo > set_event
|
||||||
|
clear_trace
|
||||||
|
}
|
||||||
|
|
||||||
|
fail() { #msg
|
||||||
|
do_reset
|
||||||
|
echo $1
|
||||||
|
exit -1
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ ! -f available_events -o ! -f set_event -o ! -d events ]; then
|
||||||
|
echo "event tracing is not supported"
|
||||||
|
exit_unsupported
|
||||||
|
fi
|
||||||
|
|
||||||
|
reset_tracer
|
||||||
|
do_reset
|
||||||
|
|
||||||
|
echo '*:*' > set_event
|
||||||
|
count=`cat trace | grep -v ^# | wc -l`
|
||||||
|
if [ $count -eq 0 ]; then
|
||||||
|
fail "none of events are recorded"
|
||||||
|
fi
|
||||||
|
|
||||||
|
do_reset
|
||||||
|
|
||||||
|
echo 1 > events/enable
|
||||||
|
count=`cat trace | grep -v ^# | wc -l`
|
||||||
|
if [ $count -eq 0 ]; then
|
||||||
|
fail "none of events are recorded"
|
||||||
|
fi
|
||||||
|
|
||||||
|
do_reset
|
||||||
|
|
||||||
|
echo 0 > events/enable
|
||||||
|
count=`cat trace | grep -v ^# | wc -l`
|
||||||
|
if [ $count -ne 0 ]; then
|
||||||
|
fail "any of events should not be recorded"
|
||||||
|
fi
|
||||||
|
|
||||||
|
do_reset
|
||||||
|
|
||||||
|
exit 0
|
|
@ -0,0 +1,89 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# description: ftrace - function graph filters with stack tracer
|
||||||
|
|
||||||
|
# Make sure that function graph filtering works, and is not
|
||||||
|
# affected by other tracers enabled (like stack tracer)
|
||||||
|
|
||||||
|
if ! grep -q function_graph available_tracers; then
|
||||||
|
echo "no function graph tracer configured"
|
||||||
|
exit_unsupported
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f set_ftrace_filter ]; then
|
||||||
|
echo "set_ftrace_filter not found? Is dynamic ftrace not set?"
|
||||||
|
exit_unsupported
|
||||||
|
fi
|
||||||
|
|
||||||
|
do_reset() {
|
||||||
|
reset_tracer
|
||||||
|
echo 0 > /proc/sys/kernel/stack_tracer_enabled
|
||||||
|
enable_tracing
|
||||||
|
clear_trace
|
||||||
|
echo > set_ftrace_filter
|
||||||
|
}
|
||||||
|
|
||||||
|
fail() { # msg
|
||||||
|
do_reset
|
||||||
|
echo $1
|
||||||
|
exit -1
|
||||||
|
}
|
||||||
|
|
||||||
|
disable_tracing
|
||||||
|
clear_trace;
|
||||||
|
|
||||||
|
# filter something, schedule is always good
|
||||||
|
if ! echo "schedule" > set_ftrace_filter; then
|
||||||
|
# test for powerpc 64
|
||||||
|
if ! echo ".schedule" > set_ftrace_filter; then
|
||||||
|
fail "can not enable schedule filter"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo function_graph > current_tracer
|
||||||
|
|
||||||
|
if [ ! -f stack_trace ]; then
|
||||||
|
echo "Stack tracer not configured"
|
||||||
|
do_reset
|
||||||
|
exit_unsupported;
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Now testing with stack tracer"
|
||||||
|
|
||||||
|
echo 1 > /proc/sys/kernel/stack_tracer_enabled
|
||||||
|
|
||||||
|
disable_tracing
|
||||||
|
clear_trace
|
||||||
|
enable_tracing
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
count=`cat trace | grep '()' | grep -v schedule | wc -l`
|
||||||
|
|
||||||
|
if [ $count -ne 0 ]; then
|
||||||
|
fail "Graph filtering not working with stack tracer?"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make sure we did find something
|
||||||
|
count=`cat trace | grep 'schedule()' | wc -l`
|
||||||
|
if [ $count -eq 0 ]; then
|
||||||
|
fail "No schedule traces found?"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo 0 > /proc/sys/kernel/stack_tracer_enabled
|
||||||
|
clear_trace
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
|
||||||
|
count=`cat trace | grep '()' | grep -v schedule | wc -l`
|
||||||
|
|
||||||
|
if [ $count -ne 0 ]; then
|
||||||
|
fail "Graph filtering not working after stack tracer disabled?"
|
||||||
|
fi
|
||||||
|
|
||||||
|
count=`cat trace | grep 'schedule()' | wc -l`
|
||||||
|
if [ $count -eq 0 ]; then
|
||||||
|
fail "No schedule traces found?"
|
||||||
|
fi
|
||||||
|
|
||||||
|
do_reset
|
||||||
|
|
||||||
|
exit 0
|
|
@ -0,0 +1,52 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# description: ftrace - function graph filters
|
||||||
|
|
||||||
|
# Make sure that function graph filtering works
|
||||||
|
|
||||||
|
if ! grep -q function_graph available_tracers; then
|
||||||
|
echo "no function graph tracer configured"
|
||||||
|
exit_unsupported
|
||||||
|
fi
|
||||||
|
|
||||||
|
do_reset() {
|
||||||
|
reset_tracer
|
||||||
|
enable_tracing
|
||||||
|
clear_trace
|
||||||
|
}
|
||||||
|
|
||||||
|
fail() { # msg
|
||||||
|
do_reset
|
||||||
|
echo $1
|
||||||
|
exit -1
|
||||||
|
}
|
||||||
|
|
||||||
|
disable_tracing
|
||||||
|
clear_trace
|
||||||
|
|
||||||
|
# filter something, schedule is always good
|
||||||
|
if ! echo "schedule" > set_ftrace_filter; then
|
||||||
|
# test for powerpc 64
|
||||||
|
if ! echo ".schedule" > set_ftrace_filter; then
|
||||||
|
fail "can not enable schedule filter"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo function_graph > current_tracer
|
||||||
|
enable_tracing
|
||||||
|
sleep 1
|
||||||
|
# search for functions (has "()" on the line), and make sure
|
||||||
|
# that only the schedule function was found
|
||||||
|
count=`cat trace | grep '()' | grep -v schedule | wc -l`
|
||||||
|
if [ $count -ne 0 ]; then
|
||||||
|
fail "Graph filtering not working by itself?"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make sure we did find something
|
||||||
|
count=`cat trace | grep 'schedule()' | wc -l`
|
||||||
|
if [ $count -eq 0 ]; then
|
||||||
|
fail "No schedule traces found?"
|
||||||
|
fi
|
||||||
|
|
||||||
|
do_reset
|
||||||
|
|
||||||
|
exit 0
|
|
@ -0,0 +1,80 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# description: ftrace - function profiler with function tracing
|
||||||
|
|
||||||
|
# There was a bug after a rewrite of the ftrace infrastructure that
|
||||||
|
# caused the function_profiler not to be able to run with the function
|
||||||
|
# tracer, because the function_profiler used the function_graph tracer
|
||||||
|
# and it was assumed the two could not run simultaneously.
|
||||||
|
#
|
||||||
|
# There was another related bug where the solution to the first bug
|
||||||
|
# broke the way filtering of the function tracer worked.
|
||||||
|
#
|
||||||
|
# This test triggers those bugs on those kernels.
|
||||||
|
#
|
||||||
|
# We need function_graph and profiling to to run this test
|
||||||
|
if ! grep -q function_graph available_tracers; then
|
||||||
|
echo "no function graph tracer configured"
|
||||||
|
exit_unsupported;
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f set_ftrace_filter ]; then
|
||||||
|
echo "set_ftrace_filter not found? Is dynamic ftrace not set?"
|
||||||
|
exit_unsupported
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f function_profile_enabled ]; then
|
||||||
|
echo "function_profile_enabled not found, function profiling enabled?"
|
||||||
|
exit_unsupported
|
||||||
|
fi
|
||||||
|
|
||||||
|
fail() { # mesg
|
||||||
|
reset_tracer
|
||||||
|
echo > set_ftrace_filter
|
||||||
|
echo $1
|
||||||
|
exit -1
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Testing function tracer with profiler:"
|
||||||
|
echo "enable function tracer"
|
||||||
|
echo function > current_tracer
|
||||||
|
echo "enable profiler"
|
||||||
|
echo 1 > function_profile_enabled
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
echo "Now filter on just schedule"
|
||||||
|
echo '*schedule' > set_ftrace_filter
|
||||||
|
clear_trace
|
||||||
|
|
||||||
|
echo "Now disable function profiler"
|
||||||
|
echo 0 > function_profile_enabled
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
# make sure only schedule functions exist
|
||||||
|
|
||||||
|
echo "testing if only schedule is being traced"
|
||||||
|
if grep -v -e '^#' -e 'schedule' trace; then
|
||||||
|
fail "more than schedule was found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Make sure schedule was traced"
|
||||||
|
if ! grep -e 'schedule' trace > /dev/null; then
|
||||||
|
cat trace
|
||||||
|
fail "can not find schedule in trace"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo > set_ftrace_filter
|
||||||
|
clear_trace
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
echo "make sure something other than scheduler is being traced"
|
||||||
|
if ! grep -v -e '^#' -e 'schedule' trace > /dev/null; then
|
||||||
|
cat trace
|
||||||
|
fail "no other functions besides schedule was found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
reset_tracer
|
||||||
|
|
||||||
|
exit 0
|
16
tools/testing/selftests/ftrace/test.d/functions
Normal file
16
tools/testing/selftests/ftrace/test.d/functions
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
|
||||||
|
clear_trace() { # reset trace output
|
||||||
|
echo > trace
|
||||||
|
}
|
||||||
|
|
||||||
|
disable_tracing() { # stop trace recording
|
||||||
|
echo 0 > tracing_on
|
||||||
|
}
|
||||||
|
|
||||||
|
enable_tracing() { # start trace recording
|
||||||
|
echo 1 > tracing_on
|
||||||
|
}
|
||||||
|
|
||||||
|
reset_tracer() { # reset the current tracer
|
||||||
|
echo nop > current_tracer
|
||||||
|
}
|
|
@ -9,3 +9,4 @@ echo p:myevent do_fork > kprobe_events
|
||||||
grep myevent kprobe_events
|
grep myevent kprobe_events
|
||||||
test -d events/kprobes/myevent
|
test -d events/kprobes/myevent
|
||||||
echo > kprobe_events
|
echo > kprobe_events
|
||||||
|
clear_trace
|
||||||
|
|
|
@ -11,3 +11,4 @@ echo 1 > events/kprobes/myevent/enable
|
||||||
echo > kprobe_events && exit 1 # this must fail
|
echo > kprobe_events && exit 1 # this must fail
|
||||||
echo 0 > events/kprobes/myevent/enable
|
echo 0 > events/kprobes/myevent/enable
|
||||||
echo > kprobe_events # this must succeed
|
echo > kprobe_events # this must succeed
|
||||||
|
clear_trace
|
||||||
|
|
|
@ -12,5 +12,6 @@ echo 1 > events/kprobes/testprobe/enable
|
||||||
( echo "forked")
|
( echo "forked")
|
||||||
echo 0 > events/kprobes/testprobe/enable
|
echo 0 > events/kprobes/testprobe/enable
|
||||||
echo "-:testprobe" >> kprobe_events
|
echo "-:testprobe" >> kprobe_events
|
||||||
|
clear_trace
|
||||||
test -d events/kprobes/testprobe && exit 1 || exit 0
|
test -d events/kprobes/testprobe && exit 1 || exit 0
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# description: Kprobe dynamic event with function tracer
|
||||||
|
|
||||||
|
[ -f kprobe_events ] || exit_unsupported # this is configurable
|
||||||
|
grep function available_tracers || exit_unsupported # this is configurable
|
||||||
|
|
||||||
|
# prepare
|
||||||
|
echo nop > current_tracer
|
||||||
|
echo do_fork > set_ftrace_filter
|
||||||
|
echo 0 > events/enable
|
||||||
|
echo > kprobe_events
|
||||||
|
echo 'p:testprobe do_fork' > kprobe_events
|
||||||
|
|
||||||
|
# kprobe on / ftrace off
|
||||||
|
echo 1 > events/kprobes/testprobe/enable
|
||||||
|
echo > trace
|
||||||
|
( echo "forked")
|
||||||
|
grep testprobe trace
|
||||||
|
! grep 'do_fork <-' trace
|
||||||
|
|
||||||
|
# kprobe on / ftrace on
|
||||||
|
echo function > current_tracer
|
||||||
|
echo > trace
|
||||||
|
( echo "forked")
|
||||||
|
grep testprobe trace
|
||||||
|
grep 'do_fork <-' trace
|
||||||
|
|
||||||
|
# kprobe off / ftrace on
|
||||||
|
echo 0 > events/kprobes/testprobe/enable
|
||||||
|
echo > trace
|
||||||
|
( echo "forked")
|
||||||
|
! grep testprobe trace
|
||||||
|
grep 'do_fork <-' trace
|
||||||
|
|
||||||
|
# kprobe on / ftrace on
|
||||||
|
echo 1 > events/kprobes/testprobe/enable
|
||||||
|
echo function > current_tracer
|
||||||
|
echo > trace
|
||||||
|
( echo "forked")
|
||||||
|
grep testprobe trace
|
||||||
|
grep 'do_fork <-' trace
|
||||||
|
|
||||||
|
# kprobe on / ftrace off
|
||||||
|
echo nop > current_tracer
|
||||||
|
echo > trace
|
||||||
|
( echo "forked")
|
||||||
|
grep testprobe trace
|
||||||
|
! grep 'do_fork <-' trace
|
||||||
|
|
||||||
|
# cleanup
|
||||||
|
echo nop > current_tracer
|
||||||
|
echo > set_ftrace_filter
|
||||||
|
echo 0 > events/kprobes/testprobe/enable
|
||||||
|
echo > kprobe_events
|
||||||
|
echo > trace
|
|
@ -12,4 +12,5 @@ echo 1 > events/kprobes/testprobe2/enable
|
||||||
( echo "forked")
|
( echo "forked")
|
||||||
echo 0 > events/kprobes/testprobe2/enable
|
echo 0 > events/kprobes/testprobe2/enable
|
||||||
echo '-:testprobe2' >> kprobe_events
|
echo '-:testprobe2' >> kprobe_events
|
||||||
|
clear_trace
|
||||||
test -d events/kprobes/testprobe2 && exit 1 || exit 0
|
test -d events/kprobes/testprobe2 && exit 1 || exit 0
|
||||||
|
|
Loading…
Reference in a new issue