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.c、kho_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_pinsave/restore 接口的通用Scope<K>守卫,通过 sealed traitScopeKind和memalloc_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_noprofretry 路径中原始 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。
来源