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