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