v2 2026-10-23

跨 Live Update 保留 tmpfs 文件 · v2

扩展 liveupdate 的 memfd 处理器,使其接受 tmpfs 挂载上未链接的 shmem 文件,LIVEUPDATE_SESSION_RETRIEVE_FD 不再一律还原为匿名 memfd,从而保留内存中的日志、二进制与配置文件。

原始补丁链接

子 Patch(10)

1/10
liveupdate: Pass user argument to file preserve and retrieve
preserve_fd/retrieve_fd结构增加64位arg指向带size的处理器参数,file_ops新增parg/rarg并由LIVEUPDATE_ARG编译期校验,旧16字节调用保持兼容。
2/10
selftests: liveupdate: Add tests for preserve and retrieve user argument
为LIVEUPDATE_SESSION_PRESERVE_FD/RETRIEVE_FD增加带参helper和preserve_memfd_with_arg用例,验证memfd拒绝非零参数、接受零参数及旧结构大小兼容。
3/10
liveupdate: Allow file handlers to mark retrieve failures as retryable
在file_op_args增加retryable标志;处理器尚未消费保留状态前失败时置位,luo_retrieve_file()不记录retrieve_status,允许修正参数后重试且finish()仍清理。
4/10
mm: Rename memfd_luo to shmem_luo
将memfd_luo处理器及文件、KHO头、文档和Kconfig重命名为shmem_luo,为支持tmpfs文件扩展;保留兼容串memfd-v2与序列化格式不变。
5/10
liveupdate: Don't WARN if tracking a retrieved file fails
xa_insert()可能因用户触发LIVEUPDATE_SESSION_RETRIEVE_FD而返回-ENOMEM,去掉WARN_ON,改为永久失败并保留文件到finish,避免panic_on_warn崩溃。
6/10
mm/shmem_luo: Don't make early retrieve failures permanent
shmem_luo_retrieve()在开始恢复folio前失败时标记retryable且不释放序列化状态,允许重试;避免finish()跳过失败文件导致保留folio泄漏。
7/10
mm/shmem_luo: Retrieve tmpfs files onto a tmpfs mount chosen by userspace
用SHMEM_LUO_FLAG_TMPFS记录源挂载,并新增liveupdate_shmem_retrieve_arg;按openat(dirfd,O_TMPFILE)在用户选定tmpfs创建文件后填充内容、seals和位置。
8/10
mm/shmem_luo: Allow preserving tmpfs files that are still linked
允许保留仍链接的tmpfs文件,路径不保留;保留期间尺寸冻结,截断/扩容写返回-EPERM,因此统一要求调用者对文件有写权限,防止他人破坏。
9/10
mm/shmem_luo: Allow retrieving tmpfs files with O_RDONLY
检索tmpfs文件时支持O_RDONLY:先按O_TMPFILE创建可写文件,再用dentry_open()以相同flags重开只读并释放写fd,便于在finish前执行恢复的二进制。
10/10
selftests/liveupdate: Add a test for preserving tmpfs files
新增luo_tmpfs kexec自测,分阶段保留tmpfs文件/memfd并用retrieve_arg恢复到独立tmpfs挂载,校验内容、尺寸、seals、空洞、O_TMPFILE创建语义及只读场景。