Skip to content

Commit 4327b9e

Browse files
Byte-Labpmladek
authored andcommitted
livepatch: Skip livepatch tests if ftrace cannot be configured
livepatch has a set of selftests that are used to validate the behavior of the livepatching subsystem. One of the testcases in the livepatch testsuite is test-ftrace.sh, which among other things, validates that livepatching gracefully fails when ftrace is disabled. In the event that ftrace cannot be disabled using 'sysctl kernel.ftrace_enabled=0', the test will fail later due to it unexpectedly successfully loading the test_klp_livepatch module. While the livepatch selftests are careful to remove any of the livepatch test modules between testcases to avoid this situation, ftrace may still fail to be disabled if another trace is active on the system that was enabled with FTRACE_OPS_FL_PERMANENT. For example, any active BPF programs that use trampolines will cause this test to fail due to the trampoline being implemented with register_ftrace_direct(). The following is an example of such a trace: tcp_drop (1) R I D tramp: ftrace_regs_caller+0x0/0x58 (call_direct_funcs+0x0/0x30) direct-->bpf_trampoline_6442550536_0+0x0/0x1000 In order to make the test more resilient to system state that is out of its control, this patch updates set_ftrace_enabled() to detect sysctl failures, and skip the testrun when appropriate. Suggested-by: Petr Mladek <pmladek@suse.com> Signed-off-by: David Vernet <void@manifault.com> Acked-by: Miroslav Benes <mbenes@suse.cz> Reviewed-by: Petr Mladek <pmladek@suse.com> Tested-by: Petr Mladek <pmladek@suse.com> Acked-by: Joe Lawrence <joe.lawrence@redhat.com> Signed-off-by: Petr Mladek <pmladek@suse.com> Link: https://lore.kernel.org/r/20220216161100.3243100-1-void@manifault.com
1 parent 77dbd72 commit 4327b9e

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

tools/testing/selftests/livepatch/functions.sh

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,25 @@ function set_dynamic_debug() {
7575
}
7676

7777
function set_ftrace_enabled() {
78-
result=$(sysctl -q kernel.ftrace_enabled="$1" 2>&1 && \
79-
sysctl kernel.ftrace_enabled 2>&1)
80-
echo "livepatch: $result" > /dev/kmsg
78+
local can_fail=0
79+
if [[ "$1" == "--fail" ]] ; then
80+
can_fail=1
81+
shift
82+
fi
83+
84+
local err=$(sysctl -q kernel.ftrace_enabled="$1" 2>&1)
85+
local result=$(sysctl --values kernel.ftrace_enabled)
86+
87+
if [[ "$result" != "$1" ]] ; then
88+
if [[ $can_fail -eq 1 ]] ; then
89+
echo "livepatch: $err" > /dev/kmsg
90+
return
91+
fi
92+
93+
skip "failed to set kernel.ftrace_enabled = $1"
94+
fi
95+
96+
echo "livepatch: kernel.ftrace_enabled = $result" > /dev/kmsg
8197
}
8298

8399
function cleanup() {

tools/testing/selftests/livepatch/test-ftrace.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ if [[ "$(cat /proc/cmdline)" != "$MOD_LIVEPATCH: this has been live patched" ]]
2525
die "livepatch kselftest(s) failed"
2626
fi
2727

28-
set_ftrace_enabled 0
28+
# Check that ftrace could not get disabled when a livepatch is enabled
29+
set_ftrace_enabled --fail 0
2930
if [[ "$(cat /proc/cmdline)" != "$MOD_LIVEPATCH: this has been live patched" ]] ; then
3031
echo -e "FAIL\n\n"
3132
die "livepatch kselftest(s) failed"

0 commit comments

Comments
 (0)