2026-05-30 内核社区日报

一句话导读:Live Update 移除会话与文件硬限制,改动态链接块序列化;vmsplice 提议退化为 preadv2/pwritev2 以根除 splice 漏洞。

🧠 重点 · 内存

1. Live Update:解除会话与文件数量上限(v4 系列)

Pasha Tatashin 发出 v4 版本,核心目标是将 Live Update Orchestrator(LUO)的会话数量和每会话文件数量从固定硬限制改为动态分配。此前受 16 页连续预分配块限制,最多约 819 个会话;现在通过 KHO 引入的“链接块序列化”机制,将元数据存储为链表而非连续区,从而消除了理论上限。

系列前几 patch 是纯重构:统一类型、清理 goto 混淆、将状态集中到单一 struct luo_ser 头(ABI v2)、丢弃旧的 FDT 包装改用 KHO 原始子树 API。关键改动在第 7 个 patch(kho: add support for linked-block serialization),为 KHO 子系统增加了链接块序列化能力,随后 LUO 基于它实现会话和文件的动态增长。selftests 新增了 2000 会话和 500 文件跨 kexec 的应力测试。

重要性:TAT 风格热升级(Live Update)依赖内核在 kexec 时保留大量状态,硬限制阻碍了大规模有状态服务(如容器运行时、数据库连接)的无损升级。改为动态分配是长期支持大规模 KHO 状态的前提。
来源

2. memblock / liveupdate 紧急修复合入

  • memblock: memblock_free_late() 重构导致了一个回归,Mike Rapoport 的修复 PR 已合入 Torvalds 树。
  • liveupdate: 两个 KHO 回归修复也合入了主线。

[来源: memblock, liveupdate]

3. zsmalloc:在对象值中编码 class 索引,支持无锁 class 查找

Wenchao Hao 在 RFC v2 中提出了将 size_class 索引编码进 obj 值的方案。当前 zs_free() 需要从 handle 反查到 class,该路径依赖 per-pool 锁;索引直接编码后,zs_free() 可几乎无锁地定位 class,减少 zram 路径的锁竞争。这对 Android 手机场景(zram 是核心内存压缩设备)有直接影响——zsmalloc 的并发改进意味着更低的 zram 压缩/解压延迟。

Patch 还在 RFC 讨论阶段,未给出微基准,但方向清晰。
来源

4. vmsplice 退化为 preadv2/pwritev2 包装(提案)

Askar Safin 发出 3 个 patch,将 vmsplice 系统调用改写为对 preadv2/pwritev2 的简单包装,从而移除 PIPE_BUF_FLAG_GIFTlink_pipe() 中未使用的 flags 参数。理由是内核 splice/vmsplice 近期频繁爆出安全漏洞(如 CVE-2020-29374),且正确性难以保证。若合入,vmsplice 将仅通过管道完成内存向量传递,不再有独立的零拷贝路径。

重要性:splice 系列系统调用是 FS 层持续的安全痛点;此举虽损失一点性能(额外一次 copy),但大幅降低攻击面。Willy(Matthew Wilcox)此前已在社区表达过类似意见。
来源

5. 锁竞争优化:lruvec drain 时提前释放死 folio

JP Kobryn 此前合入的 patch(见知识库 kb8)已被主线的 mm/lruvec 代码吸收:在 lru_add 批处理 drain 时,如果发现已被释放的 folio(dead folio),立即将其从批次中移除而不加入 lruvec。该 patch 来自 Meta 的生产数据,发现约 24% 的 lruvec 锁竞争 由这些死 folio 引起。释放它们可显著降低 drain 路径的锁保持时间。

素材中没有单独列出该 patch 邮件的当天讨论,但该改动已在主线中生效,值得记录。
来源


🔧 其它子系统

文件系统

  • f2fs large folio:Jaegeuk Kim 提出通过记忆 inode 号来预选 large folio 大小。Christoph Hellwig 指出 bio 合并发生在 submit_bio 层,不应依赖 folio 大小。讨论仍在进行。
    来源

  • DAX/fsdev 大量修复(V3):John Groves 连续发布 9 个 bug 修复,涵盖 memory_failure 多 range 偏移、vmemmap_shift 残留、holder_ops 竞态、dax_dev_get() 换成非分配型 dax_dev_find() 等。这些来自 famfs CI 长期运行发现的竞态和逻辑错误,与 DAX 持久内存映射稳定性相关。
    来源

  • configfs 与 ocfs2 的 UAF/空指针 bug:两处经典错误——configfs_drop_dentry() 的 slab-use-after-free,以及 ocfs2_checkpoint_inode 在 umount 时遇到 NULL journal。社区建议补丁正在验证。
    configfs | ocfs2

  • FUSE_NOTIFY_INVAL_ENTRY 回归:由于 commit c9ba789dad15(start_creating_noperm)的改动,使 fuse 的 inval_entry 无法刷新负缓存条目。报告人提供了复现步骤。
    来源

eBPF

  • perf/lock 原子修复update_contention_data() 中 max_time/min_time 的更新缺少原子性,可能导致两个 CPU 同时写坏值。补丁改用 __sync_val_compare_and_swap()(BPF_CMPXCHG),因此需要编译时指定 -mcpu=v3。另一补丁为 cgroup 聚合场景补全了 end-timestamp 统计。
    来源

  • bpf_arena_alloc() kfunc:Harry Yoo 续推该系列,允许 BPF 程序直接从 slab 分配内存,由 arena 管理生命周期。邮件中替换了旧的审查人员,并请求 slab 侧 reviewer 关注。
    来源

  • BPF_PROG_QUERY out-of-bounds 修复:v2 版本在 bpf_prog_query() 的前门检查中拒绝小于当前 bpf_attr 最小长度(含 revision 字段)的请求,防止写入越界。
    来源

  • bpftool bootstrap 构建提速:在 perf 构建 bpftool bootstrap 时跳过不必要的 feature check(llvm、libcap等),降低交叉编译开销。
    来源

网络

  • sch_pedit 部分 COW 导致页缓存损坏tcf_pedit 在对 skb 进行“部分复制写”时未正确标记页缓存,导致后续写回出错。该修复来自 Qualcomm 的测试环境,未提供具体数据但描述为“导致严重的数据损坏”。
    来源

  • mana 中断调节:Haiyang Zhang 为 Microsoft Azure 的 mana 驱动添加了静态和动态中断调节(DIM)支持。
    来源

Rust / 其它

  • serdev 与 leds 抽象:Markus Probst 继续推进 Rust 抽象——serdev(串行设备总线)v10 和 leds classdev v18。serdev 抽象被 Synology NAS 上的微控制器驱动使用;leds 抽象则引入 Mode trait 与 MultiColor 支持。两个系列已接近合入状态。
    serdev | leds

👀 值得追的讨论 / Patch

  • syzbot 报告:page_cache_ra_order 可能死锁(mm/fs 交叉):出现在 linux-next,syzbot 给出了 lockdep 调用链,涉及 lru_cachep、i_mmap_rwsem 等。需要确认是否与近期 readahead 或 large folio 改动有关。
    来源

  • re: mapping_max_folio_order 用于 force_thp_readahead:Usama Arif 与 Jan Kara、Pedro Falcato 就在 force_thp_readahead 中使用 mapping_max_folio_order() 的细节继续辩论。涉及大页文件读取策略的一致性。
    来源


⚡ 一句话速览

  • syzbot:ieee80211 的 radiotap 解析出现 shift-out-of-bounds,上游已标记。
  • loop 修复lo_rw_aio() 的 NULL 指针解引用补丁正在讨论,涉及 workqueue 与 open_mutex 同步。
  • 6pack 驱动:在 6.1 稳定版中修复了 tty 类型传播。
  • b44 驱动ethtool_puts 替换了危险的 memcpy 引用,消除 W=1 警告。
  • mctp 串行:用零初始化替换 memset,简化代码(有构建错误,待修正)。
  • Rust SRCU 助手:Gary Guo 与 Paul McKenney 讨论 call_srcu 在 Rust 侧的精细度(v8)。
  • perf/lock cgroup 聚合修复:补完缺失的 end-timestamp 记录逻辑,v2 重新发送。
  • NFC LLCP 安全报告(已撤回):原始报告声称 sockaddr 越界,测试后确认 -EFAULT 无 crash,已撤回。
  • vmsplice 三 patch 还包含移除 PIPE_BUF_FLAG_GIFT 以及清理 link_pipe 参数,与 VFS 主线相关。