selftests/livepatch: Test interaction with ftrace_enabled
Since livepatching depends upon ftrace handlers to implement "patched" code functionality, verify that the ftrace_enabled sysctl value interacts with livepatch registration as expected. At the same time, ensure that ftrace_enabled is set and part of the test environment configuration that is saved and restored when running the selftests. Link: http://lkml.kernel.org/r/20191016113316.13415-4-mbenes@suse.cz Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com> Signed-off-by: Miroslav Benes <mbenes@suse.cz> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
parent
35c9e74cff
commit
8c666d2ab5
|
@ -4,6 +4,7 @@ TEST_PROGS_EXTENDED := functions.sh
|
|||
TEST_PROGS := \
|
||||
test-livepatch.sh \
|
||||
test-callbacks.sh \
|
||||
test-shadow-vars.sh
|
||||
test-shadow-vars.sh \
|
||||
test-ftrace.sh
|
||||
|
||||
include ../lib.mk
|
||||
|
|
|
@ -32,12 +32,16 @@ function die() {
|
|||
function push_config() {
|
||||
DYNAMIC_DEBUG=$(grep '^kernel/livepatch' /sys/kernel/debug/dynamic_debug/control | \
|
||||
awk -F'[: ]' '{print "file " $1 " line " $2 " " $4}')
|
||||
FTRACE_ENABLED=$(sysctl --values kernel.ftrace_enabled)
|
||||
}
|
||||
|
||||
function pop_config() {
|
||||
if [[ -n "$DYNAMIC_DEBUG" ]]; then
|
||||
echo -n "$DYNAMIC_DEBUG" > /sys/kernel/debug/dynamic_debug/control
|
||||
fi
|
||||
if [[ -n "$FTRACE_ENABLED" ]]; then
|
||||
sysctl kernel.ftrace_enabled="$FTRACE_ENABLED" &> /dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
function set_dynamic_debug() {
|
||||
|
@ -47,12 +51,20 @@ function set_dynamic_debug() {
|
|||
EOF
|
||||
}
|
||||
|
||||
function set_ftrace_enabled() {
|
||||
local sysctl="$1"
|
||||
result=$(sysctl kernel.ftrace_enabled="$1" 2>&1 | paste --serial --delimiters=' ')
|
||||
echo "livepatch: $result" > /dev/kmsg
|
||||
}
|
||||
|
||||
# setup_config - save the current config and set a script exit trap that
|
||||
# restores the original config. Setup the dynamic debug
|
||||
# for verbose livepatching output.
|
||||
# for verbose livepatching output and turn on
|
||||
# the ftrace_enabled sysctl.
|
||||
function setup_config() {
|
||||
push_config
|
||||
set_dynamic_debug
|
||||
set_ftrace_enabled 1
|
||||
trap pop_config EXIT INT TERM HUP
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
#!/bin/bash
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (C) 2019 Joe Lawrence <joe.lawrence@redhat.com>
|
||||
|
||||
. $(dirname $0)/functions.sh
|
||||
|
||||
MOD_LIVEPATCH=test_klp_livepatch
|
||||
|
||||
setup_config
|
||||
|
||||
|
||||
# TEST: livepatch interaction with ftrace_enabled sysctl
|
||||
# - 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
|
||||
|
||||
echo -n "TEST: livepatch interaction with ftrace_enabled sysctl ... "
|
||||
dmesg -C
|
||||
|
||||
set_ftrace_enabled 0
|
||||
load_failing_mod $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
|
||||
|
||||
set_ftrace_enabled 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
|
||||
% modprobe $MOD_LIVEPATCH
|
||||
livepatch: enabling patch '$MOD_LIVEPATCH'
|
||||
livepatch: '$MOD_LIVEPATCH': initializing patching transition
|
||||
livepatch: failed to register ftrace handler for function 'cmdline_proc_show' (-16)
|
||||
livepatch: failed to patch object 'vmlinux'
|
||||
livepatch: failed to enable patch '$MOD_LIVEPATCH'
|
||||
livepatch: '$MOD_LIVEPATCH': canceling patching transition, going to unpatch
|
||||
livepatch: '$MOD_LIVEPATCH': completing unpatching transition
|
||||
livepatch: '$MOD_LIVEPATCH': unpatching complete
|
||||
modprobe: ERROR: could not insert '$MOD_LIVEPATCH': Device or resource busy
|
||||
livepatch: kernel.ftrace_enabled = 1
|
||||
% modprobe $MOD_LIVEPATCH
|
||||
livepatch: enabling patch '$MOD_LIVEPATCH'
|
||||
livepatch: '$MOD_LIVEPATCH': initializing patching transition
|
||||
livepatch: '$MOD_LIVEPATCH': starting patching transition
|
||||
livepatch: '$MOD_LIVEPATCH': completing patching transition
|
||||
livepatch: '$MOD_LIVEPATCH': patching complete
|
||||
livepatch: sysctl: setting key \"kernel.ftrace_enabled\": Device or resource busy kernel.ftrace_enabled = 0
|
||||
% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled
|
||||
livepatch: '$MOD_LIVEPATCH': initializing unpatching transition
|
||||
livepatch: '$MOD_LIVEPATCH': starting unpatching transition
|
||||
livepatch: '$MOD_LIVEPATCH': completing unpatching transition
|
||||
livepatch: '$MOD_LIVEPATCH': unpatching complete
|
||||
% rmmod $MOD_LIVEPATCH"
|
||||
|
||||
|
||||
exit 0
|
Loading…
Reference in New Issue