Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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