2026-05-29 内核社区日报
今天最值得关注的是 zswap 大页换入的 RFC v2 系列,它有望打破 zswap 场景下大页换入长期被禁用的僵局,对手机端低内存场景的 refault 性能影响深远。此外,Ard Biesheuvel 的 arm64 内核线性映射解耦系列继续推进,为 KASLR 和内存安全加固铺路。
🧠 重点 · 内存
1. zswap 大页换入:RFC v2 登场
发生了什么: 社区发布了 [RFC PATCH v2 0/9] mm: support zswap-backed large folio swapin 系列。核心思路是:当匿名页的 swap 槽位仍全部由 zswap 压缩存储(而非写回磁盘)时,允许 swapin 路径分配大页(PMD 级),从而避免每次 refault 都走 4K 小页。
为什么重要: 此前 zswap 一旦启用,匿名页的 large swapin 就被完全禁用,因为 zswap 内部拒绝大 swapcache folio。这个系列通过暴露 zswap 的“范围状态”给 swapin 策略(patch 1),并让 zswap 支持大 folio 加载(patch 3),再配合 VMA 局部性证据(patch 6)和 readahead 窗口(patch 8)来避免过度预取。对手机场景而言,zswap 是低内存下的关键压缩层,大页换入能显著减少 refault 时的 page fault 次数和 TLB 压力,直接改善应用冷启动和切换流畅度。
2. arm64 内核线性映射解耦:数据段从线性映射中移除
发生了什么: Ard Biesheuvel 的 v6 系列继续推进,patch 15 将内核的 data/bss 段从线性映射中完全移除。这意味着这些区域只能通过内核虚拟地址(内核映射)访问,线性映射中对应的页表项被清空。
为什么重要: 这是 arm64 内核内存布局安全加固的关键一步。线性映射是内核最容易被攻击者利用的“平坦”视图,移除 data/bss 后,即使攻击者通过线性映射的漏洞(如物理地址泄露)也无法直接改写内核数据。对手机 SoC 而言,这增加了内核提权攻击的难度,是长期安全基线的组成部分。
3. 修复 pagemap 对 device-private PMD 的误报
发生了什么: Dev Jain 提交了一个小修复,pagemap_pmd_range_thp() 在遇到非 present 且非 migration 的 PMD 条目时会触发 WARN。随着 device-private 内存(如 GPU 显存)在 PMD 级别的支持加入,这个警告变成了误报。
为什么重要: 对端侧 AI 场景,NPU/GPU 的 device-private 内存越来越常见。这个修复避免了在调试 /proc/pid/pagemap 时被虚假警告干扰,也反映了内核内存管理对异构内存模型的持续适配。
4. 跳过冗余同步 IPI:TLB flush 场景优化
发生了什么: Peter Zijlstra 回复了 Roman Gushchin 的 v10 系列,该系列旨在当 TLB flush 已经通过 IPI 发送了同步信号时,跳过后续冗余的 sync IPI。讨论仍在进行中。
为什么重要: 多核 SoC 上 TLB shootdown 的 IPI 开销是调度和内存回收路径上的常见瓶颈。减少冗余 IPI 对手机这类对功耗和响应延迟敏感的设备有直接收益。
🔧 其它子系统
- eBPF: 修复了
bpf_find_vma()中mm_struct的 use-after-free 问题,该函数在访问 foreign task 的 mm 时未持有 task_lock 或 mmget。来源 - eBPF: 新增 DAG 快速路径,在 verifier 的状态剪枝循环中跳过已知无环路径,有望显著缩短大型 BPF 程序的加载时间。来源
- 文件系统: Christian Brauner 提交了 v2 系列,将最后三个 sget() 调用者(CIFS 和两个 ext4 KUnit 测试)迁移到 sget_fc(),随后正式退役 sget() 函数,清理了约 60 行遗留代码。来源
- 文件系统: 修复了 eventpoll 中
clear_tfile_check_list()的 use-after-free,由 syzbot 报告,发生在 EPOLL_CTL_ADD 错误路径。来源 - Rust: Onur Özkan 提交了 v8 的 SRCU 抽象,为 Rust 内核模块提供安全的可休眠 RCU 支持,已获得 Paul McKenney 的 Reviewed-by。来源
- Rust: Jann Horn 提交了删除
task_euid()的系列,该函数语义怪异且唯一用户 Binder 已改用current_euid()。来源 - 网络: 回退了“保留同作用域 IPv6 地址插入顺序”的补丁,因为它导致 NetworkManager 下 VM 停止后 SSH 连接断开。来源
👀 值得追的讨论 / Patch
- ANON_VMA_LAZY: wangtao 提交了延迟创建 anon_vma 的系列(v1 共 15 补丁),旨在减少 fork 和 VMA 合并时的 rmap 锁竞争。Lorenzo Stoakes 在 Zagreb 会议上已有相关讨论,值得关注后续性能数据。来源
- kmem_cache_alloc_bulk 返回值语义: Christoph Hellwig 指出该函数返回值语义怪异(必须为 0 或请求数),讨论是否应改为返回 bool 或 void。涉及 slab 分配器接口设计,影响内核各子系统调用者。来源
- O_CREAT|O_DIRECTORY 新 open flag: 讨论是否应新增一个组合 flag,允许
open()原子性地“创建目录并打开”,避免 mkdir+open 的 TOCTOU 窗口。来源
⚡ 一句话速览
- arm64 将 fixmap 和 kasan 页表移出 BSS 段,为后续的 KASLR 和线性映射解耦做准备。来源
- 修复了 hfs 文件系统中 MDB 和 bitmap buffer_head 可能别名导致的数据损坏问题。来源
- 修复了 appletalk 协议中 aarp_entry 未初始化导致的内核堆信息泄露。来源
- 修复了 ocfs2 卸载路径中
osb->journal的空指针解引用(KASAN 报告)。来源 - 修复了 fanotify FAN_REPORT_TID 模式下报告的 pidfd 应为线程级而非进程级的问题。来源
- 修复了 octeontx2-af 驱动中 mcam entry 初始化使用 kmalloc_array 导致未初始化字段的问题。来源
- 修复了 t7xx 5G WWAN 驱动中 MD 和 SAP 挂起之间的时序问题。来源
- Rust 的
Page::nid方法标记为 inline,避免不必要的函数调用开销。来源 - 新增
F_SEAL_EXEC的 man page 文档,该 seal 自 v6.3 起已存在但未记录。来源