1a2818ee4SJoe Lawrence#!/bin/bash 2a2818ee4SJoe Lawrence# SPDX-License-Identifier: GPL-2.0 3a2818ee4SJoe Lawrence# Copyright (C) 2018 Joe Lawrence <joe.lawrence@redhat.com> 4a2818ee4SJoe Lawrence 5a2818ee4SJoe Lawrence. $(dirname $0)/functions.sh 6a2818ee4SJoe Lawrence 7a2818ee4SJoe LawrenceMOD_LIVEPATCH=test_klp_callbacks_demo 8a2818ee4SJoe LawrenceMOD_LIVEPATCH2=test_klp_callbacks_demo2 9a2818ee4SJoe LawrenceMOD_TARGET=test_klp_callbacks_mod 10a2818ee4SJoe LawrenceMOD_TARGET_BUSY=test_klp_callbacks_busy 11a2818ee4SJoe Lawrence 1235c9e74cSJoe Lawrencesetup_config 13a2818ee4SJoe Lawrence 14a2818ee4SJoe Lawrence 15a2818ee4SJoe Lawrence# Test a combination of loading a kernel module and a livepatch that 16a2818ee4SJoe Lawrence# patches a function in the first module. Load the target module 17a2818ee4SJoe Lawrence# before the livepatch module. Unload them in the same order. 18a2818ee4SJoe Lawrence# 19a2818ee4SJoe Lawrence# - On livepatch enable, before the livepatch transition starts, 20a2818ee4SJoe Lawrence# pre-patch callbacks are executed for vmlinux and $MOD_TARGET (those 21a2818ee4SJoe Lawrence# klp_objects currently loaded). After klp_objects are patched 22a2818ee4SJoe Lawrence# according to the klp_patch, their post-patch callbacks run and the 23a2818ee4SJoe Lawrence# transition completes. 24a2818ee4SJoe Lawrence# 25a2818ee4SJoe Lawrence# - Similarly, on livepatch disable, pre-patch callbacks run before the 26a2818ee4SJoe Lawrence# unpatching transition starts. klp_objects are reverted, post-patch 27a2818ee4SJoe Lawrence# callbacks execute and the transition completes. 28a2818ee4SJoe Lawrence 29*2eeb0d45SJoe Lawrencestart_test "target module before livepatch" 30a2818ee4SJoe Lawrence 31a2818ee4SJoe Lawrenceload_mod $MOD_TARGET 32a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH 33a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH 34a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH 35a2818ee4SJoe Lawrenceunload_mod $MOD_TARGET 36a2818ee4SJoe Lawrence 37a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_TARGET 38a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_init 39a2818ee4SJoe Lawrence% modprobe $MOD_LIVEPATCH 40a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH' 41a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition 42a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux 43a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state 44a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition 45a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing patching transition 46a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: vmlinux 47a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state 48a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': patching complete 49a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled 50a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing unpatching transition 51a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux 52a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state 53a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting unpatching transition 54a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition 55a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: vmlinux 56a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state 57a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete 58a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH 59a2818ee4SJoe Lawrence% rmmod $MOD_TARGET 60a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_exit" 61a2818ee4SJoe Lawrence 62a2818ee4SJoe Lawrence 63a2818ee4SJoe Lawrence# This test is similar to the previous test, but (un)load the livepatch 64a2818ee4SJoe Lawrence# module before the target kernel module. This tests the livepatch 65a2818ee4SJoe Lawrence# core's module_coming handler. 66a2818ee4SJoe Lawrence# 67a2818ee4SJoe Lawrence# - On livepatch enable, only pre/post-patch callbacks are executed for 68a2818ee4SJoe Lawrence# currently loaded klp_objects, in this case, vmlinux. 69a2818ee4SJoe Lawrence# 70a2818ee4SJoe Lawrence# - When a targeted module is subsequently loaded, only its 71a2818ee4SJoe Lawrence# pre/post-patch callbacks are executed. 72a2818ee4SJoe Lawrence# 73a2818ee4SJoe Lawrence# - On livepatch disable, all currently loaded klp_objects' (vmlinux and 74a2818ee4SJoe Lawrence# $MOD_TARGET) pre/post-unpatch callbacks are executed. 75a2818ee4SJoe Lawrence 76*2eeb0d45SJoe Lawrencestart_test "module_coming notifier" 77a2818ee4SJoe Lawrence 78a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH 79a2818ee4SJoe Lawrenceload_mod $MOD_TARGET 80a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH 81a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH 82a2818ee4SJoe Lawrenceunload_mod $MOD_TARGET 83a2818ee4SJoe Lawrence 84a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_LIVEPATCH 85a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH' 86a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition 87a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux 88a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition 89a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing patching transition 90a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: vmlinux 91a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': patching complete 92a2818ee4SJoe Lawrence% modprobe $MOD_TARGET 93a2818ee4SJoe Lawrencelivepatch: applying patch '$MOD_LIVEPATCH' to loading module '$MOD_TARGET' 94a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init 95a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init 96a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_init 97a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled 98a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing unpatching transition 99a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux 100a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state 101a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting unpatching transition 102a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition 103a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: vmlinux 104a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state 105a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete 106a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH 107a2818ee4SJoe Lawrence% rmmod $MOD_TARGET 108a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_exit" 109a2818ee4SJoe Lawrence 110a2818ee4SJoe Lawrence 111a2818ee4SJoe Lawrence# Test loading the livepatch after a targeted kernel module, then unload 112a2818ee4SJoe Lawrence# the kernel module before disabling the livepatch. This tests the 113a2818ee4SJoe Lawrence# livepatch core's module_going handler. 114a2818ee4SJoe Lawrence# 115a2818ee4SJoe Lawrence# - First load a target module, then the livepatch. 116a2818ee4SJoe Lawrence# 117a2818ee4SJoe Lawrence# - When a target module is unloaded, the livepatch is only reverted 118a2818ee4SJoe Lawrence# from that klp_object ($MOD_TARGET). As such, only its pre and 119a2818ee4SJoe Lawrence# post-unpatch callbacks are executed when this occurs. 120a2818ee4SJoe Lawrence# 121a2818ee4SJoe Lawrence# - When the livepatch is disabled, pre and post-unpatch callbacks are 122a2818ee4SJoe Lawrence# run for the remaining klp_object, vmlinux. 123a2818ee4SJoe Lawrence 124*2eeb0d45SJoe Lawrencestart_test "module_going notifier" 125a2818ee4SJoe Lawrence 126a2818ee4SJoe Lawrenceload_mod $MOD_TARGET 127a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH 128a2818ee4SJoe Lawrenceunload_mod $MOD_TARGET 129a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH 130a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH 131a2818ee4SJoe Lawrence 132a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_TARGET 133a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_init 134a2818ee4SJoe Lawrence% modprobe $MOD_LIVEPATCH 135a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH' 136a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition 137a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux 138a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state 139a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition 140a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing patching transition 141a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: vmlinux 142a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state 143a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': patching complete 144a2818ee4SJoe Lawrence% rmmod $MOD_TARGET 145a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_exit 146a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away 147a2818ee4SJoe Lawrencelivepatch: reverting patch '$MOD_LIVEPATCH' on unloading module '$MOD_TARGET' 148a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away 149a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled 150a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing unpatching transition 151a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux 152a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting unpatching transition 153a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition 154a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: vmlinux 155a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete 156a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH" 157a2818ee4SJoe Lawrence 158a2818ee4SJoe Lawrence 159a2818ee4SJoe Lawrence# This test is similar to the previous test, however the livepatch is 160a2818ee4SJoe Lawrence# loaded first. This tests the livepatch core's module_coming and 161a2818ee4SJoe Lawrence# module_going handlers. 162a2818ee4SJoe Lawrence# 163a2818ee4SJoe Lawrence# - First load the livepatch. 164a2818ee4SJoe Lawrence# 165a2818ee4SJoe Lawrence# - When a targeted kernel module is subsequently loaded, only its 166a2818ee4SJoe Lawrence# pre/post-patch callbacks are executed. 167a2818ee4SJoe Lawrence# 168a2818ee4SJoe Lawrence# - When the target module is unloaded, the livepatch is only reverted 169a2818ee4SJoe Lawrence# from the $MOD_TARGET klp_object. As such, only pre and 170a2818ee4SJoe Lawrence# post-unpatch callbacks are executed when this occurs. 171a2818ee4SJoe Lawrence 172*2eeb0d45SJoe Lawrencestart_test "module_coming and module_going notifiers" 173a2818ee4SJoe Lawrence 174a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH 175a2818ee4SJoe Lawrenceload_mod $MOD_TARGET 176a2818ee4SJoe Lawrenceunload_mod $MOD_TARGET 177a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH 178a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH 179a2818ee4SJoe Lawrence 180a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_LIVEPATCH 181a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH' 182a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition 183a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux 184a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition 185a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing patching transition 186a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: vmlinux 187a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': patching complete 188a2818ee4SJoe Lawrence% modprobe $MOD_TARGET 189a2818ee4SJoe Lawrencelivepatch: applying patch '$MOD_LIVEPATCH' to loading module '$MOD_TARGET' 190a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init 191a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init 192a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_init 193a2818ee4SJoe Lawrence% rmmod $MOD_TARGET 194a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_exit 195a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away 196a2818ee4SJoe Lawrencelivepatch: reverting patch '$MOD_LIVEPATCH' on unloading module '$MOD_TARGET' 197a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away 198a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled 199a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing unpatching transition 200a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux 201a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting unpatching transition 202a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition 203a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: vmlinux 204a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete 205a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH" 206a2818ee4SJoe Lawrence 207a2818ee4SJoe Lawrence 208a2818ee4SJoe Lawrence# A simple test of loading a livepatch without one of its patch target 209a2818ee4SJoe Lawrence# klp_objects ever loaded ($MOD_TARGET). 210a2818ee4SJoe Lawrence# 211a2818ee4SJoe Lawrence# - Load the livepatch. 212a2818ee4SJoe Lawrence# 213a2818ee4SJoe Lawrence# - As expected, only pre/post-(un)patch handlers are executed for 214a2818ee4SJoe Lawrence# vmlinux. 215a2818ee4SJoe Lawrence 216*2eeb0d45SJoe Lawrencestart_test "target module not present" 217a2818ee4SJoe Lawrence 218a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH 219a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH 220a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH 221a2818ee4SJoe Lawrence 222a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_LIVEPATCH 223a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH' 224a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition 225a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux 226a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition 227a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing patching transition 228a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: vmlinux 229a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': patching complete 230a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled 231a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing unpatching transition 232a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux 233a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting unpatching transition 234a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition 235a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: vmlinux 236a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete 237a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH" 238a2818ee4SJoe Lawrence 239a2818ee4SJoe Lawrence 240a2818ee4SJoe Lawrence# Test a scenario where a vmlinux pre-patch callback returns a non-zero 241a2818ee4SJoe Lawrence# status (ie, failure). 242a2818ee4SJoe Lawrence# 243a2818ee4SJoe Lawrence# - First load a target module. 244a2818ee4SJoe Lawrence# 245a2818ee4SJoe Lawrence# - Load the livepatch module, setting its 'pre_patch_ret' value to -19 246a2818ee4SJoe Lawrence# (-ENODEV). When its vmlinux pre-patch callback executes, this 247a2818ee4SJoe Lawrence# status code will propagate back to the module-loading subsystem. 248a2818ee4SJoe Lawrence# The result is that the insmod command refuses to load the livepatch 249a2818ee4SJoe Lawrence# module. 250a2818ee4SJoe Lawrence 251*2eeb0d45SJoe Lawrencestart_test "pre-patch callback -ENODEV" 252a2818ee4SJoe Lawrence 253a2818ee4SJoe Lawrenceload_mod $MOD_TARGET 254a2818ee4SJoe Lawrenceload_failing_mod $MOD_LIVEPATCH pre_patch_ret=-19 255a2818ee4SJoe Lawrenceunload_mod $MOD_TARGET 256a2818ee4SJoe Lawrence 257a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_TARGET 258a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_init 259a2818ee4SJoe Lawrence% modprobe $MOD_LIVEPATCH pre_patch_ret=-19 260a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH' 261a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition 262a2818ee4SJoe Lawrencetest_klp_callbacks_demo: pre_patch_callback: vmlinux 263a2818ee4SJoe Lawrencelivepatch: pre-patch callback failed for object 'vmlinux' 264a2818ee4SJoe Lawrencelivepatch: failed to enable patch '$MOD_LIVEPATCH' 265a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': canceling patching transition, going to unpatch 266a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition 267a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete 268a2818ee4SJoe Lawrencemodprobe: ERROR: could not insert '$MOD_LIVEPATCH': No such device 269a2818ee4SJoe Lawrence% rmmod $MOD_TARGET 270a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_exit" 271a2818ee4SJoe Lawrence 272a2818ee4SJoe Lawrence 273a2818ee4SJoe Lawrence# Similar to the previous test, setup a livepatch such that its vmlinux 274a2818ee4SJoe Lawrence# pre-patch callback returns success. However, when a targeted kernel 275a2818ee4SJoe Lawrence# module is later loaded, have the livepatch return a failing status 276a2818ee4SJoe Lawrence# code. 277a2818ee4SJoe Lawrence# 278a2818ee4SJoe Lawrence# - Load the livepatch, vmlinux pre-patch callback succeeds. 279a2818ee4SJoe Lawrence# 280a2818ee4SJoe Lawrence# - Set a trap so subsequent pre-patch callbacks to this livepatch will 281a2818ee4SJoe Lawrence# return -ENODEV. 282a2818ee4SJoe Lawrence# 283a2818ee4SJoe Lawrence# - The livepatch pre-patch callback for subsequently loaded target 284a2818ee4SJoe Lawrence# modules will return failure, so the module loader refuses to load 285a2818ee4SJoe Lawrence# the kernel module. No post-patch or pre/post-unpatch callbacks are 286a2818ee4SJoe Lawrence# executed for this klp_object. 287a2818ee4SJoe Lawrence# 288a2818ee4SJoe Lawrence# - Pre/post-unpatch callbacks are run for the vmlinux klp_object. 289a2818ee4SJoe Lawrence 290*2eeb0d45SJoe Lawrencestart_test "module_coming + pre-patch callback -ENODEV" 291a2818ee4SJoe Lawrence 292a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH 293a2818ee4SJoe Lawrenceset_pre_patch_ret $MOD_LIVEPATCH -19 294a2818ee4SJoe Lawrenceload_failing_mod $MOD_TARGET 295a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH 296a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH 297a2818ee4SJoe Lawrence 298a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_LIVEPATCH 299a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH' 300a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition 301a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux 302a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition 303a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing patching transition 304a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: vmlinux 305a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': patching complete 306a2818ee4SJoe Lawrence% echo -19 > /sys/module/$MOD_LIVEPATCH/parameters/pre_patch_ret 307a2818ee4SJoe Lawrence% modprobe $MOD_TARGET 308a2818ee4SJoe Lawrencelivepatch: applying patch '$MOD_LIVEPATCH' to loading module '$MOD_TARGET' 309a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init 310a2818ee4SJoe Lawrencelivepatch: pre-patch callback failed for object '$MOD_TARGET' 311a2818ee4SJoe Lawrencelivepatch: patch '$MOD_LIVEPATCH' failed for module '$MOD_TARGET', refusing to load module '$MOD_TARGET' 312a2818ee4SJoe Lawrencemodprobe: ERROR: could not insert '$MOD_TARGET': No such device 313a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled 314a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing unpatching transition 315a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux 316a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting unpatching transition 317a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition 318a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: vmlinux 319a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete 320a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH" 321a2818ee4SJoe Lawrence 322a2818ee4SJoe Lawrence 323a2818ee4SJoe Lawrence# Test loading multiple targeted kernel modules. This test-case is 324a2818ee4SJoe Lawrence# mainly for comparing with the next test-case. 325a2818ee4SJoe Lawrence# 326a2818ee4SJoe Lawrence# - Load a target "busy" kernel module which kicks off a worker function 327a2818ee4SJoe Lawrence# that immediately exits. 328a2818ee4SJoe Lawrence# 329a2818ee4SJoe Lawrence# - Proceed with loading the livepatch and another ordinary target 330a2818ee4SJoe Lawrence# module. Post-patch callbacks are executed and the transition 331a2818ee4SJoe Lawrence# completes quickly. 332a2818ee4SJoe Lawrence 333*2eeb0d45SJoe Lawrencestart_test "multiple target modules" 334a2818ee4SJoe Lawrence 335547840bdSJoe Lawrenceload_mod $MOD_TARGET_BUSY block_transition=N 336a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH 337a2818ee4SJoe Lawrenceload_mod $MOD_TARGET 338a2818ee4SJoe Lawrenceunload_mod $MOD_TARGET 339a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH 340a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH 341a2818ee4SJoe Lawrenceunload_mod $MOD_TARGET_BUSY 342a2818ee4SJoe Lawrence 343547840bdSJoe Lawrencecheck_result "% modprobe $MOD_TARGET_BUSY block_transition=N 344a2818ee4SJoe Lawrence$MOD_TARGET_BUSY: ${MOD_TARGET_BUSY}_init 345547840bdSJoe Lawrence$MOD_TARGET_BUSY: busymod_work_func enter 346a2818ee4SJoe Lawrence$MOD_TARGET_BUSY: busymod_work_func exit 347a2818ee4SJoe Lawrence% modprobe $MOD_LIVEPATCH 348a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH' 349a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition 350a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux 351a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET_BUSY -> [MODULE_STATE_LIVE] Normal state 352a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition 353a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing patching transition 354a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: vmlinux 355a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: $MOD_TARGET_BUSY -> [MODULE_STATE_LIVE] Normal state 356a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': patching complete 357a2818ee4SJoe Lawrence% modprobe $MOD_TARGET 358a2818ee4SJoe Lawrencelivepatch: applying patch '$MOD_LIVEPATCH' to loading module '$MOD_TARGET' 359a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init 360a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init 361a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_init 362a2818ee4SJoe Lawrence% rmmod $MOD_TARGET 363a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_exit 364a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away 365a2818ee4SJoe Lawrencelivepatch: reverting patch '$MOD_LIVEPATCH' on unloading module '$MOD_TARGET' 366a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away 367a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled 368a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing unpatching transition 369a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux 370a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: $MOD_TARGET_BUSY -> [MODULE_STATE_LIVE] Normal state 371a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting unpatching transition 372a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition 373a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: vmlinux 374a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET_BUSY -> [MODULE_STATE_LIVE] Normal state 375a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete 376a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH 377a2818ee4SJoe Lawrence% rmmod $MOD_TARGET_BUSY 378a2818ee4SJoe Lawrence$MOD_TARGET_BUSY: ${MOD_TARGET_BUSY}_exit" 379a2818ee4SJoe Lawrence 380a2818ee4SJoe Lawrence 381a2818ee4SJoe Lawrence# A similar test as the previous one, but force the "busy" kernel module 382547840bdSJoe Lawrence# to block the livepatch transition. 383a2818ee4SJoe Lawrence# 384a2818ee4SJoe Lawrence# The livepatching core will refuse to patch a task that is currently 385a2818ee4SJoe Lawrence# executing a to-be-patched function -- the consistency model stalls the 386a2818ee4SJoe Lawrence# current patch transition until this safety-check is met. Test a 387a2818ee4SJoe Lawrence# scenario where one of a livepatch's target klp_objects sits on such a 388a2818ee4SJoe Lawrence# function for a long time. Meanwhile, load and unload other target 389a2818ee4SJoe Lawrence# kernel modules while the livepatch transition is in progress. 390a2818ee4SJoe Lawrence# 391547840bdSJoe Lawrence# - Load the "busy" kernel module, this time make its work function loop 392a2818ee4SJoe Lawrence# 393a2818ee4SJoe Lawrence# - Meanwhile, the livepatch is loaded. Notice that the patch 394a2818ee4SJoe Lawrence# transition does not complete as the targeted "busy" module is 395a2818ee4SJoe Lawrence# sitting on a to-be-patched function. 396a2818ee4SJoe Lawrence# 397a2818ee4SJoe Lawrence# - Load a second target module (this one is an ordinary idle kernel 398a2818ee4SJoe Lawrence# module). Note that *no* post-patch callbacks will be executed while 399a2818ee4SJoe Lawrence# the livepatch is still in transition. 400a2818ee4SJoe Lawrence# 401a2818ee4SJoe Lawrence# - Request an unload of the simple kernel module. The patch is still 402a2818ee4SJoe Lawrence# transitioning, so its pre-unpatch callbacks are skipped. 403a2818ee4SJoe Lawrence# 404a2818ee4SJoe Lawrence# - Finally the livepatch is disabled. Since none of the patch's 405a2818ee4SJoe Lawrence# klp_object's post-patch callbacks executed, the remaining 406a2818ee4SJoe Lawrence# klp_object's pre-unpatch callbacks are skipped. 407a2818ee4SJoe Lawrence 408*2eeb0d45SJoe Lawrencestart_test "busy target module" 409a2818ee4SJoe Lawrence 410547840bdSJoe Lawrenceload_mod $MOD_TARGET_BUSY block_transition=Y 411a2818ee4SJoe Lawrenceload_lp_nowait $MOD_LIVEPATCH 412547840bdSJoe Lawrence 413547840bdSJoe Lawrence# Wait until the livepatch reports in-transition state, i.e. that it's 414547840bdSJoe Lawrence# stalled on $MOD_TARGET_BUSY::busymod_work_func() 415547840bdSJoe Lawrenceloop_until 'grep -q '^1$' /sys/kernel/livepatch/$MOD_LIVEPATCH/transition' || 416547840bdSJoe Lawrence die "failed to stall transition" 417547840bdSJoe Lawrence 418a2818ee4SJoe Lawrenceload_mod $MOD_TARGET 419a2818ee4SJoe Lawrenceunload_mod $MOD_TARGET 420a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH 421a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH 422a2818ee4SJoe Lawrenceunload_mod $MOD_TARGET_BUSY 423a2818ee4SJoe Lawrence 424547840bdSJoe Lawrencecheck_result "% modprobe $MOD_TARGET_BUSY block_transition=Y 425a2818ee4SJoe Lawrence$MOD_TARGET_BUSY: ${MOD_TARGET_BUSY}_init 426547840bdSJoe Lawrence$MOD_TARGET_BUSY: busymod_work_func enter 427a2818ee4SJoe Lawrence% modprobe $MOD_LIVEPATCH 428a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH' 429a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition 430a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux 431a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET_BUSY -> [MODULE_STATE_LIVE] Normal state 432a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition 433a2818ee4SJoe Lawrence% modprobe $MOD_TARGET 434a2818ee4SJoe Lawrencelivepatch: applying patch '$MOD_LIVEPATCH' to loading module '$MOD_TARGET' 435a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init 436a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_init 437a2818ee4SJoe Lawrence% rmmod $MOD_TARGET 438a2818ee4SJoe Lawrence$MOD_TARGET: ${MOD_TARGET}_exit 439a2818ee4SJoe Lawrencelivepatch: reverting patch '$MOD_LIVEPATCH' on unloading module '$MOD_TARGET' 440a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away 441a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled 442a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': reversing transition from patching to unpatching 443a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting unpatching transition 444a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition 445a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: vmlinux 446a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET_BUSY -> [MODULE_STATE_LIVE] Normal state 447a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete 448a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH 449a2818ee4SJoe Lawrence% rmmod $MOD_TARGET_BUSY 450a2818ee4SJoe Lawrence$MOD_TARGET_BUSY: busymod_work_func exit 451a2818ee4SJoe Lawrence$MOD_TARGET_BUSY: ${MOD_TARGET_BUSY}_exit" 452a2818ee4SJoe Lawrence 453a2818ee4SJoe Lawrence 454a2818ee4SJoe Lawrence# Test loading multiple livepatches. This test-case is mainly for comparing 455a2818ee4SJoe Lawrence# with the next test-case. 456a2818ee4SJoe Lawrence# 457a2818ee4SJoe Lawrence# - Load and unload two livepatches, pre and post (un)patch callbacks 458a2818ee4SJoe Lawrence# execute as each patch progresses through its (un)patching 459a2818ee4SJoe Lawrence# transition. 460a2818ee4SJoe Lawrence 461*2eeb0d45SJoe Lawrencestart_test "multiple livepatches" 462a2818ee4SJoe Lawrence 463a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH 464a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH2 465a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH2 466a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH 467a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH2 468a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH 469a2818ee4SJoe Lawrence 470a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_LIVEPATCH 471a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH' 472a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition 473a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux 474a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition 475a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing patching transition 476a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: vmlinux 477a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': patching complete 478a2818ee4SJoe Lawrence% modprobe $MOD_LIVEPATCH2 479a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH2' 480a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': initializing patching transition 481a2818ee4SJoe Lawrence$MOD_LIVEPATCH2: pre_patch_callback: vmlinux 482a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': starting patching transition 483a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': completing patching transition 484a2818ee4SJoe Lawrence$MOD_LIVEPATCH2: post_patch_callback: vmlinux 485a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': patching complete 486a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH2/enabled 487a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': initializing unpatching transition 488a2818ee4SJoe Lawrence$MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux 489a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': starting unpatching transition 490a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': completing unpatching transition 491a2818ee4SJoe Lawrence$MOD_LIVEPATCH2: post_unpatch_callback: vmlinux 492a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': unpatching complete 493a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled 494a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing unpatching transition 495a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux 496a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting unpatching transition 497a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing unpatching transition 498a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_unpatch_callback: vmlinux 499a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': unpatching complete 500a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH2 501a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH" 502a2818ee4SJoe Lawrence 503a2818ee4SJoe Lawrence 504a2818ee4SJoe Lawrence# Load multiple livepatches, but the second as an 'atomic-replace' 505a2818ee4SJoe Lawrence# patch. When the latter loads, the original livepatch should be 506a2818ee4SJoe Lawrence# disabled and *none* of its pre/post-unpatch callbacks executed. On 507a2818ee4SJoe Lawrence# the other hand, when the atomic-replace livepatch is disabled, its 508a2818ee4SJoe Lawrence# pre/post-unpatch callbacks *should* be executed. 509a2818ee4SJoe Lawrence# 510a2818ee4SJoe Lawrence# - Load and unload two livepatches, the second of which has its 511a2818ee4SJoe Lawrence# .replace flag set true. 512a2818ee4SJoe Lawrence# 513a2818ee4SJoe Lawrence# - Pre and post patch callbacks are executed for both livepatches. 514a2818ee4SJoe Lawrence# 515a2818ee4SJoe Lawrence# - Once the atomic replace module is loaded, only its pre and post 516a2818ee4SJoe Lawrence# unpatch callbacks are executed. 517a2818ee4SJoe Lawrence 518*2eeb0d45SJoe Lawrencestart_test "atomic replace" 519a2818ee4SJoe Lawrence 520a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH 521a2818ee4SJoe Lawrenceload_lp $MOD_LIVEPATCH2 replace=1 522a2818ee4SJoe Lawrencedisable_lp $MOD_LIVEPATCH2 523a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH2 524a2818ee4SJoe Lawrenceunload_lp $MOD_LIVEPATCH 525a2818ee4SJoe Lawrence 526a2818ee4SJoe Lawrencecheck_result "% modprobe $MOD_LIVEPATCH 527a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH' 528a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': initializing patching transition 529a2818ee4SJoe Lawrence$MOD_LIVEPATCH: pre_patch_callback: vmlinux 530a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': starting patching transition 531a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': completing patching transition 532a2818ee4SJoe Lawrence$MOD_LIVEPATCH: post_patch_callback: vmlinux 533a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH': patching complete 534a2818ee4SJoe Lawrence% modprobe $MOD_LIVEPATCH2 replace=1 535a2818ee4SJoe Lawrencelivepatch: enabling patch '$MOD_LIVEPATCH2' 536a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': initializing patching transition 537a2818ee4SJoe Lawrence$MOD_LIVEPATCH2: pre_patch_callback: vmlinux 538a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': starting patching transition 539a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': completing patching transition 540a2818ee4SJoe Lawrence$MOD_LIVEPATCH2: post_patch_callback: vmlinux 541a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': patching complete 542a2818ee4SJoe Lawrence% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH2/enabled 543a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': initializing unpatching transition 544a2818ee4SJoe Lawrence$MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux 545a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': starting unpatching transition 546a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': completing unpatching transition 547a2818ee4SJoe Lawrence$MOD_LIVEPATCH2: post_unpatch_callback: vmlinux 548a2818ee4SJoe Lawrencelivepatch: '$MOD_LIVEPATCH2': unpatching complete 549a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH2 550a2818ee4SJoe Lawrence% rmmod $MOD_LIVEPATCH" 551a2818ee4SJoe Lawrence 552a2818ee4SJoe Lawrence 553a2818ee4SJoe Lawrenceexit 0 554