2026-06-19 内核社区日报

guest_memfd 实现 per-fd 内存属性,支持 in-place 转换,为 SEV-SNP/TDX 带来更灵活的隐私页面管理;Barry Song 提议 swap 耗尽时避免拆分 large folio,减少 swapout 路径的性能损耗。

🧠 重点 · 内存

1. guest_memfd in-place 转换:引入 per-gmem attributes 与 KVM_SET_MEMORY_ATTRIBUTES2

发生了什么:
Ackerley Tng 发布此系列 v8 版本(共 46 个 patch)。01/46 引入 per-gmem attributes 并用于保护用户映射;02–06/46 重命名、移动和条件化 KVM 内存属性配置;07–12/46 为私有/共享状态提供通用接口并接入 guest_memfd;13/46 添加 KVM_SET_MEMORY_ATTRIBUTES2 ioctl 基础支持;14/46 确保转换前页面未使用;15/46 在转换时调用架构 invalidation hooks;16/46 在范围已有请求属性时提前返回;17/46 通告该 ioctl;18/46 处理 lru_add fbatch 引用计数;19/46 释放时使用实际大小失效;后续 patch 继续实现转换逻辑与集成。

为什么重要:
该系列为 guest_memfd 添加了原位私有/共享转换的完整基础设施,包括统一的 per-gmem 属性接口、新 ioctl、转换前的安全性检查(页面未使用、架构失效钩子)以及引用计数修复,为机密虚拟机的私有/共享转换提供了核心支持。

来源

2. swap 耗尽时避免拆分 large folio

发生了什么:
Barry Song(Xiaomi)提交 RFC patch,处理 swapout 过程中 large folio 因 swap 空间不足而被拆分为多个小 page 的问题。当前逻辑:shrink_folio_list() 尝试分配 swap slot 时,若失败(swap 禁用或已满),folio 会被拆分成 4K 页面,每个页面独立尝试分配 slot,浪费 CPU 和 TLB 且增加内存碎片。Barry 提议:在 swap slot 分配失败时直接跳过对该 large folio 的 swapout(不拆、不尝试),让其停留在内存,等待后续 reclaim 或直接回收(如 TRIM/refault)。patch 在 do_swap_pageshrink_folio_list 中增加了条件判断。

为什么重要:
对于大量使用 mTHP(multi-size THP)的现代系统(如 Android GKI 中 enable 了 mTHP),swapout 的大页拆分是主要的性能损失来源之一。此 patch 避免不必要的拆分,降低 swapout 延迟和后续 page fault 的 refault 开销。讨论中 Barry 也提到 swap 完全不存在的系统(如 embedded)同样受益。

后续动态: Nico Pache 回复指出 swap 空间不足时不应直接跳过 reclaim,而应考虑优先回收非匿名页或进入 OOM;Barry 回应认为可以结合压力检测做更精细控制。该 RFC 仍处于早期讨论阶段。

来源

3. 持久 huge zero folio 改为只读的讨论

发生了什么:
Xueyuan Chen 在回复 David Hildenbrand 的邮件中,讨论将 persistent_huge_zero_folio 映射为只读的方案。邮件提到可以复用现有的 set_memory_ro() 接口,并指出 arm64 平台上的 set_memory_r* API 当前仅支持 vmap 区域而不处理线性映射地址;计划在下一版中扩展 arm64 实现,使其能利用 bblm2 特性修改线性映射页表项。

为什么重要:
该讨论明确了实现将 huge zero folio 映射为只读的技术路径(复用 set_memory_ro()),并识别出 arm64 平台的现有限制及扩展需求,为后续的安全加固提供了实现方向。

来源

4. KASAN HW_TAGS: 新增 boot option 跳过 free time poisoning

发生了什么:
Dev Jain 提交 RFC 系列,为 KASAN HW_TAGS(基于 ARM MTE)引入 boot option kasan.elide_free_poison,在 slab/page 释放时不再进行 MTE poisoning,仅保留分配时的 tagging。对于大量分配/释放的场景(如 I/O 密集型应用),每次释放时进行 MTE 操作成本可观(内存 barrier、cache line bounce)。patch 在 kasan.h 中添加条件判断,跳过 __kasan_slab_free 等函数的 poisoning step。

为什么重要:
部分生产环境(如数据库、存储服务器)对 MTE 提出的误报检测要求低于对实时性的要求。此选项可显著降低 KASAN HW_TAGS 的运行时开销(无实测数据,但根据 ARM MTE 特性,每次 poisoning 涉及额外的缓存一致性操作),在调试初期或非关键路径上提升性能。该选项通过 boot param 动态选择,不影响默认行为。

来源

5. DAMON 引入 hugepage_mem_bp 自动调优目标

发生了什么:
Asier Gutierrez 发布 v2 系列,为 DAMON 的 quota 自动调优引入新的目标 metric damos_hugepage_mem_bp,该 metric 衡量系统当前 huge page 占用与总内存消耗的比值(单位 bp)。DAMOS 可将该比例设为 quota 自动调优的目标,据此调整 region collapse 的速率,使大页占比趋向用户指定的期望值。

为什么重要:
TLB 缺失是许多系统的性能瓶颈,使用 huge page 可缓解这一问题,但全局开启 THP 容易导致内存碎片和浪费。该自动调优机制允许系统管理员指定期望的大页占比,由 DAMON 自动调节 collapse 行为,在降低 TLB 缺失开销与避免过度使用大页之间取得平衡,从而减少手动调参需求,提升内存使用效率。

来源

6. Dynamic Kernel Stacks 系列面临“非凡主张需要非凡证据”的评审门槛

发生了什么:
David Stevens 的 v2 “Dynamic Kernel Stacks” RFC 系列收到 H. Peter Anvin 与 Dave Hansen 的严厉反馈。H. Peter Anvin 指出动态栈使得内核在任意点可发生页故障并可靠分配内存,这一主张需要提供非凡证据(extraordinary evidence),同时强调维护复杂性及历史上类似方案的死锁风险。David Stevens 承认当前缺乏证据,询问收集证据是否可能获得上游认可,并表示 Google 愿意携带该 RFC 下游测试以建立上游合并案例。

为什么重要:
该讨论将上游对动态内核栈方案的评估标准明确为“需要提供非凡证据”,并聚焦于入口代码复杂性、死锁风险等根本障碍,而非具体实现细节。这决定了该系列只有通过充分且令人印象深刻的性能与可靠性数据,才有可能被考虑合并。

来源

7. guest_memfd selftests 大规模扩充

发生了什么:
作为 guest_memfd in-place conversion 系列的一部分,Ackerley Tng 和 Sean Christopherson 添加了多个新的 selftests:

  • 验证跨进程共享/私有状态一致性
  • 验证 fallocate(PUNCH_HOLE) 后私有状态不变
  • 验证 elevated page refcount 时拒绝转换
  • 增加线程安全的 TEST_EXPECT_SIGBUS 宏,修复全局 sigjmp_buf 不可重入问题
  • 支持 mmap() guest_memfd 后进行 in-place conversion 测试

为什么重要:
这些测试覆盖了新版 guest_memfd 的关键 corner case,特别是高 refcount 拒绝转换和线程安全信号处理,为合入主线提供了质量保障。

来源

8. mm/damon: 引入基于自动调优的 hugepage 折叠机制

发生了什么: 该补丁系列在 DAMON 中引入了一个新的自动调优 quota goal damos_hugepage_mem_bp,用于监控 hugepage 消耗占总内存的比率,并依据该比率自动将热区域折叠为 hugepage。Patch 1 实现了核心机制,Patch 2 曾包含一个示例模块(后因维护成本被移除),Patch 3 添加了设计文档。性能基准测试(MariaDB + sysbench)显示,启用该自动调优后事务吞吐量相比无 hugepage 基线提升约 0.27%,而全局 THP “always” 模式带来约 1.24% 提升但消耗了更多内存和 hugepage。

为什么重要: 该机制提供了一种自适应、细粒度的 hugepage 管理方式,避免了全局 THP “always” 模式导致的内存碎片和浪费,同时降低了管理复杂度——无需手动 madvise 或完全禁用 THP。通过自动调优,系统能在保持 TLB 命中率的同时限制 hugepage 过度使用,提升内存效率与部署灵活性。

来源

🔧 其它子系统

eBPF / BPF

  • BPF 环形缓冲区多项修复 v2:Tamir Duberstein 发布 v2,修复 ringbuf 零长度记录消耗、NULL callback 崩溃、overwrite 模式与消费遍历冲突、32 位计数器回绕导致生产消费死锁、以及消费后缺少 StoreLoad barrier 导致丢失唤醒。来源
  • cgroup link replace 中 BPF_F_PREORDER 索引 Bug 修复:Amery Hung 发现 replace_effective_prog()purge_effective_progs() 使用线性 hlist 位置来索引 effective 数组,但 BPF_F_PREORDER 改变了数组布局,导致错误替换或清除。v2 patch 已提交。来源
  • sockmap stream parser 防篡改提交 v4:Sechang Lim 将 sk_psock_strp_parse() 中修改 skb 的行为禁止,因为 strparser 通过 frag_list 链接触多个 skb,修改头部可能造成 UAF。v4 已根据 review 调整。来源
  • bpf_refcount_acquire 偏移参数拒绝:Yiyang Chen 提交补丁系列,禁止将 offset 非零的 PTR_TO_BTF_ID | MEM_ALLOC 传递给 bpf_refcount_acquire,避免运行时 refcount 操作从错误地址开始,与 verifier 模型对齐。补丁 1 添加 verifier 侧零偏移检查,补丁 2 增加 selftests 覆盖。来源

文件系统 / VFS

网络

  • net: mana PF adapter_mtu 为 0 时回退标准 MTU:Erni Sri 提交修复,Mana 网卡的适配器 MTU 可能被返回 0,此时直接返回 -EPROTO 导致驱动加载失败。patch 回退到标准 1500 MTU。来源

SLAB 分配器

  • slub NUMA 策略计算去重:Hao Li 提交 patch,将 alloc_from_pcs()__slab_alloc_node() 中重复的 NUMA 策略计算提取为公共路径,减少代码冗余。来源
  • slabinfo 修复 total_objects 属性名拼写:Yichong Chen 修复 SLUB sysfs 导出的 total_objects 属性名,之前拼写为 total_objects 错误匹配,导致用户空间工具读取失败。来源

👀 值得追的讨论 / Patch

  • percpu 分配器避免 IO/FS reclaim:Kaitao Cheng 提交补丁,将 percpu 内部后备分配的 GFP 限制为 GFP_NOIO(即清除 __GFP_IO | __GFP_FS),避免在持有 pcpu_alloc_mutex 时进入 IO/FS reclaim 导致潜在死锁。Michal Hocko 建议改用位运算形式 pcpu_gfp &= ~(__GFP_IO | __GFP_FS); 代替直接使用 GFP_NOIO,以便于代码 grep。讨论仍在继续。来源
  • __access_remote_vm 尝试 per-VMA lock:有补丁系列尝试将 __access_remote_vm()(用于 ptrace、procfs)的 mmap_lock 替换为 per-VMA lock。David Hildenbrand 回复认为,所有 GUP 只是遍历页表和调用 fault 处理程序,但持有 per-VMA 锁时 VMA 可能被释放、合并或由并发操作改变,导致问题;建议从支持单个 VMA 的接口开始,并在需要时回退到 mmap_lock。Suren Baghdasaryan 表示认同该思路,但自己暂无时间推动,愿协助 VMA 锁部分。来源
  • Dynamic Kernel Stacks v2 反馈:David Stevens 表示 Google 的 Android 团队愿意短期下游承载 RFC 补丁,以构建合并案例,但前提是上游至少存在可能成功的空间;hpa 回应称需出示“非常令人印象深刻的证据”,但并未彻底否定。来源

⚡ 一句话速览

  • DAMON sysfs kobject_del() 添加:SeongJae Park 发布 v1.2 系列,在 target、context、kdamond 等目录的清理路径中添加 kobject_del() 调用,确保 kobject 被正确注销,提高代码健壮性。来源
  • THP SWAP 对 PowerPC Book3S64 使能 v4:Ritesh Harjani 发布 v4,将 SWAPFILE_CLUSTER 改为运行时变量,并允许架构通过 ARCH_MAX_PMD_ORDER 覆盖 SWAP_NR_ORDERS,最终在 PowerPC Book3S64 上启用 THP_SWAP。该系列在 Radix 模式下将 zram 后端的 swapout 带宽吞吐量提升约 40–50%,在 Hash 模式下提升 100–130%。来源
  • KSM 移除 PageTransCompound 最后一个用户:Kefeng Wang 清理 KSM 中对 PageTransCompound() 的调用,随后删除该函数,已获 SeongJae Park Ack。来源
  • page_ext 迭代器缺少 section 校验:Ketan Kishore 修复了 for_each_page_ext 迭代器在内存热插拔时因未验证 PFN 所属 section 有效性而导致的 NULL 指针解引用问题,在 lookup_page_ext() 函数中增加 section 空值检查并返回 NULL。David Hildenbrand 建议添加 unlikely() 并精简注释。来源
  • alloc_tag /proc/allocinfo 引入 ioctl 过滤 v6:Abhishek Bapat 发布 v6,为 /proc/allocinfo 添加 ioctl 接口,并支持基于 size 和 accuracy 的过滤功能,减少输出噪声。来源
  • reserve_mem 支持静态内存预留:Shyam Saini 提交 RFC v1 和 v2,扩展 reserve_mem 使其能从 memblock 里预留静态内存区域(如 ramoops),无需运行时分配。来源
  • vfio mmap 偏移对齐问题:Lorenzo Stoakes 指出 vfio 设备 fd 的 mmap 偏移 0 可能不对齐到 PFN。Jason Gunthorpe 回应,通常 pgoff 空间与 pfn 空间对齐,多数驱动可改进以实现对齐,但存在个别例外情况,VFIO 应无问题。来源