mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf.git
synced 2026-04-17 22:24:18 -04:00
This patch implements the core mechanism for managing preserved files throughout the live update lifecycle. It provides the logic to invoke the file handler callbacks (preserve, unpreserve, freeze, unfreeze, retrieve, and finish) at the appropriate stages. During the reboot phase, luo_file_freeze() serializes the final metadata for each file (handler compatible string, token, and data handle) into a memory region preserved by KHO. In the new kernel, luo_file_deserialize() reconstructs the in-memory file list from this data, preparing the session for retrieval. Link: https://lkml.kernel.org/r/20251125165850.3389713-7-pasha.tatashin@soleen.com Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org> Reviewed-by: Pratyush Yadav <pratyush@kernel.org> Tested-by: David Matlack <dmatlack@google.com> Cc: Aleksander Lobakin <aleksander.lobakin@intel.com> Cc: Alexander Graf <graf@amazon.com> Cc: Alice Ryhl <aliceryhl@google.com> Cc: Andriy Shevchenko <andriy.shevchenko@linux.intel.com> Cc: anish kumar <yesanishhere@gmail.com> Cc: Anna Schumaker <anna.schumaker@oracle.com> Cc: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> Cc: Bjorn Helgaas <bhelgaas@google.com> Cc: Borislav Betkov <bp@alien8.de> Cc: Chanwoo Choi <cw00.choi@samsung.com> Cc: Chen Ridong <chenridong@huawei.com> Cc: Chris Li <chrisl@kernel.org> Cc: Christian Brauner <brauner@kernel.org> Cc: Daniel Wagner <wagi@kernel.org> Cc: Danilo Krummrich <dakr@kernel.org> Cc: Dan Williams <dan.j.williams@intel.com> Cc: David Hildenbrand <david@redhat.com> Cc: David Jeffery <djeffery@redhat.com> Cc: David Rientjes <rientjes@google.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Guixin Liu <kanie@linux.alibaba.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Hugh Dickins <hughd@google.com> Cc: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Ira Weiny <ira.weiny@intel.com> Cc: Jann Horn <jannh@google.com> Cc: Jason Gunthorpe <jgg@nvidia.com> Cc: Jens Axboe <axboe@kernel.dk> Cc: Joanthan Cameron <Jonathan.Cameron@huawei.com> Cc: Joel Granados <joel.granados@kernel.org> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Lennart Poettering <lennart@poettering.net> Cc: Leon Romanovsky <leon@kernel.org> Cc: Leon Romanovsky <leonro@nvidia.com> Cc: Lukas Wunner <lukas@wunner.de> Cc: Marc Rutland <mark.rutland@arm.com> Cc: Masahiro Yamada <masahiroy@kernel.org> Cc: Matthew Maurer <mmaurer@google.com> Cc: Miguel Ojeda <ojeda@kernel.org> Cc: Myugnjoo Ham <myungjoo.ham@samsung.com> Cc: Parav Pandit <parav@nvidia.com> Cc: Pratyush Yadav <ptyadav@amazon.de> Cc: Randy Dunlap <rdunlap@infradead.org> Cc: Roman Gushchin <roman.gushchin@linux.dev> Cc: Saeed Mahameed <saeedm@nvidia.com> Cc: Samiullah Khawaja <skhawaja@google.com> Cc: Song Liu <song@kernel.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Stuart Hayes <stuart.w.hayes@gmail.com> Cc: Tejun Heo <tj@kernel.org> Cc: Thomas Gleinxer <tglx@linutronix.de> Cc: Thomas Weißschuh <linux@weissschuh.net> Cc: Vincent Guittot <vincent.guittot@linaro.org> Cc: William Tu <witu@nvidia.com> Cc: Yoann Congal <yoann.congal@smile.fr> Cc: Zhu Yanjun <yanjun.zhu@linux.dev> Cc: Zijun Hu <quic_zijuhu@quicinc.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
134 lines
4.5 KiB
C
134 lines
4.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
|
|
/*
|
|
* Copyright (c) 2025, Google LLC.
|
|
* Pasha Tatashin <pasha.tatashin@soleen.com>
|
|
*/
|
|
#ifndef _LINUX_LIVEUPDATE_H
|
|
#define _LINUX_LIVEUPDATE_H
|
|
|
|
#include <linux/bug.h>
|
|
#include <linux/compiler.h>
|
|
#include <linux/kho/abi/luo.h>
|
|
#include <linux/list.h>
|
|
#include <linux/types.h>
|
|
#include <uapi/linux/liveupdate.h>
|
|
|
|
struct liveupdate_file_handler;
|
|
struct file;
|
|
|
|
/**
|
|
* struct liveupdate_file_op_args - Arguments for file operation callbacks.
|
|
* @handler: The file handler being called.
|
|
* @retrieved: The retrieve status for the 'can_finish / finish'
|
|
* operation.
|
|
* @file: The file object. For retrieve: [OUT] The callback sets
|
|
* this to the new file. For other ops: [IN] The caller sets
|
|
* this to the file being operated on.
|
|
* @serialized_data: The opaque u64 handle, preserve/prepare/freeze may update
|
|
* this field.
|
|
*
|
|
* This structure bundles all parameters for the file operation callbacks.
|
|
* The 'data' and 'file' fields are used for both input and output.
|
|
*/
|
|
struct liveupdate_file_op_args {
|
|
struct liveupdate_file_handler *handler;
|
|
bool retrieved;
|
|
struct file *file;
|
|
u64 serialized_data;
|
|
};
|
|
|
|
/**
|
|
* struct liveupdate_file_ops - Callbacks for live-updatable files.
|
|
* @can_preserve: Required. Lightweight check to see if this handler is
|
|
* compatible with the given file.
|
|
* @preserve: Required. Performs state-saving for the file.
|
|
* @unpreserve: Required. Cleans up any resources allocated by @preserve.
|
|
* @freeze: Optional. Final actions just before kernel transition.
|
|
* @unfreeze: Optional. Undo freeze operations.
|
|
* @retrieve: Required. Restores the file in the new kernel.
|
|
* @can_finish: Optional. Check if this FD can finish, i.e. all restoration
|
|
* pre-requirements for this FD are satisfied. Called prior to
|
|
* finish, in order to do successful finish calls for all
|
|
* resources in the session.
|
|
* @finish: Required. Final cleanup in the new kernel.
|
|
* @owner: Module reference
|
|
*
|
|
* All operations (except can_preserve) receive a pointer to a
|
|
* 'struct liveupdate_file_op_args' containing the necessary context.
|
|
*/
|
|
struct liveupdate_file_ops {
|
|
bool (*can_preserve)(struct liveupdate_file_handler *handler,
|
|
struct file *file);
|
|
int (*preserve)(struct liveupdate_file_op_args *args);
|
|
void (*unpreserve)(struct liveupdate_file_op_args *args);
|
|
int (*freeze)(struct liveupdate_file_op_args *args);
|
|
void (*unfreeze)(struct liveupdate_file_op_args *args);
|
|
int (*retrieve)(struct liveupdate_file_op_args *args);
|
|
bool (*can_finish)(struct liveupdate_file_op_args *args);
|
|
void (*finish)(struct liveupdate_file_op_args *args);
|
|
struct module *owner;
|
|
};
|
|
|
|
/**
|
|
* struct liveupdate_file_handler - Represents a handler for a live-updatable file type.
|
|
* @ops: Callback functions
|
|
* @compatible: The compatibility string (e.g., "memfd-v1", "vfiofd-v1")
|
|
* that uniquely identifies the file type this handler
|
|
* supports. This is matched against the compatible string
|
|
* associated with individual &struct file instances.
|
|
*
|
|
* Modules that want to support live update for specific file types should
|
|
* register an instance of this structure. LUO uses this registration to
|
|
* determine if a given file can be preserved and to find the appropriate
|
|
* operations to manage its state across the update.
|
|
*/
|
|
struct liveupdate_file_handler {
|
|
const struct liveupdate_file_ops *ops;
|
|
const char compatible[LIVEUPDATE_HNDL_COMPAT_LENGTH];
|
|
|
|
/* private: */
|
|
|
|
/*
|
|
* Used for linking this handler instance into a global list of
|
|
* registered file handlers.
|
|
*/
|
|
struct list_head __private list;
|
|
};
|
|
|
|
#ifdef CONFIG_LIVEUPDATE
|
|
|
|
/* Return true if live update orchestrator is enabled */
|
|
bool liveupdate_enabled(void);
|
|
|
|
/* Called during kexec to tell LUO that entered into reboot */
|
|
int liveupdate_reboot(void);
|
|
|
|
int liveupdate_register_file_handler(struct liveupdate_file_handler *fh);
|
|
int liveupdate_unregister_file_handler(struct liveupdate_file_handler *fh);
|
|
|
|
#else /* CONFIG_LIVEUPDATE */
|
|
|
|
static inline bool liveupdate_enabled(void)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
static inline int liveupdate_reboot(void)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int liveupdate_register_file_handler(struct liveupdate_file_handler *fh)
|
|
{
|
|
return -EOPNOTSUPP;
|
|
}
|
|
|
|
static inline int liveupdate_unregister_file_handler(struct liveupdate_file_handler *fh)
|
|
{
|
|
return -EOPNOTSUPP;
|
|
}
|
|
|
|
#endif /* CONFIG_LIVEUPDATE */
|
|
#endif /* _LINUX_LIVEUPDATE_H */
|