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