The changes are as follows: - Replace "replace" with "replace_set" - For atomic-replace test cases, we configure two different livepatches that share the same replace_set. - For non-atomic-replace test cases, we configure multiple livepatches, each with a different replace_set.
The result are as follows, $ ./test-callbacks.sh TEST: target module before livepatch ... ok TEST: module_coming notifier ... ok TEST: module_going notifier ... ok TEST: module_coming and module_going notifiers ... ok TEST: target module not present ... ok TEST: pre-patch callback -ENODEV ... ok TEST: module_coming + pre-patch callback -ENODEV ... ok TEST: multiple target modules ... ok TEST: busy target module ... ok TEST: multiple livepatches ... ok TEST: atomic replace ... ok $ ./test-ftrace.sh TEST: livepatch interaction with ftrace_enabled sysctl ... ok TEST: trace livepatched function and check that the live patch remains in effect ... ok TEST: livepatch a traced function and check that the live patch remains in effect ... ok $ ./test-kprobe.sh TEST: livepatch interaction with kprobed function with post_handler ... ok TEST: livepatch interaction with kprobed function without post_handler ... ok $ ./test-livepatch.sh TEST: basic function patching ... ok TEST: multiple livepatches ... ok TEST: module function patching ... ok TEST: module function patching (livepatch first) ... ok $ ./test-shadow-vars.sh TEST: basic shadow variable API ... ok $ ./test-state.sh TEST: system state modification ... ok TEST: taking over system state modification ... ok TEST: compatible cumulative livepatches ... ok TEST: incompatible cumulative livepatches ... ok $ ./test-syscall.sh TEST: patch getpid syscall while being heavily hammered ... ok Signed-off-by: Yafang Shao <[email protected]> --- .../selftests/livepatch/test-callbacks.sh | 33 +++---- .../selftests/livepatch/test-livepatch.sh | 98 +------------------ .../testing/selftests/livepatch/test-sysfs.sh | 22 ++--- .../test_modules/test_klp_atomic_replace.c | 10 +- .../test_modules/test_klp_callbacks_demo.c | 6 ++ .../test_modules/test_klp_callbacks_demo2.c | 10 +- .../test_modules/test_klp_livepatch.c | 6 ++ .../livepatch/test_modules/test_klp_state.c | 2 +- .../livepatch/test_modules/test_klp_state2.c | 2 +- 9 files changed, 55 insertions(+), 134 deletions(-) diff --git a/tools/testing/selftests/livepatch/test-callbacks.sh b/tools/testing/selftests/livepatch/test-callbacks.sh index 2a03deb26a12..692da8ea4c25 100755 --- a/tools/testing/selftests/livepatch/test-callbacks.sh +++ b/tools/testing/selftests/livepatch/test-callbacks.sh @@ -451,8 +451,8 @@ $MOD_TARGET_BUSY: busymod_work_func exit $MOD_TARGET_BUSY: ${MOD_TARGET_BUSY}_exit" -# Test loading multiple livepatches. This test-case is mainly for comparing -# with the next test-case. +# Test loading multiple livepatches sharing different replace_set. +# This test-case is mainly for comparing with the next test-case. # # - Load and unload two livepatches, pre and post (un)patch callbacks # execute as each patch progresses through its (un)patching @@ -460,14 +460,14 @@ $MOD_TARGET_BUSY: ${MOD_TARGET_BUSY}_exit" start_test "multiple livepatches" -load_lp $MOD_LIVEPATCH -load_lp $MOD_LIVEPATCH2 +load_lp $MOD_LIVEPATCH replace_set=0 +load_lp $MOD_LIVEPATCH2 replace_set=1 disable_lp $MOD_LIVEPATCH2 disable_lp $MOD_LIVEPATCH unload_lp $MOD_LIVEPATCH2 unload_lp $MOD_LIVEPATCH -check_result "% insmod test_modules/$MOD_LIVEPATCH.ko +check_result "% insmod test_modules/$MOD_LIVEPATCH.ko replace_set=0 livepatch: enabling patch '$MOD_LIVEPATCH' livepatch: '$MOD_LIVEPATCH': initializing patching transition $MOD_LIVEPATCH: pre_patch_callback: vmlinux @@ -475,7 +475,7 @@ livepatch: '$MOD_LIVEPATCH': starting patching transition livepatch: '$MOD_LIVEPATCH': completing patching transition $MOD_LIVEPATCH: post_patch_callback: vmlinux livepatch: '$MOD_LIVEPATCH': patching complete -% insmod test_modules/$MOD_LIVEPATCH2.ko +% insmod test_modules/$MOD_LIVEPATCH2.ko replace_set=1 livepatch: enabling patch '$MOD_LIVEPATCH2' livepatch: '$MOD_LIVEPATCH2': initializing patching transition $MOD_LIVEPATCH2: pre_patch_callback: vmlinux @@ -501,14 +501,13 @@ livepatch: '$MOD_LIVEPATCH': unpatching complete % rmmod $MOD_LIVEPATCH" -# Load multiple livepatches, but the second as an 'atomic-replace' -# patch. When the latter loads, the original livepatch should be -# disabled and *none* of its pre/post-unpatch callbacks executed. On -# the other hand, when the atomic-replace livepatch is disabled, its -# pre/post-unpatch callbacks *should* be executed. +# Load multiple livepatches sharing the same replace_set. +# When the latter loads, the original livepatch should be disabled and +# *none* of its pre/post-unpatch callbacks executed. On the other hand, +# when the atomic-replace livepatch is disabled, its pre/post-unpatch +# callbacks *should* be executed. # -# - Load and unload two livepatches, the second of which has its -# .replace flag set true. +# - Load and unload two livepatches sharing the same replace_set # # - Pre and post patch callbacks are executed for both livepatches. # @@ -517,13 +516,13 @@ livepatch: '$MOD_LIVEPATCH': unpatching complete start_test "atomic replace" -load_lp $MOD_LIVEPATCH -load_lp $MOD_LIVEPATCH2 replace=1 +load_lp $MOD_LIVEPATCH replace_set=0 +load_lp $MOD_LIVEPATCH2 replace_set=0 disable_lp $MOD_LIVEPATCH2 unload_lp $MOD_LIVEPATCH2 unload_lp $MOD_LIVEPATCH -check_result "% insmod test_modules/$MOD_LIVEPATCH.ko +check_result "% insmod test_modules/$MOD_LIVEPATCH.ko replace_set=0 livepatch: enabling patch '$MOD_LIVEPATCH' livepatch: '$MOD_LIVEPATCH': initializing patching transition $MOD_LIVEPATCH: pre_patch_callback: vmlinux @@ -531,7 +530,7 @@ livepatch: '$MOD_LIVEPATCH': starting patching transition livepatch: '$MOD_LIVEPATCH': completing patching transition $MOD_LIVEPATCH: post_patch_callback: vmlinux livepatch: '$MOD_LIVEPATCH': patching complete -% insmod test_modules/$MOD_LIVEPATCH2.ko replace=1 +% insmod test_modules/$MOD_LIVEPATCH2.ko replace_set=0 livepatch: enabling patch '$MOD_LIVEPATCH2' livepatch: '$MOD_LIVEPATCH2': initializing patching transition $MOD_LIVEPATCH2: pre_patch_callback: vmlinux diff --git a/tools/testing/selftests/livepatch/test-livepatch.sh b/tools/testing/selftests/livepatch/test-livepatch.sh index c44c5341a2f1..042999856267 100755 --- a/tools/testing/selftests/livepatch/test-livepatch.sh +++ b/tools/testing/selftests/livepatch/test-livepatch.sh @@ -57,12 +57,12 @@ livepatch: '$MOD_LIVEPATCH1': unpatching complete start_test "multiple livepatches" -load_lp $MOD_LIVEPATCH1 +load_lp $MOD_LIVEPATCH1 replace_set=0 grep 'live patched' /proc/cmdline > /dev/kmsg grep 'live patched' /proc/meminfo > /dev/kmsg -load_lp $MOD_REPLACE replace=0 +load_lp $MOD_REPLACE replace_set=1 grep 'live patched' /proc/cmdline > /dev/kmsg grep 'live patched' /proc/meminfo > /dev/kmsg @@ -79,14 +79,14 @@ unload_lp $MOD_LIVEPATCH1 grep 'live patched' /proc/cmdline > /dev/kmsg grep 'live patched' /proc/meminfo > /dev/kmsg -check_result "% insmod test_modules/$MOD_LIVEPATCH1.ko +check_result "% insmod test_modules/$MOD_LIVEPATCH1.ko replace_set=0 livepatch: enabling patch '$MOD_LIVEPATCH1' livepatch: '$MOD_LIVEPATCH1': initializing patching transition livepatch: '$MOD_LIVEPATCH1': starting patching transition livepatch: '$MOD_LIVEPATCH1': completing patching transition livepatch: '$MOD_LIVEPATCH1': patching complete $MOD_LIVEPATCH1: this has been live patched -% insmod test_modules/$MOD_REPLACE.ko replace=0 +% insmod test_modules/$MOD_REPLACE.ko replace_set=1 livepatch: enabling patch '$MOD_REPLACE' livepatch: '$MOD_REPLACE': initializing patching transition livepatch: '$MOD_REPLACE': starting patching transition @@ -108,96 +108,6 @@ livepatch: '$MOD_LIVEPATCH1': completing unpatching transition livepatch: '$MOD_LIVEPATCH1': unpatching complete % rmmod $MOD_LIVEPATCH1" - -# - load a livepatch that modifies the output from /proc/cmdline and -# verify correct behavior -# - load two additional livepatches and check the number of livepatch modules -# applied -# - load an atomic replace livepatch and check that the other three modules were -# disabled -# - remove all livepatches besides the atomic replace one and verify that the -# atomic replace livepatch is still active -# - remove the atomic replace livepatch and verify that none are active - -start_test "atomic replace livepatch" - -load_lp $MOD_LIVEPATCH1 - -grep 'live patched' /proc/cmdline > /dev/kmsg -grep 'live patched' /proc/meminfo > /dev/kmsg - -for mod in $MOD_LIVEPATCH2 $MOD_LIVEPATCH3; do - load_lp "$mod" -done - -mods=($SYSFS_KLP_DIR/*) -nmods=${#mods[@]} -if [ "$nmods" -ne 3 ]; then - die "Expecting three modules listed, found $nmods" -fi - -load_lp $MOD_REPLACE replace=1 - -grep 'live patched' /proc/cmdline > /dev/kmsg -grep 'live patched' /proc/meminfo > /dev/kmsg - -loop_until 'mods=($SYSFS_KLP_DIR/*); nmods=${#mods[@]}; [[ "$nmods" -eq 1 ]]' || - die "Expecting only one moduled listed, found $nmods" - -# These modules were disabled by the atomic replace -for mod in $MOD_LIVEPATCH3 $MOD_LIVEPATCH2 $MOD_LIVEPATCH1; do - unload_lp "$mod" -done - -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 "% insmod test_modules/$MOD_LIVEPATCH1.ko -livepatch: enabling patch '$MOD_LIVEPATCH1' -livepatch: '$MOD_LIVEPATCH1': initializing patching transition -livepatch: '$MOD_LIVEPATCH1': starting patching transition -livepatch: '$MOD_LIVEPATCH1': completing patching transition -livepatch: '$MOD_LIVEPATCH1': patching complete -$MOD_LIVEPATCH1: this has been live patched -% insmod test_modules/$MOD_LIVEPATCH2.ko -livepatch: enabling patch '$MOD_LIVEPATCH2' -livepatch: '$MOD_LIVEPATCH2': initializing patching transition -livepatch: '$MOD_LIVEPATCH2': starting patching transition -livepatch: '$MOD_LIVEPATCH2': completing patching transition -livepatch: '$MOD_LIVEPATCH2': patching complete -% insmod test_modules/$MOD_LIVEPATCH3.ko -livepatch: enabling patch '$MOD_LIVEPATCH3' -livepatch: '$MOD_LIVEPATCH3': initializing patching transition -$MOD_LIVEPATCH3: pre_patch_callback: vmlinux -livepatch: '$MOD_LIVEPATCH3': starting patching transition -livepatch: '$MOD_LIVEPATCH3': completing patching transition -$MOD_LIVEPATCH3: post_patch_callback: vmlinux -livepatch: '$MOD_LIVEPATCH3': patching complete -% insmod test_modules/$MOD_REPLACE.ko 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_LIVEPATCH3 -% rmmod $MOD_LIVEPATCH2 -% rmmod $MOD_LIVEPATCH1 -$MOD_REPLACE: this has been live patched -% echo 0 > $SYSFS_KLP_DIR/$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" - - # - load a target module that provides /proc/test_klp_mod_target with # original output # - load a livepatch that patches the target module's show function diff --git a/tools/testing/selftests/livepatch/test-sysfs.sh b/tools/testing/selftests/livepatch/test-sysfs.sh index 0c31759f34f6..37425ad89f58 100755 --- a/tools/testing/selftests/livepatch/test-sysfs.sh +++ b/tools/testing/selftests/livepatch/test-sysfs.sh @@ -20,7 +20,7 @@ check_sysfs_rights "$MOD_LIVEPATCH" "" "drwxr-xr-x" check_sysfs_rights "$MOD_LIVEPATCH" "enabled" "-rw-r--r--" check_sysfs_value "$MOD_LIVEPATCH" "enabled" "1" check_sysfs_rights "$MOD_LIVEPATCH" "force" "--w-------" -check_sysfs_rights "$MOD_LIVEPATCH" "replace" "-r--r--r--" +check_sysfs_rights "$MOD_LIVEPATCH" "replace_set" "-r--r--r--" check_sysfs_rights "$MOD_LIVEPATCH" "transition" "-r--r--r--" check_sysfs_value "$MOD_LIVEPATCH" "transition" "0" check_sysfs_rights "$MOD_LIVEPATCH" "vmlinux/patched" "-r--r--r--" @@ -86,18 +86,18 @@ test_klp_callbacks_demo: post_unpatch_callback: vmlinux livepatch: 'test_klp_callbacks_demo': unpatching complete % rmmod test_klp_callbacks_demo" -start_test "sysfs test replace enabled" +start_test "sysfs test replace_set 0" MOD_LIVEPATCH=test_klp_atomic_replace -load_lp $MOD_LIVEPATCH replace=1 +load_lp $MOD_LIVEPATCH replace_set=0 -check_sysfs_rights "$MOD_LIVEPATCH" "replace" "-r--r--r--" -check_sysfs_value "$MOD_LIVEPATCH" "replace" "1" +check_sysfs_rights "$MOD_LIVEPATCH" "replace_set" "-r--r--r--" +check_sysfs_value "$MOD_LIVEPATCH" "replace_set" "0" disable_lp $MOD_LIVEPATCH unload_lp $MOD_LIVEPATCH -check_result "% insmod test_modules/$MOD_LIVEPATCH.ko replace=1 +check_result "% insmod test_modules/$MOD_LIVEPATCH.ko replace_set=0 livepatch: enabling patch '$MOD_LIVEPATCH' livepatch: '$MOD_LIVEPATCH': initializing patching transition livepatch: '$MOD_LIVEPATCH': starting patching transition @@ -110,17 +110,17 @@ livepatch: '$MOD_LIVEPATCH': completing unpatching transition livepatch: '$MOD_LIVEPATCH': unpatching complete % rmmod $MOD_LIVEPATCH" -start_test "sysfs test replace disabled" +start_test "sysfs test replace_set 1234" -load_lp $MOD_LIVEPATCH replace=0 +load_lp $MOD_LIVEPATCH replace_set=1234 -check_sysfs_rights "$MOD_LIVEPATCH" "replace" "-r--r--r--" -check_sysfs_value "$MOD_LIVEPATCH" "replace" "0" +check_sysfs_rights "$MOD_LIVEPATCH" "replace_set" "-r--r--r--" +check_sysfs_value "$MOD_LIVEPATCH" "replace_set" "1234" disable_lp $MOD_LIVEPATCH unload_lp $MOD_LIVEPATCH -check_result "% insmod test_modules/$MOD_LIVEPATCH.ko replace=0 +check_result "% insmod test_modules/$MOD_LIVEPATCH.ko replace_set=1234 livepatch: enabling patch '$MOD_LIVEPATCH' livepatch: '$MOD_LIVEPATCH': initializing patching transition livepatch: '$MOD_LIVEPATCH': starting patching transition diff --git a/tools/testing/selftests/livepatch/test_modules/test_klp_atomic_replace.c b/tools/testing/selftests/livepatch/test_modules/test_klp_atomic_replace.c index 5af7093ca00c..5333503f193a 100644 --- a/tools/testing/selftests/livepatch/test_modules/test_klp_atomic_replace.c +++ b/tools/testing/selftests/livepatch/test_modules/test_klp_atomic_replace.c @@ -7,9 +7,9 @@ #include <linux/kernel.h> #include <linux/livepatch.h> -static int replace; -module_param(replace, int, 0644); -MODULE_PARM_DESC(replace, "replace (default=0)"); +static int replace_set; +module_param(replace_set, int, 0644); +MODULE_PARM_DESC(replace_set, "replace_set (default=0)"); #include <linux/seq_file.h> static int livepatch_meminfo_proc_show(struct seq_file *m, void *v) @@ -36,12 +36,12 @@ static struct klp_object objs[] = { static struct klp_patch patch = { .mod = THIS_MODULE, .objs = objs, - /* set .replace in the init function below for demo purposes */ + /* set .replace_set in the init function below for demo purposes */ }; static int test_klp_atomic_replace_init(void) { - patch.replace = replace; + patch.replace_set = replace_set; return klp_enable_patch(&patch); } diff --git a/tools/testing/selftests/livepatch/test_modules/test_klp_callbacks_demo.c b/tools/testing/selftests/livepatch/test_modules/test_klp_callbacks_demo.c index 3fd8fe1cd1cc..5c3324aa4d75 100644 --- a/tools/testing/selftests/livepatch/test_modules/test_klp_callbacks_demo.c +++ b/tools/testing/selftests/livepatch/test_modules/test_klp_callbacks_demo.c @@ -7,6 +7,10 @@ #include <linux/kernel.h> #include <linux/livepatch.h> +static int replace_set; +module_param(replace_set, int, 0644); +MODULE_PARM_DESC(replace_set, "replace_set (default=0)"); + static int pre_patch_ret; module_param(pre_patch_ret, int, 0644); MODULE_PARM_DESC(pre_patch_ret, "pre_patch_ret (default=0)"); @@ -102,10 +106,12 @@ static struct klp_object objs[] = { static struct klp_patch patch = { .mod = THIS_MODULE, .objs = objs, + /* set .replace_set in the init function below for demo purposes */ }; static int test_klp_callbacks_demo_init(void) { + patch.replace_set = replace_set; return klp_enable_patch(&patch); } diff --git a/tools/testing/selftests/livepatch/test_modules/test_klp_callbacks_demo2.c b/tools/testing/selftests/livepatch/test_modules/test_klp_callbacks_demo2.c index 5417573e80af..31347e2131a7 100644 --- a/tools/testing/selftests/livepatch/test_modules/test_klp_callbacks_demo2.c +++ b/tools/testing/selftests/livepatch/test_modules/test_klp_callbacks_demo2.c @@ -7,9 +7,9 @@ #include <linux/kernel.h> #include <linux/livepatch.h> -static int replace; -module_param(replace, int, 0644); -MODULE_PARM_DESC(replace, "replace (default=0)"); +static int replace_set; +module_param(replace_set, int, 0644); +MODULE_PARM_DESC(replace_set, "replace_set (default=0)"); static const char *const module_state[] = { [MODULE_STATE_LIVE] = "[MODULE_STATE_LIVE] Normal state", @@ -72,12 +72,12 @@ static struct klp_object objs[] = { static struct klp_patch patch = { .mod = THIS_MODULE, .objs = objs, - /* set .replace in the init function below for demo purposes */ + /* set .replace_set in the init function below for demo purposes */ }; static int test_klp_callbacks_demo2_init(void) { - patch.replace = replace; + patch.replace_set = replace_set; return klp_enable_patch(&patch); } diff --git a/tools/testing/selftests/livepatch/test_modules/test_klp_livepatch.c b/tools/testing/selftests/livepatch/test_modules/test_klp_livepatch.c index aff08199de71..fedd2494d187 100644 --- a/tools/testing/selftests/livepatch/test_modules/test_klp_livepatch.c +++ b/tools/testing/selftests/livepatch/test_modules/test_klp_livepatch.c @@ -15,6 +15,10 @@ static int livepatch_cmdline_proc_show(struct seq_file *m, void *v) return 0; } +static int replace_set; +module_param(replace_set, int, 0644); +MODULE_PARM_DESC(replace_set, "replace_set (default=0)"); + static struct klp_func funcs[] = { { .old_name = "cmdline_proc_show", @@ -32,10 +36,12 @@ static struct klp_object objs[] = { static struct klp_patch patch = { .mod = THIS_MODULE, .objs = objs, + /* set .replace_set in the init function below for demo purposes */ }; static int test_klp_livepatch_init(void) { + patch.replace_set = replace_set; return klp_enable_patch(&patch); } diff --git a/tools/testing/selftests/livepatch/test_modules/test_klp_state.c b/tools/testing/selftests/livepatch/test_modules/test_klp_state.c index 57a4253acb01..8c8829c3ec43 100644 --- a/tools/testing/selftests/livepatch/test_modules/test_klp_state.c +++ b/tools/testing/selftests/livepatch/test_modules/test_klp_state.c @@ -142,7 +142,7 @@ static struct klp_patch patch = { .mod = THIS_MODULE, .objs = objs, .states = states, - .replace = true, + .replace_set = 0, }; static int test_klp_callbacks_demo_init(void) diff --git a/tools/testing/selftests/livepatch/test_modules/test_klp_state2.c b/tools/testing/selftests/livepatch/test_modules/test_klp_state2.c index c978ea4d5e67..8a79d7dcce33 100644 --- a/tools/testing/selftests/livepatch/test_modules/test_klp_state2.c +++ b/tools/testing/selftests/livepatch/test_modules/test_klp_state2.c @@ -171,7 +171,7 @@ static struct klp_patch patch = { .mod = THIS_MODULE, .objs = objs, .states = states, - .replace = true, + .replace_set = 0, }; static int test_klp_callbacks_demo_init(void) -- 2.47.3
