Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

livepatch: Selftests of the API for tracking system state changes

Four selftests for the new API.

Link: http://lkml.kernel.org/r/20191030154313.13263-6-pmladek@suse.com
To: Jiri Kosina <jikos@kernel.org>
Cc: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Cc: Nicolai Stange <nstange@suse.de>
Cc: live-patching@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Acked-by: Miroslav Benes <mbenes@suse.cz>
Acked-by: Joe Lawrence <joe.lawrence@redhat.com>
Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>
Signed-off-by: Petr Mladek <pmladek@suse.com>

+544 -2
+4 -1
lib/livepatch/Makefile
··· 8 8 test_klp_callbacks_busy.o \ 9 9 test_klp_callbacks_mod.o \ 10 10 test_klp_livepatch.o \ 11 - test_klp_shadow_vars.o 11 + test_klp_shadow_vars.o \ 12 + test_klp_state.o \ 13 + test_klp_state2.o \ 14 + test_klp_state3.o 12 15 13 16 # Target modules to be livepatched require CC_FLAGS_FTRACE 14 17 CFLAGS_test_klp_callbacks_busy.o += $(CC_FLAGS_FTRACE)
+162
lib/livepatch/test_klp_state.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + // Copyright (C) 2019 SUSE 3 + 4 + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 5 + 6 + #include <linux/slab.h> 7 + #include <linux/module.h> 8 + #include <linux/kernel.h> 9 + #include <linux/printk.h> 10 + #include <linux/livepatch.h> 11 + 12 + #define CONSOLE_LOGLEVEL_STATE 1 13 + /* Version 1 does not support migration. */ 14 + #define CONSOLE_LOGLEVEL_STATE_VERSION 1 15 + 16 + static const char *const module_state[] = { 17 + [MODULE_STATE_LIVE] = "[MODULE_STATE_LIVE] Normal state", 18 + [MODULE_STATE_COMING] = "[MODULE_STATE_COMING] Full formed, running module_init", 19 + [MODULE_STATE_GOING] = "[MODULE_STATE_GOING] Going away", 20 + [MODULE_STATE_UNFORMED] = "[MODULE_STATE_UNFORMED] Still setting it up", 21 + }; 22 + 23 + static void callback_info(const char *callback, struct klp_object *obj) 24 + { 25 + if (obj->mod) 26 + pr_info("%s: %s -> %s\n", callback, obj->mod->name, 27 + module_state[obj->mod->state]); 28 + else 29 + pr_info("%s: vmlinux\n", callback); 30 + } 31 + 32 + static struct klp_patch patch; 33 + 34 + static int allocate_loglevel_state(void) 35 + { 36 + struct klp_state *loglevel_state; 37 + 38 + loglevel_state = klp_get_state(&patch, CONSOLE_LOGLEVEL_STATE); 39 + if (!loglevel_state) 40 + return -EINVAL; 41 + 42 + loglevel_state->data = kzalloc(sizeof(console_loglevel), GFP_KERNEL); 43 + if (!loglevel_state->data) 44 + return -ENOMEM; 45 + 46 + pr_info("%s: allocating space to store console_loglevel\n", 47 + __func__); 48 + return 0; 49 + } 50 + 51 + static void fix_console_loglevel(void) 52 + { 53 + struct klp_state *loglevel_state; 54 + 55 + loglevel_state = klp_get_state(&patch, CONSOLE_LOGLEVEL_STATE); 56 + if (!loglevel_state) 57 + return; 58 + 59 + pr_info("%s: fixing console_loglevel\n", __func__); 60 + *(int *)loglevel_state->data = console_loglevel; 61 + console_loglevel = CONSOLE_LOGLEVEL_MOTORMOUTH; 62 + } 63 + 64 + static void restore_console_loglevel(void) 65 + { 66 + struct klp_state *loglevel_state; 67 + 68 + loglevel_state = klp_get_state(&patch, CONSOLE_LOGLEVEL_STATE); 69 + if (!loglevel_state) 70 + return; 71 + 72 + pr_info("%s: restoring console_loglevel\n", __func__); 73 + console_loglevel = *(int *)loglevel_state->data; 74 + } 75 + 76 + static void free_loglevel_state(void) 77 + { 78 + struct klp_state *loglevel_state; 79 + 80 + loglevel_state = klp_get_state(&patch, CONSOLE_LOGLEVEL_STATE); 81 + if (!loglevel_state) 82 + return; 83 + 84 + pr_info("%s: freeing space for the stored console_loglevel\n", 85 + __func__); 86 + kfree(loglevel_state->data); 87 + } 88 + 89 + /* Executed on object patching (ie, patch enablement) */ 90 + static int pre_patch_callback(struct klp_object *obj) 91 + { 92 + callback_info(__func__, obj); 93 + return allocate_loglevel_state(); 94 + } 95 + 96 + /* Executed on object unpatching (ie, patch disablement) */ 97 + static void post_patch_callback(struct klp_object *obj) 98 + { 99 + callback_info(__func__, obj); 100 + fix_console_loglevel(); 101 + } 102 + 103 + /* Executed on object unpatching (ie, patch disablement) */ 104 + static void pre_unpatch_callback(struct klp_object *obj) 105 + { 106 + callback_info(__func__, obj); 107 + restore_console_loglevel(); 108 + } 109 + 110 + /* Executed on object unpatching (ie, patch disablement) */ 111 + static void post_unpatch_callback(struct klp_object *obj) 112 + { 113 + callback_info(__func__, obj); 114 + free_loglevel_state(); 115 + } 116 + 117 + static struct klp_func no_funcs[] = { 118 + {} 119 + }; 120 + 121 + static struct klp_object objs[] = { 122 + { 123 + .name = NULL, /* vmlinux */ 124 + .funcs = no_funcs, 125 + .callbacks = { 126 + .pre_patch = pre_patch_callback, 127 + .post_patch = post_patch_callback, 128 + .pre_unpatch = pre_unpatch_callback, 129 + .post_unpatch = post_unpatch_callback, 130 + }, 131 + }, { } 132 + }; 133 + 134 + static struct klp_state states[] = { 135 + { 136 + .id = CONSOLE_LOGLEVEL_STATE, 137 + .version = CONSOLE_LOGLEVEL_STATE_VERSION, 138 + }, { } 139 + }; 140 + 141 + static struct klp_patch patch = { 142 + .mod = THIS_MODULE, 143 + .objs = objs, 144 + .states = states, 145 + .replace = true, 146 + }; 147 + 148 + static int test_klp_callbacks_demo_init(void) 149 + { 150 + return klp_enable_patch(&patch); 151 + } 152 + 153 + static void test_klp_callbacks_demo_exit(void) 154 + { 155 + } 156 + 157 + module_init(test_klp_callbacks_demo_init); 158 + module_exit(test_klp_callbacks_demo_exit); 159 + MODULE_LICENSE("GPL"); 160 + MODULE_INFO(livepatch, "Y"); 161 + MODULE_AUTHOR("Petr Mladek <pmladek@suse.com>"); 162 + MODULE_DESCRIPTION("Livepatch test: system state modification");
+191
lib/livepatch/test_klp_state2.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + // Copyright (C) 2019 SUSE 3 + 4 + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 5 + 6 + #include <linux/slab.h> 7 + #include <linux/module.h> 8 + #include <linux/kernel.h> 9 + #include <linux/printk.h> 10 + #include <linux/livepatch.h> 11 + 12 + #define CONSOLE_LOGLEVEL_STATE 1 13 + /* Version 2 supports migration. */ 14 + #define CONSOLE_LOGLEVEL_STATE_VERSION 2 15 + 16 + static const char *const module_state[] = { 17 + [MODULE_STATE_LIVE] = "[MODULE_STATE_LIVE] Normal state", 18 + [MODULE_STATE_COMING] = "[MODULE_STATE_COMING] Full formed, running module_init", 19 + [MODULE_STATE_GOING] = "[MODULE_STATE_GOING] Going away", 20 + [MODULE_STATE_UNFORMED] = "[MODULE_STATE_UNFORMED] Still setting it up", 21 + }; 22 + 23 + static void callback_info(const char *callback, struct klp_object *obj) 24 + { 25 + if (obj->mod) 26 + pr_info("%s: %s -> %s\n", callback, obj->mod->name, 27 + module_state[obj->mod->state]); 28 + else 29 + pr_info("%s: vmlinux\n", callback); 30 + } 31 + 32 + static struct klp_patch patch; 33 + 34 + static int allocate_loglevel_state(void) 35 + { 36 + struct klp_state *loglevel_state, *prev_loglevel_state; 37 + 38 + prev_loglevel_state = klp_get_prev_state(CONSOLE_LOGLEVEL_STATE); 39 + if (prev_loglevel_state) { 40 + pr_info("%s: space to store console_loglevel already allocated\n", 41 + __func__); 42 + return 0; 43 + } 44 + 45 + loglevel_state = klp_get_state(&patch, CONSOLE_LOGLEVEL_STATE); 46 + if (!loglevel_state) 47 + return -EINVAL; 48 + 49 + loglevel_state->data = kzalloc(sizeof(console_loglevel), GFP_KERNEL); 50 + if (!loglevel_state->data) 51 + return -ENOMEM; 52 + 53 + pr_info("%s: allocating space to store console_loglevel\n", 54 + __func__); 55 + return 0; 56 + } 57 + 58 + static void fix_console_loglevel(void) 59 + { 60 + struct klp_state *loglevel_state, *prev_loglevel_state; 61 + 62 + loglevel_state = klp_get_state(&patch, CONSOLE_LOGLEVEL_STATE); 63 + if (!loglevel_state) 64 + return; 65 + 66 + prev_loglevel_state = klp_get_prev_state(CONSOLE_LOGLEVEL_STATE); 67 + if (prev_loglevel_state) { 68 + pr_info("%s: taking over the console_loglevel change\n", 69 + __func__); 70 + loglevel_state->data = prev_loglevel_state->data; 71 + return; 72 + } 73 + 74 + pr_info("%s: fixing console_loglevel\n", __func__); 75 + *(int *)loglevel_state->data = console_loglevel; 76 + console_loglevel = CONSOLE_LOGLEVEL_MOTORMOUTH; 77 + } 78 + 79 + static void restore_console_loglevel(void) 80 + { 81 + struct klp_state *loglevel_state, *prev_loglevel_state; 82 + 83 + prev_loglevel_state = klp_get_prev_state(CONSOLE_LOGLEVEL_STATE); 84 + if (prev_loglevel_state) { 85 + pr_info("%s: passing the console_loglevel change back to the old livepatch\n", 86 + __func__); 87 + return; 88 + } 89 + 90 + loglevel_state = klp_get_state(&patch, CONSOLE_LOGLEVEL_STATE); 91 + if (!loglevel_state) 92 + return; 93 + 94 + pr_info("%s: restoring console_loglevel\n", __func__); 95 + console_loglevel = *(int *)loglevel_state->data; 96 + } 97 + 98 + static void free_loglevel_state(void) 99 + { 100 + struct klp_state *loglevel_state, *prev_loglevel_state; 101 + 102 + prev_loglevel_state = klp_get_prev_state(CONSOLE_LOGLEVEL_STATE); 103 + if (prev_loglevel_state) { 104 + pr_info("%s: keeping space to store console_loglevel\n", 105 + __func__); 106 + return; 107 + } 108 + 109 + loglevel_state = klp_get_state(&patch, CONSOLE_LOGLEVEL_STATE); 110 + if (!loglevel_state) 111 + return; 112 + 113 + pr_info("%s: freeing space for the stored console_loglevel\n", 114 + __func__); 115 + kfree(loglevel_state->data); 116 + } 117 + 118 + /* Executed on object patching (ie, patch enablement) */ 119 + static int pre_patch_callback(struct klp_object *obj) 120 + { 121 + callback_info(__func__, obj); 122 + return allocate_loglevel_state(); 123 + } 124 + 125 + /* Executed on object unpatching (ie, patch disablement) */ 126 + static void post_patch_callback(struct klp_object *obj) 127 + { 128 + callback_info(__func__, obj); 129 + fix_console_loglevel(); 130 + } 131 + 132 + /* Executed on object unpatching (ie, patch disablement) */ 133 + static void pre_unpatch_callback(struct klp_object *obj) 134 + { 135 + callback_info(__func__, obj); 136 + restore_console_loglevel(); 137 + } 138 + 139 + /* Executed on object unpatching (ie, patch disablement) */ 140 + static void post_unpatch_callback(struct klp_object *obj) 141 + { 142 + callback_info(__func__, obj); 143 + free_loglevel_state(); 144 + } 145 + 146 + static struct klp_func no_funcs[] = { 147 + {} 148 + }; 149 + 150 + static struct klp_object objs[] = { 151 + { 152 + .name = NULL, /* vmlinux */ 153 + .funcs = no_funcs, 154 + .callbacks = { 155 + .pre_patch = pre_patch_callback, 156 + .post_patch = post_patch_callback, 157 + .pre_unpatch = pre_unpatch_callback, 158 + .post_unpatch = post_unpatch_callback, 159 + }, 160 + }, { } 161 + }; 162 + 163 + static struct klp_state states[] = { 164 + { 165 + .id = CONSOLE_LOGLEVEL_STATE, 166 + .version = CONSOLE_LOGLEVEL_STATE_VERSION, 167 + }, { } 168 + }; 169 + 170 + static struct klp_patch patch = { 171 + .mod = THIS_MODULE, 172 + .objs = objs, 173 + .states = states, 174 + .replace = true, 175 + }; 176 + 177 + static int test_klp_callbacks_demo_init(void) 178 + { 179 + return klp_enable_patch(&patch); 180 + } 181 + 182 + static void test_klp_callbacks_demo_exit(void) 183 + { 184 + } 185 + 186 + module_init(test_klp_callbacks_demo_init); 187 + module_exit(test_klp_callbacks_demo_exit); 188 + MODULE_LICENSE("GPL"); 189 + MODULE_INFO(livepatch, "Y"); 190 + MODULE_AUTHOR("Petr Mladek <pmladek@suse.com>"); 191 + MODULE_DESCRIPTION("Livepatch test: system state modification");
+5
lib/livepatch/test_klp_state3.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + // Copyright (C) 2019 SUSE 3 + 4 + /* The console loglevel fix is the same in the next cumulative patch. */ 5 + #include "test_klp_state2.c"
+2 -1
tools/testing/selftests/livepatch/Makefile
··· 4 4 TEST_PROGS := \ 5 5 test-livepatch.sh \ 6 6 test-callbacks.sh \ 7 - test-shadow-vars.sh 7 + test-shadow-vars.sh \ 8 + test-state.sh 8 9 9 10 include ../lib.mk
+180
tools/testing/selftests/livepatch/test-state.sh
··· 1 + #!/bin/bash 2 + # SPDX-License-Identifier: GPL-2.0 3 + # Copyright (C) 2019 SUSE 4 + 5 + . $(dirname $0)/functions.sh 6 + 7 + MOD_LIVEPATCH=test_klp_state 8 + MOD_LIVEPATCH2=test_klp_state2 9 + MOD_LIVEPATCH3=test_klp_state3 10 + 11 + set_dynamic_debug 12 + 13 + 14 + # TEST: Loading and removing a module that modifies the system state 15 + 16 + echo -n "TEST: system state modification ... " 17 + dmesg -C 18 + 19 + load_lp $MOD_LIVEPATCH 20 + disable_lp $MOD_LIVEPATCH 21 + unload_lp $MOD_LIVEPATCH 22 + 23 + check_result "% modprobe $MOD_LIVEPATCH 24 + livepatch: enabling patch '$MOD_LIVEPATCH' 25 + livepatch: '$MOD_LIVEPATCH': initializing patching transition 26 + $MOD_LIVEPATCH: pre_patch_callback: vmlinux 27 + $MOD_LIVEPATCH: allocate_loglevel_state: allocating space to store console_loglevel 28 + livepatch: '$MOD_LIVEPATCH': starting patching transition 29 + livepatch: '$MOD_LIVEPATCH': completing patching transition 30 + $MOD_LIVEPATCH: post_patch_callback: vmlinux 31 + $MOD_LIVEPATCH: fix_console_loglevel: fixing console_loglevel 32 + livepatch: '$MOD_LIVEPATCH': patching complete 33 + % echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled 34 + livepatch: '$MOD_LIVEPATCH': initializing unpatching transition 35 + $MOD_LIVEPATCH: pre_unpatch_callback: vmlinux 36 + $MOD_LIVEPATCH: restore_console_loglevel: restoring console_loglevel 37 + livepatch: '$MOD_LIVEPATCH': starting unpatching transition 38 + livepatch: '$MOD_LIVEPATCH': completing unpatching transition 39 + $MOD_LIVEPATCH: post_unpatch_callback: vmlinux 40 + $MOD_LIVEPATCH: free_loglevel_state: freeing space for the stored console_loglevel 41 + livepatch: '$MOD_LIVEPATCH': unpatching complete 42 + % rmmod $MOD_LIVEPATCH" 43 + 44 + 45 + # TEST: Take over system state change by a cumulative patch 46 + 47 + echo -n "TEST: taking over system state modification ... " 48 + dmesg -C 49 + 50 + load_lp $MOD_LIVEPATCH 51 + load_lp $MOD_LIVEPATCH2 52 + unload_lp $MOD_LIVEPATCH 53 + disable_lp $MOD_LIVEPATCH2 54 + unload_lp $MOD_LIVEPATCH2 55 + 56 + check_result "% modprobe $MOD_LIVEPATCH 57 + livepatch: enabling patch '$MOD_LIVEPATCH' 58 + livepatch: '$MOD_LIVEPATCH': initializing patching transition 59 + $MOD_LIVEPATCH: pre_patch_callback: vmlinux 60 + $MOD_LIVEPATCH: allocate_loglevel_state: allocating space to store console_loglevel 61 + livepatch: '$MOD_LIVEPATCH': starting patching transition 62 + livepatch: '$MOD_LIVEPATCH': completing patching transition 63 + $MOD_LIVEPATCH: post_patch_callback: vmlinux 64 + $MOD_LIVEPATCH: fix_console_loglevel: fixing console_loglevel 65 + livepatch: '$MOD_LIVEPATCH': patching complete 66 + % modprobe $MOD_LIVEPATCH2 67 + livepatch: enabling patch '$MOD_LIVEPATCH2' 68 + livepatch: '$MOD_LIVEPATCH2': initializing patching transition 69 + $MOD_LIVEPATCH2: pre_patch_callback: vmlinux 70 + $MOD_LIVEPATCH2: allocate_loglevel_state: space to store console_loglevel already allocated 71 + livepatch: '$MOD_LIVEPATCH2': starting patching transition 72 + livepatch: '$MOD_LIVEPATCH2': completing patching transition 73 + $MOD_LIVEPATCH2: post_patch_callback: vmlinux 74 + $MOD_LIVEPATCH2: fix_console_loglevel: taking over the console_loglevel change 75 + livepatch: '$MOD_LIVEPATCH2': patching complete 76 + % rmmod $MOD_LIVEPATCH 77 + % echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH2/enabled 78 + livepatch: '$MOD_LIVEPATCH2': initializing unpatching transition 79 + $MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux 80 + $MOD_LIVEPATCH2: restore_console_loglevel: restoring console_loglevel 81 + livepatch: '$MOD_LIVEPATCH2': starting unpatching transition 82 + livepatch: '$MOD_LIVEPATCH2': completing unpatching transition 83 + $MOD_LIVEPATCH2: post_unpatch_callback: vmlinux 84 + $MOD_LIVEPATCH2: free_loglevel_state: freeing space for the stored console_loglevel 85 + livepatch: '$MOD_LIVEPATCH2': unpatching complete 86 + % rmmod $MOD_LIVEPATCH2" 87 + 88 + 89 + # TEST: Take over system state change by a cumulative patch 90 + 91 + echo -n "TEST: compatible cumulative livepatches ... " 92 + dmesg -C 93 + 94 + load_lp $MOD_LIVEPATCH2 95 + load_lp $MOD_LIVEPATCH3 96 + unload_lp $MOD_LIVEPATCH2 97 + load_lp $MOD_LIVEPATCH2 98 + disable_lp $MOD_LIVEPATCH2 99 + unload_lp $MOD_LIVEPATCH2 100 + unload_lp $MOD_LIVEPATCH3 101 + 102 + check_result "% modprobe $MOD_LIVEPATCH2 103 + livepatch: enabling patch '$MOD_LIVEPATCH2' 104 + livepatch: '$MOD_LIVEPATCH2': initializing patching transition 105 + $MOD_LIVEPATCH2: pre_patch_callback: vmlinux 106 + $MOD_LIVEPATCH2: allocate_loglevel_state: allocating space to store console_loglevel 107 + livepatch: '$MOD_LIVEPATCH2': starting patching transition 108 + livepatch: '$MOD_LIVEPATCH2': completing patching transition 109 + $MOD_LIVEPATCH2: post_patch_callback: vmlinux 110 + $MOD_LIVEPATCH2: fix_console_loglevel: fixing console_loglevel 111 + livepatch: '$MOD_LIVEPATCH2': patching complete 112 + % modprobe $MOD_LIVEPATCH3 113 + livepatch: enabling patch '$MOD_LIVEPATCH3' 114 + livepatch: '$MOD_LIVEPATCH3': initializing patching transition 115 + $MOD_LIVEPATCH3: pre_patch_callback: vmlinux 116 + $MOD_LIVEPATCH3: allocate_loglevel_state: space to store console_loglevel already allocated 117 + livepatch: '$MOD_LIVEPATCH3': starting patching transition 118 + livepatch: '$MOD_LIVEPATCH3': completing patching transition 119 + $MOD_LIVEPATCH3: post_patch_callback: vmlinux 120 + $MOD_LIVEPATCH3: fix_console_loglevel: taking over the console_loglevel change 121 + livepatch: '$MOD_LIVEPATCH3': patching complete 122 + % rmmod $MOD_LIVEPATCH2 123 + % modprobe $MOD_LIVEPATCH2 124 + livepatch: enabling patch '$MOD_LIVEPATCH2' 125 + livepatch: '$MOD_LIVEPATCH2': initializing patching transition 126 + $MOD_LIVEPATCH2: pre_patch_callback: vmlinux 127 + $MOD_LIVEPATCH2: allocate_loglevel_state: space to store console_loglevel already allocated 128 + livepatch: '$MOD_LIVEPATCH2': starting patching transition 129 + livepatch: '$MOD_LIVEPATCH2': completing patching transition 130 + $MOD_LIVEPATCH2: post_patch_callback: vmlinux 131 + $MOD_LIVEPATCH2: fix_console_loglevel: taking over the console_loglevel change 132 + livepatch: '$MOD_LIVEPATCH2': patching complete 133 + % echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH2/enabled 134 + livepatch: '$MOD_LIVEPATCH2': initializing unpatching transition 135 + $MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux 136 + $MOD_LIVEPATCH2: restore_console_loglevel: restoring console_loglevel 137 + livepatch: '$MOD_LIVEPATCH2': starting unpatching transition 138 + livepatch: '$MOD_LIVEPATCH2': completing unpatching transition 139 + $MOD_LIVEPATCH2: post_unpatch_callback: vmlinux 140 + $MOD_LIVEPATCH2: free_loglevel_state: freeing space for the stored console_loglevel 141 + livepatch: '$MOD_LIVEPATCH2': unpatching complete 142 + % rmmod $MOD_LIVEPATCH2 143 + % rmmod $MOD_LIVEPATCH3" 144 + 145 + 146 + # TEST: Failure caused by incompatible cumulative livepatches 147 + 148 + echo -n "TEST: incompatible cumulative livepatches ... " 149 + dmesg -C 150 + 151 + load_lp $MOD_LIVEPATCH2 152 + load_failing_mod $MOD_LIVEPATCH 153 + disable_lp $MOD_LIVEPATCH2 154 + unload_lp $MOD_LIVEPATCH2 155 + 156 + check_result "% modprobe $MOD_LIVEPATCH2 157 + livepatch: enabling patch '$MOD_LIVEPATCH2' 158 + livepatch: '$MOD_LIVEPATCH2': initializing patching transition 159 + $MOD_LIVEPATCH2: pre_patch_callback: vmlinux 160 + $MOD_LIVEPATCH2: allocate_loglevel_state: allocating space to store console_loglevel 161 + livepatch: '$MOD_LIVEPATCH2': starting patching transition 162 + livepatch: '$MOD_LIVEPATCH2': completing patching transition 163 + $MOD_LIVEPATCH2: post_patch_callback: vmlinux 164 + $MOD_LIVEPATCH2: fix_console_loglevel: fixing console_loglevel 165 + livepatch: '$MOD_LIVEPATCH2': patching complete 166 + % modprobe $MOD_LIVEPATCH 167 + livepatch: Livepatch patch ($MOD_LIVEPATCH) is not compatible with the already installed livepatches. 168 + modprobe: ERROR: could not insert '$MOD_LIVEPATCH': Invalid argument 169 + % echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH2/enabled 170 + livepatch: '$MOD_LIVEPATCH2': initializing unpatching transition 171 + $MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux 172 + $MOD_LIVEPATCH2: restore_console_loglevel: restoring console_loglevel 173 + livepatch: '$MOD_LIVEPATCH2': starting unpatching transition 174 + livepatch: '$MOD_LIVEPATCH2': completing unpatching transition 175 + $MOD_LIVEPATCH2: post_unpatch_callback: vmlinux 176 + $MOD_LIVEPATCH2: free_loglevel_state: freeing space for the stored console_loglevel 177 + livepatch: '$MOD_LIVEPATCH2': unpatching complete 178 + % rmmod $MOD_LIVEPATCH2" 179 + 180 + exit 0