Commit c3280952 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 1dd7dcb6 57cee236
...@@ -13,6 +13,7 @@ echo "Usage: ftracetest [options] [testcase(s)] [testcase-directory(s)]" ...@@ -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() { ...@@ -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 ...@@ -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` ...@@ -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 ...@@ -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= ...@@ -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 () { ...@@ -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 ...@@ -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
......
#!/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
\ No newline at end of file
#!/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
#!/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
#!/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
#!/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
#!/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
#!/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
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 ...@@ -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 ...@@ -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 ...@@ -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
#!/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 ...@@ -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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment