@@ -10,6 +10,7 @@ SYSFS_KERNEL_DIR="/sys/kernel"
1010SYSFS_KLP_DIR=" $SYSFS_KERNEL_DIR /livepatch"
1111SYSFS_DEBUG_DIR=" $SYSFS_KERNEL_DIR /debug"
1212SYSFS_KPROBES_DIR=" $SYSFS_DEBUG_DIR /kprobes"
13+ SYSFS_TRACING_DIR=" $SYSFS_DEBUG_DIR /tracing"
1314
1415# Kselftest framework requirement - SKIP code is 4
1516ksft_skip=4
@@ -62,6 +63,9 @@ function push_config() {
6263 awk -F' [: ]' ' {print "file " $1 " line " $2 " " $4}' )
6364 FTRACE_ENABLED=$( sysctl --values kernel.ftrace_enabled)
6465 KPROBE_ENABLED=$( cat " $SYSFS_KPROBES_DIR /enabled" )
66+ TRACING_ON=$( cat " $SYSFS_TRACING_DIR /tracing_on" )
67+ CURRENT_TRACER=$( cat " $SYSFS_TRACING_DIR /current_tracer" )
68+ FTRACE_FILTER=$( cat " $SYSFS_TRACING_DIR /set_ftrace_filter" )
6569}
6670
6771function pop_config() {
@@ -74,6 +78,17 @@ function pop_config() {
7478 if [[ -n " $KPROBE_ENABLED " ]]; then
7579 echo " $KPROBE_ENABLED " > " $SYSFS_KPROBES_DIR /enabled"
7680 fi
81+ if [[ -n " $TRACING_ON " ]]; then
82+ echo " $TRACING_ON " > " $SYSFS_TRACING_DIR /tracing_on"
83+ fi
84+ if [[ -n " $CURRENT_TRACER " ]]; then
85+ echo " $CURRENT_TRACER " > " $SYSFS_TRACING_DIR /current_tracer"
86+ fi
87+ if [[ -n " $FTRACE_FILTER " ]]; then
88+ echo " $FTRACE_FILTER " \
89+ | sed -e " /#### all functions enabled ####/d" \
90+ > " $SYSFS_TRACING_DIR /set_ftrace_filter"
91+ fi
7792}
7893
7994function set_dynamic_debug() {
@@ -352,3 +367,37 @@ function check_sysfs_value() {
352367 die " Unexpected value in $path : $expected_value vs. $value "
353368 fi
354369}
370+
371+ # cleanup_tracing() - stop and clean up function tracing
372+ function cleanup_tracing() {
373+ echo 0 > " $SYSFS_TRACING_DIR /tracing_on"
374+ echo " " > " $SYSFS_TRACING_DIR /set_ftrace_filter"
375+ echo " nop" > " $SYSFS_TRACING_DIR /current_tracer"
376+ echo " " > " $SYSFS_TRACING_DIR /trace"
377+ }
378+
379+ # trace_function(function) - start tracing of a function
380+ # function - to be traced function
381+ function trace_function() {
382+ local function=" $1 " ; shift
383+
384+ cleanup_tracing
385+
386+ echo " function" > " $SYSFS_TRACING_DIR /current_tracer"
387+ echo " $function " > " $SYSFS_TRACING_DIR /set_ftrace_filter"
388+ echo 1 > " $SYSFS_TRACING_DIR /tracing_on"
389+ }
390+
391+ # check_traced_functions(functions...) - check whether each function appeared in the trace log
392+ # functions - list of functions to be checked
393+ function check_traced_functions() {
394+ local function
395+
396+ for function in " $@ " ; do
397+ if ! grep -Fwq " $function " " $SYSFS_TRACING_DIR /trace" ; then
398+ die " Function ($function ) did not appear in the trace"
399+ fi
400+ done
401+
402+ cleanup_tracing
403+ }
0 commit comments