On Sun 2024-04-07 11:57:30, Yafang Shao wrote:
> In our production environment, upon loading a new atomic replace livepatch,
> we encountered an issue where the kernel module of the old livepatch
> remained, despite being replaced by the new one. This issue can be
> reproduced using the following steps:
>
> - Pre setup: Build two atomic replace livepatches
>
> - First step: Load the first livepatch using the insmod command
> $ insmod livepatch-test_0.ko
>
> $ ls /sys/kernel/livepatch/
> livepatch_test_0
>
> $ cat /sys/kernel/livepatch/livepatch_test_0/enabled
> 1
>
> $ lsmod | grep livepatch
> livepatch_test_0 16384 1
>
> - Second step: Load the new livepatch using the insmod command
> $ insmod livepatch-test_1.ko
>
> $ ls /sys/kernel/livepatch/
> livepatch_test_1 <<<< livepatch_test_0 was replaced
>
> $ cat /sys/kernel/livepatch/livepatch_test_1/enabled
> 1
>
> $ lsmod | grep livepatch
> livepatch_test_1 16384 1
> livepatch_test_0 16384 0 <<<< leftover
>
> Detecting which livepatch will be replaced by the new one from userspace is
> not reliable, necessitating the need for the operation to be performed
> within the kernel itself. With this improvement, executing
> `insmod livepatch-test_1.ko` will automatically remove the
> livepatch-test_0.ko module.
>
> Following this change, the associated kernel module will be removed when
> executing `echo 0 > /sys/kernel/livepatch/${livepath}/enabled`. Therefore,
> adjustments need to be made to the selftests accordingly.
>
> --- a/kernel/livepatch/core.c
> +++ b/kernel/livepatch/core.c
> @@ -721,8 +723,12 @@ static void klp_free_patch_finish(struct klp_patch
> *patch)
> wait_for_completion(&patch->finish);
>
> /* Put the module after the last access to struct klp_patch. */
> - if (!patch->forced)
> - module_put(patch->mod);
> + if (!patch->forced) {
> + module_put(mod);
> + if (!delete)
> + return;
> + delete_module(mod);
We should check the return value and report an error.
> + }
> }
Otherwise, it looks good to me.
I am personally in favor of this change. It removes one step
which otherwise has to be called from userspace after a non trivial
delay. The transition might take seconds.
It should simplify the scripting around livepatch modules handling.
It might reduce the need to over-optimize transition times.
Best Regards,
Petr