2026-06-30 内核社区日报

今天内存子系统有多项 bug 修复和架构改进值得关注:mempolicy 修复 shmem 自动 NUMA 均衡、pgtable 通过 RCU 释放修复 ptdump UAF、mapping_seek_hole_data 溢出修复、page migration 批处理 offload v6 RFC、DAMON 优化与测试覆盖增强、以及 vma_flags_t 类型转换继续推进。

🧠 重点 · 内存

1. mempolicy:修复 shmem 自动 NUMA 均衡

发生了什么: Johannes Weiner 提交补丁修复 shmem 文件在自动 NUMA 均衡中的行为。当前 shmem_fault 中对 migrate_misplaced_folio 的调用逻辑存在缺陷,导致 shmem 页面(tmpfs、共享内存等)被错误地排除在 NUMA 均衡之外。补丁调整调用路径,使得 shmem 页面能够正常参与自动 NUMA 均衡迁移。

为什么重要: 自动 NUMA 均衡是系统在 NUMA 节点间动态迁移内存以优化访问延迟的关键机制。shmem 页面被排除会导致大内存应用的 NUMA 不平衡,影响性能。此修复使 shmem 正确参与 NUMA 均衡,对云服务器等大内存场景有益。

来源

2. 内核页表通过 RCU 释放修复 ptdump UAF

发生了什么: David Carlier 提交补丁系列,将内核页表释放改为通过 RCU 进行,以修复 ptdump 中的 use-after-free 问题。

为什么重要: 该补丁旨在修复 ptdump 调试路径中的潜在 UAF 问题,增强内核稳定性。

来源

3. mapping_seek_hole_data 溢出:最后页处理导致死循环

发生了什么: Zhen Yan 修复 mapping_seek_hole_data() 在处理 i_size == LLONG_MAX 的 shmem/tmpfs 文件时,最后页的偏移计算溢出。通过 memfd_create()fallocate() 可以创建此类文件;seek_hole_data 操作到达最后页时 page_offset 计算溢出,导致死循环或错误结果。补丁将计算改为使用 unsigned long long 并添加边界检查。

为什么重要: 这是一个可由本地用户触发的 DoS 漏洞。对于使用 memfd 或 tmpfs 的生产环境,此补丁阻止了拒绝服务攻击。

来源

4. Page migration 批处理拷贝与硬件 offload 框架(v6 RFC)

发生了什么: 提交 v6 RFC 系列,包含 5 个补丁:跳过已拷贝 folio 的数据拷贝;在 migrate_pages_batch 中添加批处理拷贝路径;添加拷贝 offload 注册基础设施;添加一个 DMA 批处理拷贝驱动(dcbm)用于测试;调整 NR_MAX_BATCHED_MIGRATION 以方便测试。

为什么重要: 该系列通过批处理拷贝路径和硬件 offload 注册基础设施,为页面迁移的拷贝过程引入并行化和硬件加速的可能。

来源

5. DAMON:文档更新、测试补充、代码优化

发生了什么: SJ Park 提交 11 个补丁的系列,涵盖:更新设计文档和 ABI 文档以反映新特性;新增 kunit 测试(如 damon_rand() 边界);补充 selftests(probe dirs、core/ops filters、dests dir、quota goal dir 等);在 damon_commit_target_regions() 中减少不必要的相邻范围设置(优化);拆分 probe 和 filters 设置函数以提升可读性;修复拼写错误。

为什么重要: 文档更新确保新特性被正确记录;测试补充增加代码覆盖率,减少回归风险;优化减少不必要的范围重设,提升性能;代码清理提高可读性。

来源

6. 持续将 vm_flags_t 用户转换为 vma_flags_t

发生了什么: Lorenzo Stoakes 提交 13 个补丁系列,继续将 vm_flags_t 转换为 vma_flags_t。引入 vma_flags_can_grow()vma_can_grow() 辅助函数,并更新 do_mmap__get_unmapped_areageneric_get_unmapped_areavm_pgprot_modifyvma_get_page_protcreate_init_stack_vma 以及 mm 核心、mlock、mprotect、mremap 等代码路径使用新类型。

为什么重要: 该系列延续了 VMA 标志位的类型迁移,通过将特定于 VMA 的标志与通用 vm_flags_t 在类型层面进一步分离,减少了类型混淆的可能。

来源

🔧 其它子系统

网络

  • 批量替换 __get_free_page() 为 kmalloc():Mike Rapoport 提交 net-next 系列 8 个补丁,将 b43、bnx2x、ice、libertas、mwifiex、sfc、wlcore 等驱动中无需页对齐的临时分配改用 kmalloc。这减少对 page allocator 的依赖,降低碎片。 来源

eBPF

  • LoongArch BPF JIT 消除尾调用计数器冗余加载:Tiezhu Yang 优化 epilogue 中的 TCC 加载,消除多余的双重加载模式。 来源
  • 新增 BPF 尾调用性能基准测试:Tiezhu Yang 添加 selftests 基准以追踪尾调用性能回归。 来源

👀 值得追的讨论 / Patch

7. device-private PMD 处理修复进入 v5,仍有评审意见

Wei Yang 提交 v5 修复 mm/page_vma_mapped 中设备私有 PMD 条目未正确识别的问题。评论者 David Hildenbrand 等持续审阅,尚无明确 Ack。值得关注最终合入状态。 来源

⚡ 一句话速览

  • slabobj_ext 栈溢出修复 v2:Shakeel Butt 提交 v2 修复 slabobj_ext 数组从 kmalloc 缓存溢出导致 Meta 生产环境栈溢出,使用严格更大的 kmalloc 缓存分配。 来源
  • memcg dying 提前退出 reclaim v2:Jiayuan Chen 提交 v2 系列,当 cgroup 正在 dying 时,reclaim 中 memory.high、memory.max 等路径直接退出,避免无效操作。 来源
  • vmpressure 跳过 cgroup v2 树核算并分离 v1 代码 v3:Usama Arif 提交 v3,在 cgroup v2 中跳过树核算,并将 v1 用户态 eventfd 接口移入 memcontrol-v1.c。 来源
  • DAMON 在 damon_set_regions() 中校验零长度 region:SJ Park 修补 DAMON 核心逻辑,防止 API 调用者传入零长度 region 导致异常。 来源
  • hugetlb vmemmap 优化:避免空 folio 列表时 TLB flush:Wentao Guan 修复 __hugetlb_vmemmap_optimize_folios() 中无条件调用 flush_tlb_all() 的问题,当 folio 列表为空时跳过。 来源
  • coredump_filter 新增 bit 9 用于 pre-exit 文件:Xin Zhao 提交 v5,为 coredump_filter 新增 bit 9,针对 dump 前的 pre-exit 文件。 来源
  • x86 pgd_lists 转换为 ptdescs v2:Vishal Moola v2 系列,继续将 x86 架构的页表分配从直接 page 管理转换为 ptdesc 抽象。 来源
  • mm: clean up folio LRU and swap declarations v5:Jianyue Wu 系列,重命名 swap.cfolio_lru.c 并整理 reclaim 相关声明。 来源
  • riscv: vmemmap 热添加后避免 spurious TLB fault v4:Vivian Wang 修复 section_activate() 后未刷新 TLB 导致页面异常的问题。 来源
  • mm/slub: slabobj_ext 修复:讨论从严格更大的 kmalloc cache 分配 slabobj_ext 数组的方案,但发现会导致严重的内存浪费(如 kmalloc-8k 的 obj_ext 从 64B 膨胀到 16KB),且可能自放大。Meta 在生产中默认启用内存分配分析,已在某些机器遇到该问题并临时禁用。讨论计划以 KMALLOC_TYPE 或 SLAB_BUCKETS 等方式作为后续回溯。来源