554 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03# Copyright (C) 2018 Joe Lawrence <joe.lawrence@redhat.com>4 5. $(dirname $0)/functions.sh6 7MOD_LIVEPATCH=test_klp_callbacks_demo8MOD_LIVEPATCH2=test_klp_callbacks_demo29MOD_TARGET=test_klp_callbacks_mod10MOD_TARGET_BUSY=test_klp_callbacks_busy11 12setup_config13 14 15# Test a combination of loading a kernel module and a livepatch that16# patches a function in the first module. Load the target module17# before the livepatch module. Unload them in the same order.18#19# - On livepatch enable, before the livepatch transition starts,20# pre-patch callbacks are executed for vmlinux and $MOD_TARGET (those21# klp_objects currently loaded). After klp_objects are patched22# according to the klp_patch, their post-patch callbacks run and the23# transition completes.24#25# - Similarly, on livepatch disable, pre-patch callbacks run before the26# unpatching transition starts. klp_objects are reverted, post-patch27# callbacks execute and the transition completes.28 29start_test "target module before livepatch"30 31load_mod $MOD_TARGET32load_lp $MOD_LIVEPATCH33disable_lp $MOD_LIVEPATCH34unload_lp $MOD_LIVEPATCH35unload_mod $MOD_TARGET36 37check_result "% insmod test_modules/$MOD_TARGET.ko38$MOD_TARGET: ${MOD_TARGET}_init39% insmod test_modules/$MOD_LIVEPATCH.ko40livepatch: enabling patch '$MOD_LIVEPATCH'41livepatch: '$MOD_LIVEPATCH': initializing patching transition42$MOD_LIVEPATCH: pre_patch_callback: vmlinux43$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state44livepatch: '$MOD_LIVEPATCH': starting patching transition45livepatch: '$MOD_LIVEPATCH': completing patching transition46$MOD_LIVEPATCH: post_patch_callback: vmlinux47$MOD_LIVEPATCH: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state48livepatch: '$MOD_LIVEPATCH': patching complete49% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled50livepatch: '$MOD_LIVEPATCH': initializing unpatching transition51$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux52$MOD_LIVEPATCH: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state53livepatch: '$MOD_LIVEPATCH': starting unpatching transition54livepatch: '$MOD_LIVEPATCH': completing unpatching transition55$MOD_LIVEPATCH: post_unpatch_callback: vmlinux56$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state57livepatch: '$MOD_LIVEPATCH': unpatching complete58% rmmod $MOD_LIVEPATCH59% rmmod $MOD_TARGET60$MOD_TARGET: ${MOD_TARGET}_exit"61 62 63# This test is similar to the previous test, but (un)load the livepatch64# module before the target kernel module. This tests the livepatch65# core's module_coming handler.66#67# - On livepatch enable, only pre/post-patch callbacks are executed for68# currently loaded klp_objects, in this case, vmlinux.69#70# - When a targeted module is subsequently loaded, only its71# pre/post-patch callbacks are executed.72#73# - On livepatch disable, all currently loaded klp_objects' (vmlinux and74# $MOD_TARGET) pre/post-unpatch callbacks are executed.75 76start_test "module_coming notifier"77 78load_lp $MOD_LIVEPATCH79load_mod $MOD_TARGET80disable_lp $MOD_LIVEPATCH81unload_lp $MOD_LIVEPATCH82unload_mod $MOD_TARGET83 84check_result "% insmod test_modules/$MOD_LIVEPATCH.ko85livepatch: enabling patch '$MOD_LIVEPATCH'86livepatch: '$MOD_LIVEPATCH': initializing patching transition87$MOD_LIVEPATCH: pre_patch_callback: vmlinux88livepatch: '$MOD_LIVEPATCH': starting patching transition89livepatch: '$MOD_LIVEPATCH': completing patching transition90$MOD_LIVEPATCH: post_patch_callback: vmlinux91livepatch: '$MOD_LIVEPATCH': patching complete92% insmod test_modules/$MOD_TARGET.ko93livepatch: applying patch '$MOD_LIVEPATCH' to loading module '$MOD_TARGET'94$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init95$MOD_LIVEPATCH: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init96$MOD_TARGET: ${MOD_TARGET}_init97% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled98livepatch: '$MOD_LIVEPATCH': initializing unpatching transition99$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux100$MOD_LIVEPATCH: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state101livepatch: '$MOD_LIVEPATCH': starting unpatching transition102livepatch: '$MOD_LIVEPATCH': completing unpatching transition103$MOD_LIVEPATCH: post_unpatch_callback: vmlinux104$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state105livepatch: '$MOD_LIVEPATCH': unpatching complete106% rmmod $MOD_LIVEPATCH107% rmmod $MOD_TARGET108$MOD_TARGET: ${MOD_TARGET}_exit"109 110 111# Test loading the livepatch after a targeted kernel module, then unload112# the kernel module before disabling the livepatch. This tests the113# livepatch core's module_going handler.114#115# - First load a target module, then the livepatch.116#117# - When a target module is unloaded, the livepatch is only reverted118# from that klp_object ($MOD_TARGET). As such, only its pre and119# post-unpatch callbacks are executed when this occurs.120#121# - When the livepatch is disabled, pre and post-unpatch callbacks are122# run for the remaining klp_object, vmlinux.123 124start_test "module_going notifier"125 126load_mod $MOD_TARGET127load_lp $MOD_LIVEPATCH128unload_mod $MOD_TARGET129disable_lp $MOD_LIVEPATCH130unload_lp $MOD_LIVEPATCH131 132check_result "% insmod test_modules/$MOD_TARGET.ko133$MOD_TARGET: ${MOD_TARGET}_init134% insmod test_modules/$MOD_LIVEPATCH.ko135livepatch: enabling patch '$MOD_LIVEPATCH'136livepatch: '$MOD_LIVEPATCH': initializing patching transition137$MOD_LIVEPATCH: pre_patch_callback: vmlinux138$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state139livepatch: '$MOD_LIVEPATCH': starting patching transition140livepatch: '$MOD_LIVEPATCH': completing patching transition141$MOD_LIVEPATCH: post_patch_callback: vmlinux142$MOD_LIVEPATCH: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_LIVE] Normal state143livepatch: '$MOD_LIVEPATCH': patching complete144% rmmod $MOD_TARGET145$MOD_TARGET: ${MOD_TARGET}_exit146$MOD_LIVEPATCH: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away147livepatch: reverting patch '$MOD_LIVEPATCH' on unloading module '$MOD_TARGET'148$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away149% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled150livepatch: '$MOD_LIVEPATCH': initializing unpatching transition151$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux152livepatch: '$MOD_LIVEPATCH': starting unpatching transition153livepatch: '$MOD_LIVEPATCH': completing unpatching transition154$MOD_LIVEPATCH: post_unpatch_callback: vmlinux155livepatch: '$MOD_LIVEPATCH': unpatching complete156% rmmod $MOD_LIVEPATCH"157 158 159# This test is similar to the previous test, however the livepatch is160# loaded first. This tests the livepatch core's module_coming and161# module_going handlers.162#163# - First load the livepatch.164#165# - When a targeted kernel module is subsequently loaded, only its166# pre/post-patch callbacks are executed.167#168# - When the target module is unloaded, the livepatch is only reverted169# from the $MOD_TARGET klp_object. As such, only pre and170# post-unpatch callbacks are executed when this occurs.171 172start_test "module_coming and module_going notifiers"173 174load_lp $MOD_LIVEPATCH175load_mod $MOD_TARGET176unload_mod $MOD_TARGET177disable_lp $MOD_LIVEPATCH178unload_lp $MOD_LIVEPATCH179 180check_result "% insmod test_modules/$MOD_LIVEPATCH.ko181livepatch: enabling patch '$MOD_LIVEPATCH'182livepatch: '$MOD_LIVEPATCH': initializing patching transition183$MOD_LIVEPATCH: pre_patch_callback: vmlinux184livepatch: '$MOD_LIVEPATCH': starting patching transition185livepatch: '$MOD_LIVEPATCH': completing patching transition186$MOD_LIVEPATCH: post_patch_callback: vmlinux187livepatch: '$MOD_LIVEPATCH': patching complete188% insmod test_modules/$MOD_TARGET.ko189livepatch: applying patch '$MOD_LIVEPATCH' to loading module '$MOD_TARGET'190$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init191$MOD_LIVEPATCH: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init192$MOD_TARGET: ${MOD_TARGET}_init193% rmmod $MOD_TARGET194$MOD_TARGET: ${MOD_TARGET}_exit195$MOD_LIVEPATCH: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away196livepatch: reverting patch '$MOD_LIVEPATCH' on unloading module '$MOD_TARGET'197$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away198% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled199livepatch: '$MOD_LIVEPATCH': initializing unpatching transition200$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux201livepatch: '$MOD_LIVEPATCH': starting unpatching transition202livepatch: '$MOD_LIVEPATCH': completing unpatching transition203$MOD_LIVEPATCH: post_unpatch_callback: vmlinux204livepatch: '$MOD_LIVEPATCH': unpatching complete205% rmmod $MOD_LIVEPATCH"206 207 208# A simple test of loading a livepatch without one of its patch target209# klp_objects ever loaded ($MOD_TARGET).210#211# - Load the livepatch.212#213# - As expected, only pre/post-(un)patch handlers are executed for214# vmlinux.215 216start_test "target module not present"217 218load_lp $MOD_LIVEPATCH219disable_lp $MOD_LIVEPATCH220unload_lp $MOD_LIVEPATCH221 222check_result "% insmod test_modules/$MOD_LIVEPATCH.ko223livepatch: enabling patch '$MOD_LIVEPATCH'224livepatch: '$MOD_LIVEPATCH': initializing patching transition225$MOD_LIVEPATCH: pre_patch_callback: vmlinux226livepatch: '$MOD_LIVEPATCH': starting patching transition227livepatch: '$MOD_LIVEPATCH': completing patching transition228$MOD_LIVEPATCH: post_patch_callback: vmlinux229livepatch: '$MOD_LIVEPATCH': patching complete230% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled231livepatch: '$MOD_LIVEPATCH': initializing unpatching transition232$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux233livepatch: '$MOD_LIVEPATCH': starting unpatching transition234livepatch: '$MOD_LIVEPATCH': completing unpatching transition235$MOD_LIVEPATCH: post_unpatch_callback: vmlinux236livepatch: '$MOD_LIVEPATCH': unpatching complete237% rmmod $MOD_LIVEPATCH"238 239 240# Test a scenario where a vmlinux pre-patch callback returns a non-zero241# status (ie, failure).242#243# - First load a target module.244#245# - Load the livepatch module, setting its 'pre_patch_ret' value to -19246# (-ENODEV). When its vmlinux pre-patch callback executes, this247# status code will propagate back to the module-loading subsystem.248# The result is that the insmod command refuses to load the livepatch249# module.250 251start_test "pre-patch callback -ENODEV"252 253load_mod $MOD_TARGET254load_failing_mod $MOD_LIVEPATCH pre_patch_ret=-19255unload_mod $MOD_TARGET256 257check_result "% insmod test_modules/$MOD_TARGET.ko258$MOD_TARGET: ${MOD_TARGET}_init259% insmod test_modules/$MOD_LIVEPATCH.ko pre_patch_ret=-19260livepatch: enabling patch '$MOD_LIVEPATCH'261livepatch: '$MOD_LIVEPATCH': initializing patching transition262test_klp_callbacks_demo: pre_patch_callback: vmlinux263livepatch: pre-patch callback failed for object 'vmlinux'264livepatch: failed to enable patch '$MOD_LIVEPATCH'265livepatch: '$MOD_LIVEPATCH': canceling patching transition, going to unpatch266livepatch: '$MOD_LIVEPATCH': completing unpatching transition267livepatch: '$MOD_LIVEPATCH': unpatching complete268insmod: ERROR: could not insert module test_modules/$MOD_LIVEPATCH.ko: No such device269% rmmod $MOD_TARGET270$MOD_TARGET: ${MOD_TARGET}_exit"271 272 273# Similar to the previous test, setup a livepatch such that its vmlinux274# pre-patch callback returns success. However, when a targeted kernel275# module is later loaded, have the livepatch return a failing status276# code.277#278# - Load the livepatch, vmlinux pre-patch callback succeeds.279#280# - Set a trap so subsequent pre-patch callbacks to this livepatch will281# return -ENODEV.282#283# - The livepatch pre-patch callback for subsequently loaded target284# modules will return failure, so the module loader refuses to load285# the kernel module. No post-patch or pre/post-unpatch callbacks are286# executed for this klp_object.287#288# - Pre/post-unpatch callbacks are run for the vmlinux klp_object.289 290start_test "module_coming + pre-patch callback -ENODEV"291 292load_lp $MOD_LIVEPATCH293set_pre_patch_ret $MOD_LIVEPATCH -19294load_failing_mod $MOD_TARGET295disable_lp $MOD_LIVEPATCH296unload_lp $MOD_LIVEPATCH297 298check_result "% insmod test_modules/$MOD_LIVEPATCH.ko299livepatch: enabling patch '$MOD_LIVEPATCH'300livepatch: '$MOD_LIVEPATCH': initializing patching transition301$MOD_LIVEPATCH: pre_patch_callback: vmlinux302livepatch: '$MOD_LIVEPATCH': starting patching transition303livepatch: '$MOD_LIVEPATCH': completing patching transition304$MOD_LIVEPATCH: post_patch_callback: vmlinux305livepatch: '$MOD_LIVEPATCH': patching complete306% echo -19 > /sys/module/$MOD_LIVEPATCH/parameters/pre_patch_ret307% insmod test_modules/$MOD_TARGET.ko308livepatch: applying patch '$MOD_LIVEPATCH' to loading module '$MOD_TARGET'309$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init310livepatch: pre-patch callback failed for object '$MOD_TARGET'311livepatch: patch '$MOD_LIVEPATCH' failed for module '$MOD_TARGET', refusing to load module '$MOD_TARGET'312insmod: ERROR: could not insert module test_modules/$MOD_TARGET.ko: No such device313% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled314livepatch: '$MOD_LIVEPATCH': initializing unpatching transition315$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux316livepatch: '$MOD_LIVEPATCH': starting unpatching transition317livepatch: '$MOD_LIVEPATCH': completing unpatching transition318$MOD_LIVEPATCH: post_unpatch_callback: vmlinux319livepatch: '$MOD_LIVEPATCH': unpatching complete320% rmmod $MOD_LIVEPATCH"321 322 323# Test loading multiple targeted kernel modules. This test-case is324# mainly for comparing with the next test-case.325#326# - Load a target "busy" kernel module which kicks off a worker function327# that immediately exits.328#329# - Proceed with loading the livepatch and another ordinary target330# module. Post-patch callbacks are executed and the transition331# completes quickly.332 333start_test "multiple target modules"334 335load_mod $MOD_TARGET_BUSY block_transition=N336load_lp $MOD_LIVEPATCH337load_mod $MOD_TARGET338unload_mod $MOD_TARGET339disable_lp $MOD_LIVEPATCH340unload_lp $MOD_LIVEPATCH341unload_mod $MOD_TARGET_BUSY342 343check_result "% insmod test_modules/$MOD_TARGET_BUSY.ko block_transition=N344$MOD_TARGET_BUSY: ${MOD_TARGET_BUSY}_init345$MOD_TARGET_BUSY: busymod_work_func enter346$MOD_TARGET_BUSY: busymod_work_func exit347% insmod test_modules/$MOD_LIVEPATCH.ko348livepatch: enabling patch '$MOD_LIVEPATCH'349livepatch: '$MOD_LIVEPATCH': initializing patching transition350$MOD_LIVEPATCH: pre_patch_callback: vmlinux351$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET_BUSY -> [MODULE_STATE_LIVE] Normal state352livepatch: '$MOD_LIVEPATCH': starting patching transition353livepatch: '$MOD_LIVEPATCH': completing patching transition354$MOD_LIVEPATCH: post_patch_callback: vmlinux355$MOD_LIVEPATCH: post_patch_callback: $MOD_TARGET_BUSY -> [MODULE_STATE_LIVE] Normal state356livepatch: '$MOD_LIVEPATCH': patching complete357% insmod test_modules/$MOD_TARGET.ko358livepatch: applying patch '$MOD_LIVEPATCH' to loading module '$MOD_TARGET'359$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init360$MOD_LIVEPATCH: post_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init361$MOD_TARGET: ${MOD_TARGET}_init362% rmmod $MOD_TARGET363$MOD_TARGET: ${MOD_TARGET}_exit364$MOD_LIVEPATCH: pre_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away365livepatch: reverting patch '$MOD_LIVEPATCH' on unloading module '$MOD_TARGET'366$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away367% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled368livepatch: '$MOD_LIVEPATCH': initializing unpatching transition369$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux370$MOD_LIVEPATCH: pre_unpatch_callback: $MOD_TARGET_BUSY -> [MODULE_STATE_LIVE] Normal state371livepatch: '$MOD_LIVEPATCH': starting unpatching transition372livepatch: '$MOD_LIVEPATCH': completing unpatching transition373$MOD_LIVEPATCH: post_unpatch_callback: vmlinux374$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET_BUSY -> [MODULE_STATE_LIVE] Normal state375livepatch: '$MOD_LIVEPATCH': unpatching complete376% rmmod $MOD_LIVEPATCH377% rmmod $MOD_TARGET_BUSY378$MOD_TARGET_BUSY: ${MOD_TARGET_BUSY}_exit"379 380 381# A similar test as the previous one, but force the "busy" kernel module382# to block the livepatch transition.383#384# The livepatching core will refuse to patch a task that is currently385# executing a to-be-patched function -- the consistency model stalls the386# current patch transition until this safety-check is met. Test a387# scenario where one of a livepatch's target klp_objects sits on such a388# function for a long time. Meanwhile, load and unload other target389# kernel modules while the livepatch transition is in progress.390#391# - Load the "busy" kernel module, this time make its work function loop392#393# - Meanwhile, the livepatch is loaded. Notice that the patch394# transition does not complete as the targeted "busy" module is395# sitting on a to-be-patched function.396#397# - Load a second target module (this one is an ordinary idle kernel398# module). Note that *no* post-patch callbacks will be executed while399# the livepatch is still in transition.400#401# - Request an unload of the simple kernel module. The patch is still402# transitioning, so its pre-unpatch callbacks are skipped.403#404# - Finally the livepatch is disabled. Since none of the patch's405# klp_object's post-patch callbacks executed, the remaining406# klp_object's pre-unpatch callbacks are skipped.407 408start_test "busy target module"409 410load_mod $MOD_TARGET_BUSY block_transition=Y411load_lp_nowait $MOD_LIVEPATCH412 413# Wait until the livepatch reports in-transition state, i.e. that it's414# stalled on $MOD_TARGET_BUSY::busymod_work_func()415loop_until 'grep -q '^1$' /sys/kernel/livepatch/$MOD_LIVEPATCH/transition' ||416 die "failed to stall transition"417 418load_mod $MOD_TARGET419unload_mod $MOD_TARGET420disable_lp $MOD_LIVEPATCH421unload_lp $MOD_LIVEPATCH422unload_mod $MOD_TARGET_BUSY423 424check_result "% insmod test_modules/$MOD_TARGET_BUSY.ko block_transition=Y425$MOD_TARGET_BUSY: ${MOD_TARGET_BUSY}_init426$MOD_TARGET_BUSY: busymod_work_func enter427% insmod test_modules/$MOD_LIVEPATCH.ko428livepatch: enabling patch '$MOD_LIVEPATCH'429livepatch: '$MOD_LIVEPATCH': initializing patching transition430$MOD_LIVEPATCH: pre_patch_callback: vmlinux431$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET_BUSY -> [MODULE_STATE_LIVE] Normal state432livepatch: '$MOD_LIVEPATCH': starting patching transition433% insmod test_modules/$MOD_TARGET.ko434livepatch: applying patch '$MOD_LIVEPATCH' to loading module '$MOD_TARGET'435$MOD_LIVEPATCH: pre_patch_callback: $MOD_TARGET -> [MODULE_STATE_COMING] Full formed, running module_init436$MOD_TARGET: ${MOD_TARGET}_init437% rmmod $MOD_TARGET438$MOD_TARGET: ${MOD_TARGET}_exit439livepatch: reverting patch '$MOD_LIVEPATCH' on unloading module '$MOD_TARGET'440$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET -> [MODULE_STATE_GOING] Going away441% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled442livepatch: '$MOD_LIVEPATCH': reversing transition from patching to unpatching443livepatch: '$MOD_LIVEPATCH': starting unpatching transition444livepatch: '$MOD_LIVEPATCH': completing unpatching transition445$MOD_LIVEPATCH: post_unpatch_callback: vmlinux446$MOD_LIVEPATCH: post_unpatch_callback: $MOD_TARGET_BUSY -> [MODULE_STATE_LIVE] Normal state447livepatch: '$MOD_LIVEPATCH': unpatching complete448% rmmod $MOD_LIVEPATCH449% rmmod $MOD_TARGET_BUSY450$MOD_TARGET_BUSY: busymod_work_func exit451$MOD_TARGET_BUSY: ${MOD_TARGET_BUSY}_exit"452 453 454# Test loading multiple livepatches. This test-case is mainly for comparing455# with the next test-case.456#457# - Load and unload two livepatches, pre and post (un)patch callbacks458# execute as each patch progresses through its (un)patching459# transition.460 461start_test "multiple livepatches"462 463load_lp $MOD_LIVEPATCH464load_lp $MOD_LIVEPATCH2465disable_lp $MOD_LIVEPATCH2466disable_lp $MOD_LIVEPATCH467unload_lp $MOD_LIVEPATCH2468unload_lp $MOD_LIVEPATCH469 470check_result "% insmod test_modules/$MOD_LIVEPATCH.ko471livepatch: enabling patch '$MOD_LIVEPATCH'472livepatch: '$MOD_LIVEPATCH': initializing patching transition473$MOD_LIVEPATCH: pre_patch_callback: vmlinux474livepatch: '$MOD_LIVEPATCH': starting patching transition475livepatch: '$MOD_LIVEPATCH': completing patching transition476$MOD_LIVEPATCH: post_patch_callback: vmlinux477livepatch: '$MOD_LIVEPATCH': patching complete478% insmod test_modules/$MOD_LIVEPATCH2.ko479livepatch: enabling patch '$MOD_LIVEPATCH2'480livepatch: '$MOD_LIVEPATCH2': initializing patching transition481$MOD_LIVEPATCH2: pre_patch_callback: vmlinux482livepatch: '$MOD_LIVEPATCH2': starting patching transition483livepatch: '$MOD_LIVEPATCH2': completing patching transition484$MOD_LIVEPATCH2: post_patch_callback: vmlinux485livepatch: '$MOD_LIVEPATCH2': patching complete486% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH2/enabled487livepatch: '$MOD_LIVEPATCH2': initializing unpatching transition488$MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux489livepatch: '$MOD_LIVEPATCH2': starting unpatching transition490livepatch: '$MOD_LIVEPATCH2': completing unpatching transition491$MOD_LIVEPATCH2: post_unpatch_callback: vmlinux492livepatch: '$MOD_LIVEPATCH2': unpatching complete493% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH/enabled494livepatch: '$MOD_LIVEPATCH': initializing unpatching transition495$MOD_LIVEPATCH: pre_unpatch_callback: vmlinux496livepatch: '$MOD_LIVEPATCH': starting unpatching transition497livepatch: '$MOD_LIVEPATCH': completing unpatching transition498$MOD_LIVEPATCH: post_unpatch_callback: vmlinux499livepatch: '$MOD_LIVEPATCH': unpatching complete500% rmmod $MOD_LIVEPATCH2501% rmmod $MOD_LIVEPATCH"502 503 504# Load multiple livepatches, but the second as an 'atomic-replace'505# patch. When the latter loads, the original livepatch should be506# disabled and *none* of its pre/post-unpatch callbacks executed. On507# the other hand, when the atomic-replace livepatch is disabled, its508# pre/post-unpatch callbacks *should* be executed.509#510# - Load and unload two livepatches, the second of which has its511# .replace flag set true.512#513# - Pre and post patch callbacks are executed for both livepatches.514#515# - Once the atomic replace module is loaded, only its pre and post516# unpatch callbacks are executed.517 518start_test "atomic replace"519 520load_lp $MOD_LIVEPATCH521load_lp $MOD_LIVEPATCH2 replace=1522disable_lp $MOD_LIVEPATCH2523unload_lp $MOD_LIVEPATCH2524unload_lp $MOD_LIVEPATCH525 526check_result "% insmod test_modules/$MOD_LIVEPATCH.ko527livepatch: enabling patch '$MOD_LIVEPATCH'528livepatch: '$MOD_LIVEPATCH': initializing patching transition529$MOD_LIVEPATCH: pre_patch_callback: vmlinux530livepatch: '$MOD_LIVEPATCH': starting patching transition531livepatch: '$MOD_LIVEPATCH': completing patching transition532$MOD_LIVEPATCH: post_patch_callback: vmlinux533livepatch: '$MOD_LIVEPATCH': patching complete534% insmod test_modules/$MOD_LIVEPATCH2.ko replace=1535livepatch: enabling patch '$MOD_LIVEPATCH2'536livepatch: '$MOD_LIVEPATCH2': initializing patching transition537$MOD_LIVEPATCH2: pre_patch_callback: vmlinux538livepatch: '$MOD_LIVEPATCH2': starting patching transition539livepatch: '$MOD_LIVEPATCH2': completing patching transition540$MOD_LIVEPATCH2: post_patch_callback: vmlinux541livepatch: '$MOD_LIVEPATCH2': patching complete542% echo 0 > /sys/kernel/livepatch/$MOD_LIVEPATCH2/enabled543livepatch: '$MOD_LIVEPATCH2': initializing unpatching transition544$MOD_LIVEPATCH2: pre_unpatch_callback: vmlinux545livepatch: '$MOD_LIVEPATCH2': starting unpatching transition546livepatch: '$MOD_LIVEPATCH2': completing unpatching transition547$MOD_LIVEPATCH2: post_unpatch_callback: vmlinux548livepatch: '$MOD_LIVEPATCH2': unpatching complete549% rmmod $MOD_LIVEPATCH2550% rmmod $MOD_LIVEPATCH"551 552 553exit 0554