From f4f7140c701d876e5beeb5337887a6c0822c6cb9 Mon Sep 17 00:00:00 2001 From: Marcos Paulo de Souza Date: Mon, 4 May 2026 15:34:42 -0300 Subject: [PATCH 1/8] selftests: livepatch: Check for ARCH_HAS_SYSCALL_WRAPPER config Older kernels that lack CONFIG_ARCH_HAS_SYSCALL_WRAPPER config don't have any prefixes for their syscalls. The same applies to current powerpc and loongarch, covering all currently supported architectures that support livepatch. The other supported architectures have specific prefixes, so error out when a new architecture adds livepatch support with wrappers but didn't update the test to include it. Signed-off-by: Marcos Paulo de Souza Reviewed-by: Petr Mladek Acked-by: Joe Lawrence Link: https://patch.msgid.link/20260504-lp-tests-old-fixes-v5-1-0be26d94ab9a@suse.com Signed-off-by: Petr Mladek --- .../livepatch/test_modules/test_klp_syscall.c | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/tools/testing/selftests/livepatch/test_modules/test_klp_syscall.c b/tools/testing/selftests/livepatch/test_modules/test_klp_syscall.c index dd802783ea84..0630ffd9d9a1 100644 --- a/tools/testing/selftests/livepatch/test_modules/test_klp_syscall.c +++ b/tools/testing/selftests/livepatch/test_modules/test_klp_syscall.c @@ -12,15 +12,26 @@ #include #include -#if defined(__x86_64__) -#define FN_PREFIX __x64_ -#elif defined(__s390x__) -#define FN_PREFIX __s390x_ -#elif defined(__aarch64__) -#define FN_PREFIX __arm64_ +/* + * Before CONFIG_ARCH_HAS_SYSCALL_WRAPPER was introduced there were no + * prefixes for system calls. + * powerpc set this config based on configs, so it can be enabled or not. + */ +#if defined(CONFIG_ARCH_HAS_SYSCALL_WRAPPER) + #if defined(__x86_64__) + #define FN_PREFIX __x64_ + #elif defined(__s390x__) + #define FN_PREFIX __s390x_ + #elif defined(__aarch64__) + #define FN_PREFIX __arm64_ + #elif defined(__powerpc__) + #define FN_PREFIX + #else + #error "Missing syscall wrapper for the given architecture." + #endif #else -/* powerpc does not select ARCH_HAS_SYSCALL_WRAPPER */ -#define FN_PREFIX + /* Do not set a prefix for architectures that do not enable wrappers. */ + #define FN_PREFIX #endif /* Protects klp_pids */ From 2724b28cb5124f86335c9e2edf282bb3c9eb8f19 Mon Sep 17 00:00:00 2001 From: Marcos Paulo de Souza Date: Mon, 4 May 2026 15:34:43 -0300 Subject: [PATCH 2/8] selftests: livepatch: Replace true/false module parameter by y/n Older kernels don't support true/false for boolean module parameters because they lack commit 0d6ea3ac94ca ("lib/kstrtox.c: add "false"/"true" support to kstrtobool()"). Replace true/false by y/n so the test module can be loaded on older kernels. No functional changes. Signed-off-by: Marcos Paulo de Souza Reviewed-by: Petr Mladek Acked-by: Joe Lawrence Link: https://patch.msgid.link/20260504-lp-tests-old-fixes-v5-2-0be26d94ab9a@suse.com Signed-off-by: Petr Mladek --- tools/testing/selftests/livepatch/test-kprobe.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/livepatch/test-kprobe.sh b/tools/testing/selftests/livepatch/test-kprobe.sh index b67dfad03d97..7ced4082cff3 100755 --- a/tools/testing/selftests/livepatch/test-kprobe.sh +++ b/tools/testing/selftests/livepatch/test-kprobe.sh @@ -20,11 +20,11 @@ start_test "livepatch interaction with kprobed function with post_handler" echo 1 > "$SYSFS_KPROBES_DIR/enabled" -load_mod $MOD_KPROBE has_post_handler=true +load_mod $MOD_KPROBE has_post_handler=y load_failing_mod $MOD_LIVEPATCH unload_mod $MOD_KPROBE -check_result "% insmod test_modules/test_klp_kprobe.ko has_post_handler=true +check_result "% insmod test_modules/test_klp_kprobe.ko has_post_handler=y % insmod test_modules/$MOD_LIVEPATCH.ko livepatch: enabling patch '$MOD_LIVEPATCH' livepatch: '$MOD_LIVEPATCH': initializing patching transition @@ -39,14 +39,14 @@ insmod: ERROR: could not insert module test_modules/$MOD_LIVEPATCH.ko: Device or start_test "livepatch interaction with kprobed function without post_handler" -load_mod $MOD_KPROBE has_post_handler=false +load_mod $MOD_KPROBE has_post_handler=n load_lp $MOD_LIVEPATCH unload_mod $MOD_KPROBE disable_lp $MOD_LIVEPATCH unload_lp $MOD_LIVEPATCH -check_result "% insmod test_modules/test_klp_kprobe.ko has_post_handler=false +check_result "% insmod test_modules/test_klp_kprobe.ko has_post_handler=n % insmod test_modules/$MOD_LIVEPATCH.ko livepatch: enabling patch '$MOD_LIVEPATCH' livepatch: '$MOD_LIVEPATCH': initializing patching transition From cdc1848ba0d1dbb08110964f9d214639eda03ce5 Mon Sep 17 00:00:00 2001 From: Marcos Paulo de Souza Date: Mon, 4 May 2026 15:34:44 -0300 Subject: [PATCH 3/8] selftests: livepatch: Introduce does_sysfs_exist function Returns true if the livepatch sysfs attribute exists, and false otherwise. This new function will be used in the next patches. Signed-off-by: Marcos Paulo de Souza Reviewed-by: Petr Mladek Acked-by: Joe Lawrence Link: https://patch.msgid.link/20260504-lp-tests-old-fixes-v5-3-0be26d94ab9a@suse.com Signed-off-by: Petr Mladek --- tools/testing/selftests/livepatch/functions.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tools/testing/selftests/livepatch/functions.sh b/tools/testing/selftests/livepatch/functions.sh index 8ec0cb64ad94..2bc50271729c 100644 --- a/tools/testing/selftests/livepatch/functions.sh +++ b/tools/testing/selftests/livepatch/functions.sh @@ -339,6 +339,16 @@ function check_result { fi } +# does_sysfs_exist(modname, attr) - check sysfs attribute existence +# modname - livepatch module creating the sysfs interface +# attr - attribute name to be checked +function does_sysfs_exist() { + local mod="$1"; shift + local attr="$1"; shift + + [[ -f "$SYSFS_KLP_DIR/$mod/$attr" ]] +} + # check_sysfs_rights(modname, rel_path, expected_rights) - check sysfs # path permissions # modname - livepatch module creating the sysfs interface From e6b71aefaec5bcc683c242486ec410c53ec37793 Mon Sep 17 00:00:00 2001 From: Marcos Paulo de Souza Date: Mon, 4 May 2026 15:34:45 -0300 Subject: [PATCH 4/8] selftests: livepatch: Check if patched sysfs attribute exists The commit bb26cfd9e77e ("livepatch: add sysfs entry "patched" for each klp_object") was merged in v6.1, introducing a new sysfs attribute. In order to run the selftests on older kernels, check if given kernel has support for the attribute. If the attribute is not supported, skip the checks. Along with this change, use MOD_LIVEPATCH2 variable instead of reassigning a new value to MOD_LIVEPATCH, and also use the variable names in the check_result, to avoid using the module names. Signed-off-by: Marcos Paulo de Souza Reviewed-by: Petr Mladek Acked-by: Joe Lawrence Link: https://patch.msgid.link/20260504-lp-tests-old-fixes-v5-4-0be26d94ab9a@suse.com Signed-off-by: Petr Mladek --- .../testing/selftests/livepatch/test-sysfs.sh | 87 ++++++++++--------- 1 file changed, 47 insertions(+), 40 deletions(-) diff --git a/tools/testing/selftests/livepatch/test-sysfs.sh b/tools/testing/selftests/livepatch/test-sysfs.sh index 58fe1d96997c..7fa2223f9533 100755 --- a/tools/testing/selftests/livepatch/test-sysfs.sh +++ b/tools/testing/selftests/livepatch/test-sysfs.sh @@ -8,6 +8,8 @@ MOD_LIVEPATCH=test_klp_livepatch MOD_LIVEPATCH2=test_klp_callbacks_demo MOD_LIVEPATCH3=test_klp_syscall +HAS_PATCH_ATTR=0 + setup_config # - load a livepatch and verifies the sysfs entries work as expected @@ -25,8 +27,12 @@ check_sysfs_rights "$MOD_LIVEPATCH" "stack_order" "-r--r--r--" check_sysfs_value "$MOD_LIVEPATCH" "stack_order" "1" 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--" -check_sysfs_value "$MOD_LIVEPATCH" "vmlinux/patched" "1" + +if does_sysfs_exist "$MOD_LIVEPATCH/vmlinux" "patched"; then + check_sysfs_rights "$MOD_LIVEPATCH" "vmlinux/patched" "-r--r--r--" + check_sysfs_value "$MOD_LIVEPATCH" "vmlinux/patched" "1" + HAS_PATCH_ATTR=1 +fi disable_lp $MOD_LIVEPATCH @@ -45,48 +51,49 @@ livepatch: '$MOD_LIVEPATCH': completing unpatching transition livepatch: '$MOD_LIVEPATCH': unpatching complete % rmmod $MOD_LIVEPATCH" -start_test "sysfs test object/patched" +if [[ "$HAS_PATCH_ATTR" == "1" ]]; then + start_test "sysfs test object/patched" -MOD_LIVEPATCH=test_klp_callbacks_demo -MOD_TARGET=test_klp_callbacks_mod -load_lp $MOD_LIVEPATCH + MOD_TARGET=test_klp_callbacks_mod + load_lp $MOD_LIVEPATCH2 -# check the "patch" file changes as target module loads/unloads -check_sysfs_value "$MOD_LIVEPATCH" "$MOD_TARGET/patched" "0" -load_mod $MOD_TARGET -check_sysfs_value "$MOD_LIVEPATCH" "$MOD_TARGET/patched" "1" -unload_mod $MOD_TARGET -check_sysfs_value "$MOD_LIVEPATCH" "$MOD_TARGET/patched" "0" + # check the "patch" file changes as target module loads/unloads + check_sysfs_value "$MOD_LIVEPATCH2" "$MOD_TARGET/patched" "0" + load_mod $MOD_TARGET + check_sysfs_value "$MOD_LIVEPATCH2" "$MOD_TARGET/patched" "1" + unload_mod $MOD_TARGET + check_sysfs_value "$MOD_LIVEPATCH2" "$MOD_TARGET/patched" "0" -disable_lp $MOD_LIVEPATCH -unload_lp $MOD_LIVEPATCH + disable_lp $MOD_LIVEPATCH2 + unload_lp $MOD_LIVEPATCH2 -check_result "% insmod test_modules/test_klp_callbacks_demo.ko -livepatch: enabling patch 'test_klp_callbacks_demo' -livepatch: 'test_klp_callbacks_demo': initializing patching transition -test_klp_callbacks_demo: pre_patch_callback: vmlinux -livepatch: 'test_klp_callbacks_demo': starting patching transition -livepatch: 'test_klp_callbacks_demo': completing patching transition -test_klp_callbacks_demo: post_patch_callback: vmlinux -livepatch: 'test_klp_callbacks_demo': patching complete -% insmod test_modules/test_klp_callbacks_mod.ko -livepatch: applying patch 'test_klp_callbacks_demo' to loading module 'test_klp_callbacks_mod' -test_klp_callbacks_demo: pre_patch_callback: test_klp_callbacks_mod -> [MODULE_STATE_COMING] Full formed, running module_init -test_klp_callbacks_demo: post_patch_callback: test_klp_callbacks_mod -> [MODULE_STATE_COMING] Full formed, running module_init -test_klp_callbacks_mod: test_klp_callbacks_mod_init -% rmmod test_klp_callbacks_mod -test_klp_callbacks_mod: test_klp_callbacks_mod_exit -test_klp_callbacks_demo: pre_unpatch_callback: test_klp_callbacks_mod -> [MODULE_STATE_GOING] Going away -livepatch: reverting patch 'test_klp_callbacks_demo' on unloading module 'test_klp_callbacks_mod' -test_klp_callbacks_demo: post_unpatch_callback: test_klp_callbacks_mod -> [MODULE_STATE_GOING] Going away -% echo 0 > $SYSFS_KLP_DIR/test_klp_callbacks_demo/enabled -livepatch: 'test_klp_callbacks_demo': initializing unpatching transition -test_klp_callbacks_demo: pre_unpatch_callback: vmlinux -livepatch: 'test_klp_callbacks_demo': starting unpatching transition -livepatch: 'test_klp_callbacks_demo': completing unpatching transition -test_klp_callbacks_demo: post_unpatch_callback: vmlinux -livepatch: 'test_klp_callbacks_demo': unpatching complete -% rmmod test_klp_callbacks_demo" + check_result "% insmod test_modules/$MOD_LIVEPATCH2.ko +livepatch: enabling patch '$MOD_LIVEPATCH2' +livepatch: '$MOD_LIVEPATCH2': initializing patching transition +$MOD_LIVEPATCH2: pre_patch_callback: vmlinux +livepatch: '$MOD_LIVEPATCH2': starting patching transition +livepatch: '$MOD_LIVEPATCH2': completing patching transition +$MOD_LIVEPATCH2: post_patch_callback: vmlinux +livepatch: '$MOD_LIVEPATCH2': patching complete +% insmod test_modules/$MOD_TARGET.ko +livepatch: applying patch '$MOD_LIVEPATCH2' to loading module '$MOD_TARGET' +$MOD_LIVEPATCH2: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init +$MOD_LIVEPATCH2: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init +$MOD_TARGET: test_klp_callbacks_mod_init +% rmmod $MOD_TARGET +$MOD_TARGET: test_klp_callbacks_mod_exit +$MOD_LIVEPATCH2: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away +livepatch: reverting patch '$MOD_LIVEPATCH2' on unloading module '$MOD_TARGET' +$MOD_LIVEPATCH2: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away +% echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH2/enabled +livepatch: '$MOD_LIVEPATCH2': initializing unpatching transition +$MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux +livepatch: '$MOD_LIVEPATCH2': starting unpatching transition +livepatch: '$MOD_LIVEPATCH2': completing unpatching transition +$MOD_LIVEPATCH2: post_unpatch_callback: vmlinux +livepatch: '$MOD_LIVEPATCH2': unpatching complete +% rmmod $MOD_LIVEPATCH2" +fi start_test "sysfs test replace enabled" From 1f4cbeec25ee2b8c9604a16b9c15debb78cfb8dd Mon Sep 17 00:00:00 2001 From: Marcos Paulo de Souza Date: Mon, 4 May 2026 15:34:46 -0300 Subject: [PATCH 5/8] selftests: livepatch: Check if replace sysfs attribute exists The commit adb68ed26a3e ("livepatch: Add "replace" sysfs attribute"), merged in v6.11, introduced a new sysfs attribute. In order to run the selftests on older kernels, check if given kernel has support for the attribute. If the attribute is not supported, skip the checks. While at it, create a local variable to hold the module name to be tested, instead of overwriting MOD_LIVEPATCH. Signed-off-by: Marcos Paulo de Souza Reviewed-by: Petr Mladek Acked-by: Joe Lawrence Link: https://patch.msgid.link/20260504-lp-tests-old-fixes-v5-5-0be26d94ab9a@suse.com Signed-off-by: Petr Mladek --- .../testing/selftests/livepatch/test-sysfs.sh | 83 ++++++++++--------- 1 file changed, 45 insertions(+), 38 deletions(-) diff --git a/tools/testing/selftests/livepatch/test-sysfs.sh b/tools/testing/selftests/livepatch/test-sysfs.sh index 7fa2223f9533..fed656021271 100755 --- a/tools/testing/selftests/livepatch/test-sysfs.sh +++ b/tools/testing/selftests/livepatch/test-sysfs.sh @@ -9,6 +9,7 @@ MOD_LIVEPATCH2=test_klp_callbacks_demo MOD_LIVEPATCH3=test_klp_syscall HAS_PATCH_ATTR=0 +HAS_REPLACE_ATTR=0 setup_config @@ -22,7 +23,6 @@ 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" "stack_order" "-r--r--r--" check_sysfs_value "$MOD_LIVEPATCH" "stack_order" "1" check_sysfs_rights "$MOD_LIVEPATCH" "transition" "-r--r--r--" @@ -34,6 +34,11 @@ if does_sysfs_exist "$MOD_LIVEPATCH/vmlinux" "patched"; then HAS_PATCH_ATTR=1 fi +if does_sysfs_exist "$MOD_LIVEPATCH" "replace"; then + check_sysfs_rights "$MOD_LIVEPATCH" "replace" "-r--r--r--" + HAS_REPLACE_ATTR=1 +fi + disable_lp $MOD_LIVEPATCH unload_lp $MOD_LIVEPATCH @@ -95,52 +100,54 @@ livepatch: '$MOD_LIVEPATCH2': unpatching complete % rmmod $MOD_LIVEPATCH2" fi -start_test "sysfs test replace enabled" +if [[ "$HAS_REPLACE_ATTR" == "1" ]]; then + start_test "sysfs test replace enabled" -MOD_LIVEPATCH=test_klp_atomic_replace -load_lp $MOD_LIVEPATCH replace=1 + MOD_ATOMIC_REPLACE=test_klp_atomic_replace + load_lp $MOD_ATOMIC_REPLACE replace=1 -check_sysfs_rights "$MOD_LIVEPATCH" "replace" "-r--r--r--" -check_sysfs_value "$MOD_LIVEPATCH" "replace" "1" + check_sysfs_rights "$MOD_ATOMIC_REPLACE" "replace" "-r--r--r--" + check_sysfs_value "$MOD_ATOMIC_REPLACE" "replace" "1" -disable_lp $MOD_LIVEPATCH -unload_lp $MOD_LIVEPATCH + disable_lp $MOD_ATOMIC_REPLACE + unload_lp $MOD_ATOMIC_REPLACE -check_result "% insmod test_modules/$MOD_LIVEPATCH.ko replace=1 -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 > $SYSFS_KLP_DIR/$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" + check_result "% insmod test_modules/$MOD_ATOMIC_REPLACE.ko replace=1 +livepatch: enabling patch '$MOD_ATOMIC_REPLACE' +livepatch: '$MOD_ATOMIC_REPLACE': initializing patching transition +livepatch: '$MOD_ATOMIC_REPLACE': starting patching transition +livepatch: '$MOD_ATOMIC_REPLACE': completing patching transition +livepatch: '$MOD_ATOMIC_REPLACE': patching complete +% echo 0 > $SYSFS_KLP_DIR/$MOD_ATOMIC_REPLACE/enabled +livepatch: '$MOD_ATOMIC_REPLACE': initializing unpatching transition +livepatch: '$MOD_ATOMIC_REPLACE': starting unpatching transition +livepatch: '$MOD_ATOMIC_REPLACE': completing unpatching transition +livepatch: '$MOD_ATOMIC_REPLACE': unpatching complete +% rmmod $MOD_ATOMIC_REPLACE" -start_test "sysfs test replace disabled" + start_test "sysfs test replace disabled" -load_lp $MOD_LIVEPATCH replace=0 + load_lp $MOD_ATOMIC_REPLACE replace=0 -check_sysfs_rights "$MOD_LIVEPATCH" "replace" "-r--r--r--" -check_sysfs_value "$MOD_LIVEPATCH" "replace" "0" + check_sysfs_rights "$MOD_ATOMIC_REPLACE" "replace" "-r--r--r--" + check_sysfs_value "$MOD_ATOMIC_REPLACE" "replace" "0" -disable_lp $MOD_LIVEPATCH -unload_lp $MOD_LIVEPATCH + disable_lp $MOD_ATOMIC_REPLACE + unload_lp $MOD_ATOMIC_REPLACE -check_result "% insmod test_modules/$MOD_LIVEPATCH.ko replace=0 -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 > $SYSFS_KLP_DIR/$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" + check_result "% insmod test_modules/$MOD_ATOMIC_REPLACE.ko replace=0 +livepatch: enabling patch '$MOD_ATOMIC_REPLACE' +livepatch: '$MOD_ATOMIC_REPLACE': initializing patching transition +livepatch: '$MOD_ATOMIC_REPLACE': starting patching transition +livepatch: '$MOD_ATOMIC_REPLACE': completing patching transition +livepatch: '$MOD_ATOMIC_REPLACE': patching complete +% echo 0 > $SYSFS_KLP_DIR/$MOD_ATOMIC_REPLACE/enabled +livepatch: '$MOD_ATOMIC_REPLACE': initializing unpatching transition +livepatch: '$MOD_ATOMIC_REPLACE': starting unpatching transition +livepatch: '$MOD_ATOMIC_REPLACE': completing unpatching transition +livepatch: '$MOD_ATOMIC_REPLACE': unpatching complete +% rmmod $MOD_ATOMIC_REPLACE" +fi start_test "sysfs test stack_order value" From 8f7168335cb2e438668c5d94eea76621c9a10edd Mon Sep 17 00:00:00 2001 From: Marcos Paulo de Souza Date: Mon, 4 May 2026 15:34:47 -0300 Subject: [PATCH 6/8] selftests: livepatch: Check if stack_order sysfs attribute exists The commit 3dae09de4061 ("livepatch: Add stack_order sysfs attribute"), merged in v6.14, introduced a new sysfs attribute. In order to run the selftests on older kernels, check if given kernel has support for the attribute. If the attribute is not supported, skip the checks. Signed-off-by: Marcos Paulo de Souza Reviewed-by: Petr Mladek Acked-by: Joe Lawrence Link: https://patch.msgid.link/20260504-lp-tests-old-fixes-v5-6-0be26d94ab9a@suse.com Signed-off-by: Petr Mladek --- .../testing/selftests/livepatch/test-sysfs.sh | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/tools/testing/selftests/livepatch/test-sysfs.sh b/tools/testing/selftests/livepatch/test-sysfs.sh index fed656021271..3b16285c6e67 100755 --- a/tools/testing/selftests/livepatch/test-sysfs.sh +++ b/tools/testing/selftests/livepatch/test-sysfs.sh @@ -10,6 +10,7 @@ MOD_LIVEPATCH3=test_klp_syscall HAS_PATCH_ATTR=0 HAS_REPLACE_ATTR=0 +HAS_STACK_ORDER_ATTR=0 setup_config @@ -23,8 +24,6 @@ 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" "stack_order" "-r--r--r--" -check_sysfs_value "$MOD_LIVEPATCH" "stack_order" "1" check_sysfs_rights "$MOD_LIVEPATCH" "transition" "-r--r--r--" check_sysfs_value "$MOD_LIVEPATCH" "transition" "0" @@ -39,6 +38,12 @@ if does_sysfs_exist "$MOD_LIVEPATCH" "replace"; then HAS_REPLACE_ATTR=1 fi +if does_sysfs_exist "$MOD_LIVEPATCH" "stack_order"; then + check_sysfs_rights "$MOD_LIVEPATCH" "stack_order" "-r--r--r--" + check_sysfs_value "$MOD_LIVEPATCH" "stack_order" "1" + HAS_STACK_ORDER_ATTR=1 +fi + disable_lp $MOD_LIVEPATCH unload_lp $MOD_LIVEPATCH @@ -149,33 +154,34 @@ livepatch: '$MOD_ATOMIC_REPLACE': unpatching complete % rmmod $MOD_ATOMIC_REPLACE" fi -start_test "sysfs test stack_order value" +if [[ "$HAS_STACK_ORDER_ATTR" == "1" ]]; then + start_test "sysfs test stack_order value" -load_lp $MOD_LIVEPATCH + load_lp $MOD_LIVEPATCH -check_sysfs_value "$MOD_LIVEPATCH" "stack_order" "1" + check_sysfs_value "$MOD_LIVEPATCH" "stack_order" "1" -load_lp $MOD_LIVEPATCH2 + load_lp $MOD_LIVEPATCH2 -check_sysfs_value "$MOD_LIVEPATCH2" "stack_order" "2" + check_sysfs_value "$MOD_LIVEPATCH2" "stack_order" "2" -load_lp $MOD_LIVEPATCH3 + load_lp $MOD_LIVEPATCH3 -check_sysfs_value "$MOD_LIVEPATCH3" "stack_order" "3" + check_sysfs_value "$MOD_LIVEPATCH3" "stack_order" "3" -disable_lp $MOD_LIVEPATCH2 -unload_lp $MOD_LIVEPATCH2 + disable_lp $MOD_LIVEPATCH2 + unload_lp $MOD_LIVEPATCH2 -check_sysfs_value "$MOD_LIVEPATCH" "stack_order" "1" -check_sysfs_value "$MOD_LIVEPATCH3" "stack_order" "2" + check_sysfs_value "$MOD_LIVEPATCH" "stack_order" "1" + check_sysfs_value "$MOD_LIVEPATCH3" "stack_order" "2" -disable_lp $MOD_LIVEPATCH3 -unload_lp $MOD_LIVEPATCH3 + disable_lp $MOD_LIVEPATCH3 + unload_lp $MOD_LIVEPATCH3 -disable_lp $MOD_LIVEPATCH -unload_lp $MOD_LIVEPATCH + disable_lp $MOD_LIVEPATCH + unload_lp $MOD_LIVEPATCH -check_result "% insmod test_modules/$MOD_LIVEPATCH.ko + check_result "% insmod test_modules/$MOD_LIVEPATCH.ko livepatch: enabling patch '$MOD_LIVEPATCH' livepatch: '$MOD_LIVEPATCH': initializing patching transition livepatch: '$MOD_LIVEPATCH': starting patching transition @@ -215,5 +221,6 @@ livepatch: '$MOD_LIVEPATCH': starting unpatching transition livepatch: '$MOD_LIVEPATCH': completing unpatching transition livepatch: '$MOD_LIVEPATCH': unpatching complete % rmmod $MOD_LIVEPATCH" +fi exit 0 From ed8f317671d9a6bd1daf2f0cb152e126eae2bf10 Mon Sep 17 00:00:00 2001 From: Qiang Ma Date: Wed, 27 May 2026 17:59:29 +0800 Subject: [PATCH 7/8] selftests: livepatch: set LC_ALL=C to fix locale-dependent test failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When executing the command "make -C tools/testing/selftests TARGETS=livepatch run_tests", the following error message was reported. TEST: livepatch interaction with ftrace_enabled sysctl ... not ok ... livepatch: sysctlo : setting key "kernel.ftrace_enabled": Device or resource busy livepatch: sysctl: setting key "kernel.ftrace_enabled": 设备或资源忙 ... ERROR: livepatch kselftest(s) failed not ok 5 selftests: livepatch: test-ftrace.sh # exit=1 To fix it, set LC_ALL=C. Signed-off-by: Qiang Ma Acked-by: Miroslav Benes Acked-by: Petr Mladek Link: https://patch.msgid.link/20260527095929.1504032-1-maqianga@uniontech.com Signed-off-by: Petr Mladek --- tools/testing/selftests/livepatch/functions.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/testing/selftests/livepatch/functions.sh b/tools/testing/selftests/livepatch/functions.sh index 2bc50271729c..30dc677b2f45 100644 --- a/tools/testing/selftests/livepatch/functions.sh +++ b/tools/testing/selftests/livepatch/functions.sh @@ -4,6 +4,8 @@ # Shell functions for the rest of the scripts. +export LC_ALL=C + MAX_RETRIES=600 RETRY_INTERVAL=".1" # seconds SYSFS_KERNEL_DIR="/sys/kernel" From 7203abb3f8bd61e021cce076dafdda7bcfd9f2c2 Mon Sep 17 00:00:00 2001 From: Rui Qi Date: Thu, 4 Jun 2026 16:32:08 +0800 Subject: [PATCH 8/8] selftests/livepatch: fix resource leak in test_klp_syscall init error path In livepatch_init(), if klp_enable_patch() fails, the previously created kobject and sysfs file are never cleaned up, causing a resource leak. Capture the return value and add proper cleanup on the error path. Signed-off-by: Rui Qi Acked-by: Miroslav Benes Reviewed-by: Petr Mladek Link: https://patch.msgid.link/20260604083208.1071428-1-qirui.001@bytedance.com Signed-off-by: Petr Mladek --- .../selftests/livepatch/test_modules/test_klp_syscall.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/livepatch/test_modules/test_klp_syscall.c b/tools/testing/selftests/livepatch/test_modules/test_klp_syscall.c index 0630ffd9d9a1..08aacc0e14de 100644 --- a/tools/testing/selftests/livepatch/test_modules/test_klp_syscall.c +++ b/tools/testing/selftests/livepatch/test_modules/test_klp_syscall.c @@ -109,7 +109,11 @@ static int livepatch_init(void) */ npids = npids_pending; - return klp_enable_patch(&patch); + ret = klp_enable_patch(&patch); + if (ret) + kobject_put(klp_kobj); + + return ret; } static void livepatch_exit(void)