forked from Minki/linux
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_PROGS := \
|
||||||
test-livepatch.sh \
|
test-livepatch.sh \
|
||||||
test-callbacks.sh \
|
test-callbacks.sh \
|
||||||
test-shadow-vars.sh
|
test-shadow-vars.sh \
|
||||||
|
test-ftrace.sh
|
||||||
|
|
||||||
include ../lib.mk
|
include ../lib.mk
|
||||||
|
@ -32,12 +32,16 @@ function die() {
|
|||||||
function push_config() {
|
function push_config() {
|
||||||
DYNAMIC_DEBUG=$(grep '^kernel/livepatch' /sys/kernel/debug/dynamic_debug/control | \
|
DYNAMIC_DEBUG=$(grep '^kernel/livepatch' /sys/kernel/debug/dynamic_debug/control | \
|
||||||
awk -F'[: ]' '{print "file " $1 " line " $2 " " $4}')
|
awk -F'[: ]' '{print "file " $1 " line " $2 " " $4}')
|
||||||
|
FTRACE_ENABLED=$(sysctl --values kernel.ftrace_enabled)
|
||||||
}
|
}
|
||||||
|
|
||||||
function pop_config() {
|
function pop_config() {
|
||||||
if [[ -n "$DYNAMIC_DEBUG" ]]; then
|
if [[ -n "$DYNAMIC_DEBUG" ]]; then
|
||||||
echo -n "$DYNAMIC_DEBUG" > /sys/kernel/debug/dynamic_debug/control
|
echo -n "$DYNAMIC_DEBUG" > /sys/kernel/debug/dynamic_debug/control
|
||||||
fi
|
fi
|
||||||
|
if [[ -n "$FTRACE_ENABLED" ]]; then
|
||||||
|
sysctl kernel.ftrace_enabled="$FTRACE_ENABLED" &> /dev/null
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function set_dynamic_debug() {
|
function set_dynamic_debug() {
|
||||||
@ -47,12 +51,20 @@ function set_dynamic_debug() {
|
|||||||
EOF
|
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
|
# setup_config - save the current config and set a script exit trap that
|
||||||
# restores the original config. Setup the dynamic debug
|
# 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() {
|
function setup_config() {
|
||||||
push_config
|
push_config
|
||||||
set_dynamic_debug
|
set_dynamic_debug
|
||||||
|
set_ftrace_enabled 1
|
||||||
trap pop_config EXIT INT TERM HUP
|
trap pop_config EXIT INT TERM HUP
|
||||||
}
|
}
|
||||||
|
|
||||||
|
65
tools/testing/selftests/livepatch/test-ftrace.sh
Executable file
65
tools/testing/selftests/livepatch/test-ftrace.sh
Executable file
@ -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
Block a user