[PATCH v4 3/5] liveupdate: block session mutations during reboot
Mike Rapoport
rppt at kernel.org
Mon May 18 01:40:08 PDT 2026
On Sun, May 17, 2026 at 07:26:48PM +0000, Pasha Tatashin wrote:
> During the reboot() syscall, user processes may still be running
> concurrently and attempting to mutate sessions (e.g., creating,
> retrieving, or releasing sessions). To prevent this, introduce
> luo_session_serialize_rwsem to synchronize mutations with the
> serialization process.
>
> All session mutation operations (create, retrieve, release, ioctl) take
> the read lock. The serialization process (luo_session_serialize) takes
> the write lock and holds it indefinitely on success. This effectively
> freezes the LUO session subsystem during the transition to the new
> kernel. If serialization fails, the lock is released to allow recovery.
>
> Fixes: 0153094d03df ("liveupdate: luo_session: add sessions support")
> Reported-by: Oskar Gerlicz Kowalczuk <oskar at gerlicz.space>
> Signed-off-by: Pasha Tatashin <pasha.tatashin at soleen.com>
> ---
> kernel/liveupdate/luo_session.c | 27 ++++++++++++++++++++++++---
> 1 file changed, 24 insertions(+), 3 deletions(-)
>
> diff --git a/kernel/liveupdate/luo_session.c b/kernel/liveupdate/luo_session.c
> index 59b37d17db6b..6099213275d8 100644
> --- a/kernel/liveupdate/luo_session.c
> +++ b/kernel/liveupdate/luo_session.c
> @@ -385,9 +394,12 @@ int luo_session_create(const char *name, struct file **filep)
> struct luo_session *session;
> int err;
>
> + down_read(&luo_session_serialize_rwsem);
> session = luo_session_alloc(name);
We can alloc outside the lock, will make error handling simpler.
sashiko complains about mixing down_read() with scoped_guard(), for this
function it would make sense to use plain mutex_{lock,unlock} around
luo_session_getfile()
> - if (IS_ERR(session))
> - return PTR_ERR(session);
> + if (IS_ERR(session)) {
> + err = PTR_ERR(session);
> + goto err_unlock;
> + }
>
> err = luo_session_insert(&luo_session_global.outgoing, session);
> if (err)
> @@ -398,12 +410,16 @@ int luo_session_create(const char *name, struct file **filep)
> if (err)
> goto err_remove;
>
> + up_read(&luo_session_serialize_rwsem);
> +
> return 0;
>
> err_remove:
> luo_session_remove(&luo_session_global.outgoing, session);
> err_free:
> luo_session_free(session);
> +err_unlock:
> + up_read(&luo_session_serialize_rwsem);
>
> return err;
> }
--
Sincerely yours,
Mike.
More information about the kexec
mailing list