Skip to content

Commit 55eb9a6

Browse files
joe-lawrencepmladek
authored andcommitted
selftests/livepatch: better synchronize test_klp_callbacks_busy
The test_klp_callbacks_busy module conditionally blocks a future livepatch transition by busy waiting inside its workqueue function, busymod_work_func(). After scheduling this work, a test livepatch is loaded, introducing the transition under test. Both events are marked in the kernel log for later verification, but there is no synchronization to ensure that busymod_work_func() logs its function entry message before subsequent selftest commands log their own messages. This can lead to a rare test failure due to unexpected ordering like: --- expected +++ result @@ -1,7 +1,7 @@ % modprobe test_klp_callbacks_busy block_transition=Y test_klp_callbacks_busy: test_klp_callbacks_busy_init -test_klp_callbacks_busy: busymod_work_func enter % modprobe test_klp_callbacks_demo +test_klp_callbacks_busy: busymod_work_func enter livepatch: enabling patch 'test_klp_callbacks_demo' livepatch: 'test_klp_callbacks_demo': initializing patching transition test_klp_callbacks_demo: pre_patch_callback: vmlinux Force the module init function to wait until busymod_work_func() has started (and logged its message), before exiting to the next selftest steps. Fixes: 547840b ("selftests/livepatch: simplify test-klp-callbacks busy target tests") Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com> Reviewed-by: Petr Mladek <pmladek@suse.com> Signed-off-by: Petr Mladek <pmladek@suse.com> Link: https://lore.kernel.org/r/20220602203233.979681-1-joe.lawrence@redhat.com
1 parent 7c9e960 commit 55eb9a6

File tree

1 file changed

+8
-0
lines changed

1 file changed

+8
-0
lines changed

lib/livepatch/test_klp_callbacks_busy.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@ MODULE_PARM_DESC(block_transition, "block_transition (default=false)");
1616

1717
static void busymod_work_func(struct work_struct *work);
1818
static DECLARE_WORK(work, busymod_work_func);
19+
static DECLARE_COMPLETION(busymod_work_started);
1920

2021
static void busymod_work_func(struct work_struct *work)
2122
{
2223
pr_info("%s enter\n", __func__);
24+
complete(&busymod_work_started);
2325

2426
while (READ_ONCE(block_transition)) {
2527
/*
@@ -37,6 +39,12 @@ static int test_klp_callbacks_busy_init(void)
3739
pr_info("%s\n", __func__);
3840
schedule_work(&work);
3941

42+
/*
43+
* To synchronize kernel messages, hold the init function from
44+
* exiting until the work function's entry message has printed.
45+
*/
46+
wait_for_completion(&busymod_work_started);
47+
4048
if (!block_transition) {
4149
/*
4250
* Serialize output: print all messages from the work

0 commit comments

Comments
 (0)