2026-06-05 内核社区日报

mm‑stable 入库 282 个补丁进入合并窗口,同时 liveupdate 子系统开始对 KHO 做细粒度解耦,让跨版本兼容字符串可以独立演进。


🧠 重点 · 内存

1. mm‑stable 合并窗口状态:282 个补丁已入库,下周再入 40 个

发生了什么: Andrew Morton 发布 mm‑stable 当前状态。已有 282 个补丁落位 mm‑stable,本周还将追加约 40 个补丁(可从 https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new 预览),合并窗口第一周就此结束。另有约 110 个补丁因 Nico 的 “khugepaged: add mTHP collapse support” 系列尚未确定而暂时未入库,计划在合并窗口中期部分或全部加入,并在第二周上游。

为什么重要: 这给出了本次合并窗口内存子系统的吞吐量;282 是个不小的数字,说明积累的改动正在集中过线。

来源

2. alloc_tag:修复模块卸载后 /proc/allocinfo 的 use-after-free

发生了什么: 修复了 allocinfo_start() 在模块卸载后重用缓存迭代器导致 allocinfo_show() 访问已释放模块内存的 UAF。根本原因是 allocinfo_start() 仅在 pos == 0 时重新初始化迭代器,后续读批次重用缓存状态;而 allocinfo_stop() 在批次间释放 mod_lock,允许模块卸载完毕释放内存。补丁在 allocinfo_next() 中保存当前已显示的迭代器状态到 priv->reported_iter,并在 allocinfo_start() 中从该状态恢复,随后调用 codetag_next_ct(),后者通过 idr_find() 检测模块是否已被卸载,若返回 NULL 则跳过已卸载模块,避免访问释放后的 ct->filename 等字段。

为什么重要: /proc/allocinfo 是内存分配 profiling 的核心输出接口,模块热插拔场景下读与卸载并发时,用户态可能读到损坏数据或触发 kernel crash。此修复使 modprobe && cat /proc/allocinfo && rmmod 这类操作安全。

来源

3. alloc_tag:用动态链表替代固定尺寸早期 PFN 数组(v6 继续评审)

发生了什么: v6 恢复了因本地 Git 环境错误丢失的 changelog 部分。该系列将 alloc_tag_add_early_pfn() 中记录早期 PFN 的固定尺寸数组(8192 项)替换为动态分配的 struct pfn_pool 链表。每个 pfn_pool 节点通过 alloc_page(__GFP_HIGH | __GFP_NO_CODETAG) 分配,使用 __GFP_NO_CODETAG(复用 __GFP_NO_OBJ_EXT 位)避免递归;早期路径在带此标志时跳过记录。

为什么重要: 早期 PFN 数量取决于 CPU 数量,可能超过 8192,新方案移除硬上限,避免因数组溢出导致的 “alloc_tag was not set” 误报。

来源

4. KHO:解耦各子系统兼容性版本,不再受全局版本号绑定

发生了什么: Pasha Tatashin 提交 RFC v1,将 KHO(Keep-Handover-Over)/ liveupdate 的子模块跟踪进行细粒度解耦:

  • (1) 将 radix tree tracker、vmalloc preservation、block device 分别拆到独立文件(kho_radix.ckho_vmalloc.c),并各自定义独立的兼容字符串(如 "radix-v1""vmalloc-v1"),不再全部使用全局 KHO_FDT_COMPATIBLE
  • (2) 新增 compat.h 工具宏,统一构造子模块兼容字符串,要求按字母序排列。
  • (3) 为验证字母序新增 KUnit 测试。

为什么重要: 之前所有子模块共享一个全局版本号,一个子模块的不兼容改动就会导致整个 liveupdate 镜像失效。现在各子系统版本独立,可以单独演进,降低跨内核版本的 liveupdate 维护难度。这是 liveupdate 向生产可用迈出的结构性一步。

来源

5. riscv: mm: 引入 vmemmap_populate_finalize 避免因 TLB 缓存非 present 条目引发 spurious fault

发生了什么: section_activate() 填充新 vmemmap 页面后未执行 TLB flush;在大多数架构上正常,但在 RISC‑V 上允许 TLB 缓存非 present 条目,可能导致 spurious fault。该补丁在 __populate_section_memmap() 中新增 vmemmap_populate_finalize() 钩子,RISC‑V 实现调用 mark_new_valid_map() 让现有异常处理代码处理这些 fault。

为什么重要: 修复了 RISC‑V 上因 section_activate 未 flush TLB 导致 spurious fault 的问题。该通用钩子允许其他架构按需处理类似情况。

来源

6. Rust xarray:添加 entry API 和 sheaf(滑动分配器)支持

发生了什么: Andreas Hindborg 发布 v4 系列,为 Rust xarray 增强 API:

  • (1) 增加 Guard::load 基于 xas_load 的原子读,以及 find_next / find_next_mut 游标遍历。
  • (2) 添加 entry API(标记、有序 entry 管理)。
  • (3) 新增 Sheaf 抽象:一种"滑动"kmem_cache 分配器,允许 Rust 侧从预先分配的 slab 池中零开销连续分配,并支持将 C 中已创建的 static kmem_cache(如 radix_tree_node_cachep)暴露给 Rust。
  • (4) 为 xarray/radix-tree 内核的 kmem_cache 启用 sheaf 支持。

为什么重要: xarray 是文件缓存、进程地址空间等多个核心路径的基础数据结构。Rust 侧如果能高效操作 xarray 并且利用 sheaf 做零碎分配,有助于用 Rust 替换某些 C 实现(如 VMA 树)。sheaf 本身是一个微架构优化:一次从 slab allocate 一批对象,后续分配不再走 slab 下的锁,对 htlb、page cache 密集使用路径有潜在收益。

来源

7. DAMON:提交 kdamond_call() debug_sanity 检查等多个代码清理

发生了什么: 一批 DAMON 清理补丁被合入(已在 mm-stable 中):

  • kdamond_call() 增加 debug sanity 检查,确保调用时 kdamond 确实在线。
  • 隐藏不再对模块开放的内部函数 damon_destroy_region()damon_insert_region()
  • 文档新增 TLB flush 策略说明:DAMON 在采样时故意避免了 TLB flush(只清 PTE 的 Access bit),因此可能短暂导致 arm64 上的 stale 访问。文档明确这一 trade‑off。

为什么重要: 这些清理降低了 DAMON 模块编写者的误用风险,也减少了 API surface。文档中的 TLB flush 策略可以直接关联到手机上 DAMON 监控精度的理解——如果误判访问频率,系统的内存冷热识别会不准,进而影响 MGLRU/lmkd 的回收决策。

来源(清理合入)
来源(TLB flush 文档)
来源(kdamond_call调试)


🔧 其它子系统

文件系统 / VFS

  • simple_xattr: use per-sb cache(v4)
    Miklos Szeredi 推出该系列的 v4,主要改动为使用 per-sb cache,并修复了 shmem_initxattrs 的 accounting 问题。
    来源

eBPF / bpf-next

  • libarena 新增红黑树和 SPMC 工作窃取队列(v3)
    为 libarena 添加红黑树和 Lev-Chase deque(单生产者多消费者工作窃取队列)两种数据结构。该系列还添加了对应的 selftests,以及用于 libarena 程序的多线程测试框架和并行的队列 selftest。
    来源

Rust 内核

  • RcuBox / RcuFreeBox:RCU 保护分配
    Alice Ryhl / Boqun Feng 提出 RcuBox<T>(内层 T 被 drop 并在一个 grace period 后)和 RcuFreeBox<T, A>(内层 T 立即清理并在 grace period 后释放)。该系列还包含为 maple tree 添加 load_rcu() 方法的提交。
    来源

  • per-task memalloc scope 抽象(v2)
    Andreas Hindborg 提交 v2,在 Rust 侧提供对应 memalloc_noio / memalloc_nofs / memalloc_noreclaim / memalloc_pin save/restore 接口的通用 Scope<K> 守卫,通过 sealed trait ScopeKindmemalloc_scope! 宏保证严格的 LIFO 嵌套安全性。
    来源

  • SafePage:无竞争的页面访问(v2)
    新增 SafePage 类型(围绕 Page 的 newtype),其不变性保证页面数据访问无数据竞争,可将页面视为常规数组并获取切片。同时添加了在安全页面之间复制数据的方法。
    来源

KVM / 虚拟化

  • POC:TDX 环境下验证 GVA 转换工作
    Ackerley Tng 演示在 TDX guest 里将同一 GVA 区同时映射为 private 和 shared,避免 guest 内部需要反复切换页表。
    来源

👀 值得追的讨论 / Patch

  • ANON_VMA_LAZY 延迟 anon_vma 创建
    xu.xin16@zte.com.cn 指出实现非常复杂,建议简化并以 RFC 形式发起讨论。David Hildenbrand 表示整体复杂度可能会增加,并认为需要更自然简单的设计。Lorenzo Stoakes 提及正在优先安排相关工作,预计一个月内可能有 RFC 发出。
    来源

  • mm/page_reporting:commit 504f40f6bd 触发 kernel BUG
    kernel test robot 报告该 commit 在 include/linux/page-flags.h 中触发 BUG,疑似 page reporting 跳过零化页面时标志未正确处理。暂无修复。
    来源


⚡ 一句话速览

  • mm: vmsplice 退化为 preadv2/pwritev2 包装的讨论继续,Mark Brown 报告该系列导致 LTP vmsplice01 测试超时,并通过 bisect 定位到 “vmsplice: make vmsplice a trivial wrapper for preadv2/pwritev2” commit。
    来源

  • mm: khugepaged mTHP collapse 系列收到更多 review 反馈,主要围绕页位顺问题和文件映射的部分 collapse 逻辑,作者承诺下一版重新组织。
    来源

  • mm: DAMON 热区大页折叠 RFC v3 收到 SeongJae Park 的 review 反馈(主要是文档/接口命名细节),无本质分歧。
    来源

  • mm: DAMON damon_commit_target() 修复在上下文提交失败时未正确释放源目标 pid 导致的泄漏。
    来源

  • mm/mm-hotfix:修复 huge_memory 中 device-private PMD entry 的 flags 错误(使用 _page_dirty 而非 pmd_dirty),已合入。
    来源

  • mm/slub:修复 _kmalloc_nolock_noprof retry 路径中原始 size 丢失导致退化为次佳 bucket 的问题。
    来源

  • mm/vmalloc:extend page table walk 支持更大的 page_shift,消除页表回绕(rewalk),v3 继续 review。
    来源

  • mm/swap:移除 SWP_FS_OPS 和 swap_fs_ops,改用 swap_ops->flags 中的 SWAP_OPS_F_NOFS 标志在 may_enter_fs() 中判断是否需要 GFP_NOFS;同时删除了内联函数 folio_swap_flags()
    来源

  • selftests/mm:pkey helper 重构 + mmap 错误处理修复(v6),统一 pkey 测试的断言和 tracing。
    来源

  • checkpatch:当 Reported-by 后面紧跟着 Link: 而非 Closes: 时,不再强制要求 Closes: tag。
    来源