kernel.ftrace_enabled=0 is now refused on kernels that deprecate the knob, so the old disable/reload flow no longer applies there. Probe for this with ftrace_disable_supported() and keep the full original scenario (disable, fail to load a livepatch, re-enable, load, confirm disable is refused while loaded) on kernels where it still works; otherwise just confirm the write is refused. Suggested-by: Steven Rostedt Suggested-by: Miroslav Benes Assisted-by: Claude:claude-sonnet-5 Signed-off-by: Andrey Grodzovsky --- .../testing/selftests/livepatch/functions.sh | 13 ++++++ .../selftests/livepatch/test-ftrace.sh | 45 ++++++++++++------- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/tools/testing/selftests/livepatch/functions.sh b/tools/testing/selftests/livepatch/functions.sh index 30dc677b2f45..7fa4bda70221 100644 --- a/tools/testing/selftests/livepatch/functions.sh +++ b/tools/testing/selftests/livepatch/functions.sh @@ -126,6 +126,19 @@ function set_ftrace_enabled() { echo "livepatch: kernel.ftrace_enabled = $result" > /dev/kmsg } +# ftrace_disable_supported() - probe whether kernel.ftrace_enabled=0 +# can still disable ftrace on this kernel. Newer kernels deprecate +# the knob and always refuse the write with -EOPNOTSUPP. +function ftrace_disable_supported() { + local result + + sysctl -q kernel.ftrace_enabled=0 &> /dev/null + result=$(sysctl --values kernel.ftrace_enabled) + sysctl -q kernel.ftrace_enabled=1 &> /dev/null + + [[ "$result" == "0" ]] +} + function cleanup() { pop_config } diff --git a/tools/testing/selftests/livepatch/test-ftrace.sh b/tools/testing/selftests/livepatch/test-ftrace.sh index d2c3dea63104..cd27148510f8 100755 --- a/tools/testing/selftests/livepatch/test-ftrace.sh +++ b/tools/testing/selftests/livepatch/test-ftrace.sh @@ -12,29 +12,32 @@ setup_config # - turn ftrace_enabled OFF and verify livepatches can't load # - turn ftrace_enabled ON and verify livepatch can load # - verify that ftrace_enabled can't be turned OFF while a livepatch is loaded +# (skipped on kernels where the sysctl is deprecated and always refuses 0) start_test "livepatch interaction with ftrace_enabled sysctl" -set_ftrace_enabled 0 -load_failing_mod $MOD_LIVEPATCH +if ftrace_disable_supported; then -set_ftrace_enabled 1 -load_lp $MOD_LIVEPATCH -if [[ "$(cat /proc/cmdline)" != "$MOD_LIVEPATCH: this has been live patched" ]] ; then - echo -e "FAIL\n\n" - die "livepatch kselftest(s) failed" -fi + set_ftrace_enabled 0 + load_failing_mod $MOD_LIVEPATCH -# Check that ftrace could not get disabled when a livepatch is enabled -set_ftrace_enabled --fail 0 -if [[ "$(cat /proc/cmdline)" != "$MOD_LIVEPATCH: this has been live patched" ]] ; then - echo -e "FAIL\n\n" - die "livepatch kselftest(s) failed" -fi -disable_lp $MOD_LIVEPATCH -unload_lp $MOD_LIVEPATCH + set_ftrace_enabled 1 + load_lp $MOD_LIVEPATCH + if [[ "$(cat /proc/cmdline)" != "$MOD_LIVEPATCH: this has been live patched" ]] ; then + echo -e "FAIL\n\n" + die "livepatch kselftest(s) failed" + fi -check_result "livepatch: kernel.ftrace_enabled = 0 + # Check that ftrace could not get disabled when a livepatch is enabled + set_ftrace_enabled --fail 0 + if [[ "$(cat /proc/cmdline)" != "$MOD_LIVEPATCH: this has been live patched" ]] ; then + echo -e "FAIL\n\n" + die "livepatch kselftest(s) failed" + fi + disable_lp $MOD_LIVEPATCH + unload_lp $MOD_LIVEPATCH + + check_result "livepatch: kernel.ftrace_enabled = 0 % insmod test_modules/$MOD_LIVEPATCH.ko livepatch: enabling patch '$MOD_LIVEPATCH' livepatch: '$MOD_LIVEPATCH': initializing patching transition @@ -60,6 +63,14 @@ livepatch: '$MOD_LIVEPATCH': completing unpatching transition livepatch: '$MOD_LIVEPATCH': unpatching complete % rmmod $MOD_LIVEPATCH" +else + + set_ftrace_enabled --fail 0 + check_result "livepatch: sysctl: setting key \"kernel.ftrace_enabled\": \ +Operation not supported" + +fi + # - verify livepatch can load # - check if traces have a patched function -- 2.34.1