Use the stable module_param_cb API instead of proc_fs for exposing module state. This approach is compatible with kernel 4.12 and later. The end result is the same: the module has a function that shows a string, which is later livepatched to show a different string. The only difference is that the file being checked is now a module parameter instead of a procfs entry.
Signed-off-by: Marcos Paulo de Souza <[email protected]> --- tools/testing/selftests/livepatch/functions.sh | 1 + .../testing/selftests/livepatch/test-livepatch.sh | 23 +++++++++++----------- .../livepatch/test_modules/test_klp_mod_patch.c | 11 +++++------ .../livepatch/test_modules/test_klp_mod_target.c | 22 ++++++++++----------- 4 files changed, 27 insertions(+), 30 deletions(-) diff --git a/tools/testing/selftests/livepatch/functions.sh b/tools/testing/selftests/livepatch/functions.sh index 25f137003865..c8c99851c3a2 100644 --- a/tools/testing/selftests/livepatch/functions.sh +++ b/tools/testing/selftests/livepatch/functions.sh @@ -7,6 +7,7 @@ MAX_RETRIES=600 RETRY_INTERVAL=".1" # seconds SYSFS_KERNEL_DIR="/sys/kernel" +SYSFS_MODULE_DIR="/sys/module" SYSFS_KLP_DIR="$SYSFS_KERNEL_DIR/livepatch" SYSFS_DEBUG_DIR="$SYSFS_KERNEL_DIR/debug" SYSFS_KPROBES_DIR="$SYSFS_DEBUG_DIR/kprobes" diff --git a/tools/testing/selftests/livepatch/test-livepatch.sh b/tools/testing/selftests/livepatch/test-livepatch.sh index c44c5341a2f1..06aacf0f4dc7 100755 --- a/tools/testing/selftests/livepatch/test-livepatch.sh +++ b/tools/testing/selftests/livepatch/test-livepatch.sh @@ -198,26 +198,25 @@ 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 -# - verify the proc entry returns livepatched output +# - load a target module with module_param_cb get data with original output +# - load a livepatch that patches the target module's get function +# - verify the parameter get function returns the livepatched output # - disable and unload the livepatch -# - verify the proc entry returns original output again +# - verify the parameter get function returns the original output again # - unload the target module start_test "module function patching" load_mod $MOD_TARGET -if [[ "$(cat /proc/$MOD_TARGET)" != "$MOD_TARGET: original output" ]] ; then +if [[ "$(cat $SYSFS_MODULE_DIR/$MOD_TARGET/parameters/klp_mod_arg)" != "$MOD_TARGET: original output" ]] ; then echo -e "FAIL\n\n" die "livepatch kselftest(s) failed" fi load_lp $MOD_TARGET_PATCH -if [[ "$(cat /proc/$MOD_TARGET)" != "$MOD_TARGET_PATCH: this has been live patched" ]] ; then +if [[ "$(cat $SYSFS_MODULE_DIR/$MOD_TARGET/parameters/klp_mod_arg)" != "$MOD_TARGET_PATCH: this has been live patched" ]] ; then echo -e "FAIL\n\n" die "livepatch kselftest(s) failed" fi @@ -225,7 +224,7 @@ fi disable_lp $MOD_TARGET_PATCH unload_lp $MOD_TARGET_PATCH -if [[ "$(cat /proc/$MOD_TARGET)" != "$MOD_TARGET: original output" ]] ; then +if [[ "$(cat $SYSFS_MODULE_DIR/$MOD_TARGET/parameters/klp_mod_arg)" != "$MOD_TARGET: original output" ]] ; then echo -e "FAIL\n\n" die "livepatch kselftest(s) failed" fi @@ -252,9 +251,9 @@ $MOD_TARGET: test_klp_mod_target_exit" # - load a livepatch that targets a not-yet-loaded module # - load the target module: klp_module_coming patches it immediately -# - verify the proc entry returns livepatched output +# - verify the parameter get function returns the livepatched output # - disable and unload the livepatch -# - verify the proc entry returns original output again +# - verify the parameter get function returns the original output again # - unload the target module start_test "module function patching (livepatch first)" @@ -262,7 +261,7 @@ start_test "module function patching (livepatch first)" load_lp $MOD_TARGET_PATCH load_mod $MOD_TARGET -if [[ "$(cat /proc/$MOD_TARGET)" != "$MOD_TARGET_PATCH: this has been live patched" ]] ; then +if [[ "$(cat $SYSFS_MODULE_DIR/$MOD_TARGET/parameters/klp_mod_arg)" != "$MOD_TARGET_PATCH: this has been live patched" ]] ; then echo -e "FAIL\n\n" die "livepatch kselftest(s) failed" fi @@ -270,7 +269,7 @@ fi disable_lp $MOD_TARGET_PATCH unload_lp $MOD_TARGET_PATCH -if [[ "$(cat /proc/$MOD_TARGET)" != "$MOD_TARGET: original output" ]] ; then +if [[ "$(cat $SYSFS_MODULE_DIR/$MOD_TARGET/parameters/klp_mod_arg)" != "$MOD_TARGET: original output" ]] ; then echo -e "FAIL\n\n" die "livepatch kselftest(s) failed" fi diff --git a/tools/testing/selftests/livepatch/test_modules/test_klp_mod_patch.c b/tools/testing/selftests/livepatch/test_modules/test_klp_mod_patch.c index 6725b4720365..ab56e57c02a8 100644 --- a/tools/testing/selftests/livepatch/test_modules/test_klp_mod_patch.c +++ b/tools/testing/selftests/livepatch/test_modules/test_klp_mod_patch.c @@ -8,17 +8,16 @@ #include <linux/livepatch.h> #include <linux/seq_file.h> -static int livepatch_mod_target_show(struct seq_file *m, void *v) +static int livepatch_mod_target_get(char *buffer, const struct kernel_param *kp) { - seq_printf(m, "%s: %s\n", THIS_MODULE->name, - "this has been live patched"); - return 0; + return sprintf(buffer, "%s: %s\n", THIS_MODULE->name, + "this has been live patched"); } static struct klp_func funcs[] = { { - .old_name = "test_klp_mod_target_show", - .new_func = livepatch_mod_target_show, + .old_name = "test_klp_mod_target_get", + .new_func = livepatch_mod_target_get, }, {}, }; diff --git a/tools/testing/selftests/livepatch/test_modules/test_klp_mod_target.c b/tools/testing/selftests/livepatch/test_modules/test_klp_mod_target.c index 9643984d2402..1382a266825f 100644 --- a/tools/testing/selftests/livepatch/test_modules/test_klp_mod_target.c +++ b/tools/testing/selftests/livepatch/test_modules/test_klp_mod_target.c @@ -5,31 +5,29 @@ #include <linux/module.h> #include <linux/kernel.h> -#include <linux/proc_fs.h> -#include <linux/seq_file.h> +#include <linux/moduleparam.h> -static struct proc_dir_entry *pde; - -static noinline int test_klp_mod_target_show(struct seq_file *m, void *v) +static noinline int test_klp_mod_target_get(char *buffer, const struct kernel_param *kp) { - seq_printf(m, "%s: %s\n", THIS_MODULE->name, "original output"); - return 0; + return sprintf(buffer, "%s: %s\n", THIS_MODULE->name, "original output"); } +static const struct kernel_param_ops test_klp_mod_target_ops = { + .get = test_klp_mod_target_get, +}; + +module_param_cb(klp_mod_arg, &test_klp_mod_target_ops, NULL, 0444); +MODULE_PARM_DESC(klp_mod_arg, "The value of this argument will be livepatched"); + static int test_klp_mod_target_init(void) { pr_info("%s\n", __func__); - pde = proc_create_single("test_klp_mod_target", 0, NULL, - test_klp_mod_target_show); - if (!pde) - return -ENOMEM; return 0; } static void test_klp_mod_target_exit(void) { pr_info("%s\n", __func__); - proc_remove(pde); } module_init(test_klp_mod_target_init); -- 2.54.0

