@@ -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() {
@@ -351,3 +366,37 @@ function check_sysfs_value() {
351366 die " Unexpected value in $path : $expected_value vs. $value "
352367 fi
353368}
369+
370+ # cleanup_tracing() - stop and clean up function tracing
371+ function cleanup_tracing() {
372+ echo 0 > " $SYSFS_TRACING_DIR /tracing_on"
373+ echo " " > " $SYSFS_TRACING_DIR /set_ftrace_filter"
374+ echo " nop" > " $SYSFS_TRACING_DIR /current_tracer"
375+ echo " " > " $SYSFS_TRACING_DIR /trace"
376+ }
377+
378+ # trace_function(function) - start tracing of a function
379+ # function - to be traced function
380+ function trace_function() {
381+ local function=" $1 " ; shift
382+
383+ cleanup_tracing
384+
385+ echo " function" > " $SYSFS_TRACING_DIR /current_tracer"
386+ echo " $function " > " $SYSFS_TRACING_DIR /set_ftrace_filter"
387+ echo 1 > " $SYSFS_TRACING_DIR /tracing_on"
388+ }
389+
390+ # check_traced_functions(functions...) - check whether each function appeared in the trace log
391+ # functions - list of functions to be checked
392+ function check_traced_functions() {
393+ local function
394+
395+ for function in " $@ " ; do
396+ if ! grep -Fwq " $function " " $SYSFS_TRACING_DIR /trace" ; then
397+ die " Function ($function ) did not appear in the trace"
398+ fi
399+ done
400+
401+ cleanup_tracing
402+ }
0 commit comments