Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: livepatch: add new ftrace helpers functions

Add new ftrace helpers functions cleanup_tracing, trace_function and
check_traced_functions.

Signed-off-by: Filipe Xavier <felipeaggger@gmail.com>
Acked-by: Miroslav Benes <mbenes@suse.cz>
Acked-by: Joe Lawrence <joe.lawrence@redhat.com>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Tested-by: Petr Mladek <pmladek@suse.com>
Link: https://lore.kernel.org/r/20250324-ftrace-sftest-livepatch-v3-1-d9d7cc386c75@gmail.com
Signed-off-by: Petr Mladek <pmladek@suse.com>

authored by

Filipe Xavier and committed by
Petr Mladek
2ca7cd80 33608823

+49
+49
tools/testing/selftests/livepatch/functions.sh
··· 10 10 SYSFS_KLP_DIR="$SYSFS_KERNEL_DIR/livepatch" 11 11 SYSFS_DEBUG_DIR="$SYSFS_KERNEL_DIR/debug" 12 12 SYSFS_KPROBES_DIR="$SYSFS_DEBUG_DIR/kprobes" 13 + SYSFS_TRACING_DIR="$SYSFS_DEBUG_DIR/tracing" 13 14 14 15 # Kselftest framework requirement - SKIP code is 4 15 16 ksft_skip=4 ··· 63 62 awk -F'[: ]' '{print "file " $1 " line " $2 " " $4}') 64 63 FTRACE_ENABLED=$(sysctl --values kernel.ftrace_enabled) 65 64 KPROBE_ENABLED=$(cat "$SYSFS_KPROBES_DIR/enabled") 65 + TRACING_ON=$(cat "$SYSFS_TRACING_DIR/tracing_on") 66 + CURRENT_TRACER=$(cat "$SYSFS_TRACING_DIR/current_tracer") 67 + FTRACE_FILTER=$(cat "$SYSFS_TRACING_DIR/set_ftrace_filter") 66 68 } 67 69 68 70 function pop_config() { ··· 77 73 fi 78 74 if [[ -n "$KPROBE_ENABLED" ]]; then 79 75 echo "$KPROBE_ENABLED" > "$SYSFS_KPROBES_DIR/enabled" 76 + fi 77 + if [[ -n "$TRACING_ON" ]]; then 78 + echo "$TRACING_ON" > "$SYSFS_TRACING_DIR/tracing_on" 79 + fi 80 + if [[ -n "$CURRENT_TRACER" ]]; then 81 + echo "$CURRENT_TRACER" > "$SYSFS_TRACING_DIR/current_tracer" 82 + fi 83 + if [[ -n "$FTRACE_FILTER" ]]; then 84 + echo "$FTRACE_FILTER" \ 85 + | sed -e "/#### all functions enabled ####/d" \ 86 + > "$SYSFS_TRACING_DIR/set_ftrace_filter" 80 87 fi 81 88 } 82 89 ··· 365 350 if test "$value" != "$expected_value" ; then 366 351 die "Unexpected value in $path: $expected_value vs. $value" 367 352 fi 353 + } 354 + 355 + # cleanup_tracing() - stop and clean up function tracing 356 + function cleanup_tracing() { 357 + echo 0 > "$SYSFS_TRACING_DIR/tracing_on" 358 + echo "" > "$SYSFS_TRACING_DIR/set_ftrace_filter" 359 + echo "nop" > "$SYSFS_TRACING_DIR/current_tracer" 360 + echo "" > "$SYSFS_TRACING_DIR/trace" 361 + } 362 + 363 + # trace_function(function) - start tracing of a function 364 + # function - to be traced function 365 + function trace_function() { 366 + local function="$1"; shift 367 + 368 + cleanup_tracing 369 + 370 + echo "function" > "$SYSFS_TRACING_DIR/current_tracer" 371 + echo "$function" > "$SYSFS_TRACING_DIR/set_ftrace_filter" 372 + echo 1 > "$SYSFS_TRACING_DIR/tracing_on" 373 + } 374 + 375 + # check_traced_functions(functions...) - check whether each function appeared in the trace log 376 + # functions - list of functions to be checked 377 + function check_traced_functions() { 378 + local function 379 + 380 + for function in "$@"; do 381 + if ! grep -Fwq "$function" "$SYSFS_TRACING_DIR/trace" ; then 382 + die "Function ($function) did not appear in the trace" 383 + fi 384 + done 385 + 386 + cleanup_tracing 368 387 }