selftests/livepatch: introduce tests
Add a few livepatch modules and simple target modules that the included regression suite can run tests against: - basic livepatching (multiple patches, atomic replace) - pre/post (un)patch callbacks - shadow variable API Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com> Signed-off-by: Petr Mladek <pmladek@suse.com> Tested-by: Miroslav Benes <mbenes@suse.cz> Tested-by: Alice Ferrazzi <alice.ferrazzi@gmail.com> Acked-by: Joe Lawrence <joe.lawrence@redhat.com> Acked-by: Josh Poimboeuf <jpoimboe@redhat.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:

committed by
Jiri Kosina

parent
d67a537209
commit
a2818ee4dc
168
tools/testing/selftests/livepatch/test-livepatch.sh
Executable file
168
tools/testing/selftests/livepatch/test-livepatch.sh
Executable file
@@ -0,0 +1,168 @@
|
||||
#!/bin/bash
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (C) 2018 Joe Lawrence <joe.lawrence@redhat.com>
|
||||
|
||||
. $(dirname $0)/functions.sh
|
||||
|
||||
MOD_LIVEPATCH=test_klp_livepatch
|
||||
MOD_REPLACE=test_klp_atomic_replace
|
||||
|
||||
set_dynamic_debug
|
||||
|
||||
|
||||
# TEST: basic function patching
|
||||
# - load a livepatch that modifies the output from /proc/cmdline and
|
||||
# verify correct behavior
|
||||
# - unload the livepatch and make sure the patch was removed
|
||||
|
||||
echo -n "TEST: basic function patching ... "
|
||||
dmesg -C
|
||||
|
||||
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
|
||||
|
||||
disable_lp $MOD_LIVEPATCH
|
||||
unload_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 "% 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
|
||||
% 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"
|
||||
|
||||
|
||||
# TEST: multiple livepatches
|
||||
# - load a livepatch that modifies the output from /proc/cmdline and
|
||||
# verify correct behavior
|
||||
# - load another livepatch and verify that both livepatches are active
|
||||
# - unload the second livepatch and verify that the first is still active
|
||||
# - unload the first livepatch and verify none are active
|
||||
|
||||
echo -n "TEST: multiple livepatches ... "
|
||||
dmesg -C
|
||||
|
||||
load_lp $MOD_LIVEPATCH
|
||||
|
||||
grep 'live patched' /proc/cmdline > /dev/kmsg
|
||||
grep 'live patched' /proc/meminfo > /dev/kmsg
|
||||
|
||||
load_lp $MOD_REPLACE replace=0
|
||||
|
||||
grep 'live patched' /proc/cmdline > /dev/kmsg
|
||||
grep 'live patched' /proc/meminfo > /dev/kmsg
|
||||
|
||||
disable_lp $MOD_REPLACE
|
||||
unload_lp $MOD_REPLACE
|
||||
|
||||
grep 'live patched' /proc/cmdline > /dev/kmsg
|
||||
grep 'live patched' /proc/meminfo > /dev/kmsg
|
||||
|
||||
disable_lp $MOD_LIVEPATCH
|
||||
unload_lp $MOD_LIVEPATCH
|
||||
|
||||
grep 'live patched' /proc/cmdline > /dev/kmsg
|
||||
grep 'live patched' /proc/meminfo > /dev/kmsg
|
||||
|
||||
check_result "% 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
|
||||
$MOD_LIVEPATCH: this has been live patched
|
||||
% modprobe $MOD_REPLACE replace=0
|
||||
livepatch: enabling patch '$MOD_REPLACE'
|
||||
livepatch: '$MOD_REPLACE': initializing patching transition
|
||||
livepatch: '$MOD_REPLACE': starting patching transition
|
||||
livepatch: '$MOD_REPLACE': completing patching transition
|
||||
livepatch: '$MOD_REPLACE': patching complete
|
||||
$MOD_LIVEPATCH: this has been live patched
|
||||
$MOD_REPLACE: this has been live patched
|
||||
% echo 0 > /sys/kernel/livepatch/$MOD_REPLACE/enabled
|
||||
livepatch: '$MOD_REPLACE': initializing unpatching transition
|
||||
livepatch: '$MOD_REPLACE': starting unpatching transition
|
||||
livepatch: '$MOD_REPLACE': completing unpatching transition
|
||||
livepatch: '$MOD_REPLACE': unpatching complete
|
||||
% rmmod $MOD_REPLACE
|
||||
$MOD_LIVEPATCH: this has been live patched
|
||||
% 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"
|
||||
|
||||
|
||||
# TEST: atomic replace livepatch
|
||||
# - load a livepatch that modifies the output from /proc/cmdline and
|
||||
# verify correct behavior
|
||||
# - load an atomic replace livepatch and verify that only the second is active
|
||||
# - remove the first livepatch and verify that the atomic replace livepatch
|
||||
# is still active
|
||||
# - remove the atomic replace livepatch and verify that none are active
|
||||
|
||||
echo -n "TEST: atomic replace livepatch ... "
|
||||
dmesg -C
|
||||
|
||||
load_lp $MOD_LIVEPATCH
|
||||
|
||||
grep 'live patched' /proc/cmdline > /dev/kmsg
|
||||
grep 'live patched' /proc/meminfo > /dev/kmsg
|
||||
|
||||
load_lp $MOD_REPLACE replace=1
|
||||
|
||||
grep 'live patched' /proc/cmdline > /dev/kmsg
|
||||
grep 'live patched' /proc/meminfo > /dev/kmsg
|
||||
|
||||
unload_lp $MOD_LIVEPATCH
|
||||
|
||||
grep 'live patched' /proc/cmdline > /dev/kmsg
|
||||
grep 'live patched' /proc/meminfo > /dev/kmsg
|
||||
|
||||
disable_lp $MOD_REPLACE
|
||||
unload_lp $MOD_REPLACE
|
||||
|
||||
grep 'live patched' /proc/cmdline > /dev/kmsg
|
||||
grep 'live patched' /proc/meminfo > /dev/kmsg
|
||||
|
||||
check_result "% 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
|
||||
$MOD_LIVEPATCH: this has been live patched
|
||||
% modprobe $MOD_REPLACE replace=1
|
||||
livepatch: enabling patch '$MOD_REPLACE'
|
||||
livepatch: '$MOD_REPLACE': initializing patching transition
|
||||
livepatch: '$MOD_REPLACE': starting patching transition
|
||||
livepatch: '$MOD_REPLACE': completing patching transition
|
||||
livepatch: '$MOD_REPLACE': patching complete
|
||||
$MOD_REPLACE: this has been live patched
|
||||
% rmmod $MOD_LIVEPATCH
|
||||
$MOD_REPLACE: this has been live patched
|
||||
% echo 0 > /sys/kernel/livepatch/$MOD_REPLACE/enabled
|
||||
livepatch: '$MOD_REPLACE': initializing unpatching transition
|
||||
livepatch: '$MOD_REPLACE': starting unpatching transition
|
||||
livepatch: '$MOD_REPLACE': completing unpatching transition
|
||||
livepatch: '$MOD_REPLACE': unpatching complete
|
||||
% rmmod $MOD_REPLACE"
|
||||
|
||||
|
||||
exit 0
|
Reference in New Issue
Block a user