kpatch/livepatch callback test patch: vmlinux pcspkr (mod) joydev (mod) Note: update joydev's pre-patch callback to return -ENODEV to test failure path Index: kernel/fs/aio.c =================================================================== --- kernel.orig/fs/aio.c +++ kernel/fs/aio.c @@ -42,6 +42,50 @@ #include #include +#include +#include "kpatch-macros.h" + +static const char *const module_state[] = { + [MODULE_STATE_LIVE] = "[MODULE_STATE_LIVE] Normal state", + [MODULE_STATE_COMING] = "[MODULE_STATE_COMING] Full formed, running module_init", + [MODULE_STATE_GOING] = "[MODULE_STATE_GOING] Going away", + [MODULE_STATE_UNFORMED] = "[MODULE_STATE_UNFORMED] Still setting it up", +}; + +static void callback_info(const char *callback, patch_object *obj) +{ + if (obj->mod) + pr_info("%s: %s -> %s\n", callback, obj->mod->name, + module_state[obj->mod->state]); + else + pr_info("%s: vmlinux\n", callback); +} + +static int pre_patch_callback(patch_object *obj) +{ + callback_info(__func__, obj); + return 0; +} +KPATCH_PRE_PATCH_CALLBACK(pre_patch_callback); + +static void post_patch_callback(patch_object *obj) +{ + callback_info(__func__, obj); +} +KPATCH_POST_PATCH_CALLBACK(post_patch_callback); + +static void pre_unpatch_callback(patch_object *obj) +{ + callback_info(__func__, obj); +} +KPATCH_PRE_UNPATCH_CALLBACK(pre_unpatch_callback); + +static void post_unpatch_callback(patch_object *obj) +{ + callback_info(__func__, obj); +} +KPATCH_POST_UNPATCH_CALLBACK(post_unpatch_callback); + #define AIO_RING_MAGIC 0xa10a10a1 #define AIO_RING_COMPAT_FEATURES 1 #define AIO_RING_INCOMPAT_FEATURES 0 Index: kernel/drivers/input/joydev.c =================================================================== --- kernel.orig/drivers/input/joydev.c +++ kernel/drivers/input/joydev.c @@ -954,3 +954,47 @@ static void __exit joydev_exit(void) module_init(joydev_init); module_exit(joydev_exit); + +#include +#include "kpatch-macros.h" + +static const char *const module_state[] = { + [MODULE_STATE_LIVE] = "[MODULE_STATE_LIVE] Normal state", + [MODULE_STATE_COMING] = "[MODULE_STATE_COMING] Full formed, running module_init", + [MODULE_STATE_GOING] = "[MODULE_STATE_GOING] Going away", + [MODULE_STATE_UNFORMED] = "[MODULE_STATE_UNFORMED] Still setting it up", +}; + +static void callback_info(const char *callback, patch_object *obj) +{ + if (obj->mod) + pr_info("%s: %s -> %s\n", callback, obj->mod->name, + module_state[obj->mod->state]); + else + pr_info("%s: vmlinux\n", callback); +} + +static int pre_patch_callback(patch_object *obj) +{ + callback_info(__func__, obj); + return 0; /* return -ENODEV; */ +} +KPATCH_PRE_PATCH_CALLBACK(pre_patch_callback); + +static void post_patch_callback(patch_object *obj) +{ + callback_info(__func__, obj); +} +KPATCH_POST_PATCH_CALLBACK(post_patch_callback); + +static void pre_unpatch_callback(patch_object *obj) +{ + callback_info(__func__, obj); +} +KPATCH_PRE_UNPATCH_CALLBACK(pre_unpatch_callback); + +static void post_unpatch_callback(patch_object *obj) +{ + callback_info(__func__, obj); +} +KPATCH_POST_UNPATCH_CALLBACK(post_unpatch_callback); Index: kernel/drivers/input/misc/pcspkr.c =================================================================== --- kernel.orig/drivers/input/misc/pcspkr.c +++ kernel/drivers/input/misc/pcspkr.c @@ -136,3 +136,46 @@ static struct platform_driver pcspkr_pla }; module_platform_driver(pcspkr_platform_driver); +#include +#include "kpatch-macros.h" + +static const char *const module_state[] = { + [MODULE_STATE_LIVE] = "[MODULE_STATE_LIVE] Normal state", + [MODULE_STATE_COMING] = "[MODULE_STATE_COMING] Full formed, running module_init", + [MODULE_STATE_GOING] = "[MODULE_STATE_GOING] Going away", + [MODULE_STATE_UNFORMED] = "[MODULE_STATE_UNFORMED] Still setting it up", +}; + +static void callback_info(const char *callback, patch_object *obj) +{ + if (obj->mod) + pr_info("%s: %s -> %s\n", callback, obj->mod->name, + module_state[obj->mod->state]); + else + pr_info("%s: vmlinux\n", callback); +} + +static int pre_patch_callback(patch_object *obj) +{ + callback_info(__func__, obj); + return 0; +} +KPATCH_PRE_PATCH_CALLBACK(pre_patch_callback); + +static void post_patch_callback(patch_object *obj) +{ + callback_info(__func__, obj); +} +KPATCH_POST_PATCH_CALLBACK(post_patch_callback); + +static void pre_unpatch_callback(patch_object *obj) +{ + callback_info(__func__, obj); +} +KPATCH_PRE_UNPATCH_CALLBACK(pre_unpatch_callback); + +static void post_unpatch_callback(patch_object *obj) +{ + callback_info(__func__, obj); +} +KPATCH_POST_UNPATCH_CALLBACK(post_unpatch_callback);