2026-06-17 内核社区日报

今日内存子系统关注多项锁竞争优化和资源泄漏修复:__access_remote_vm 改用 per-VMA 锁、统一 walk_page_range_vma、khugepaged xarray 节点泄漏修复;同时 swap tier 引入 per-cgroup 设备优先级控制。


🧠 重点 · 内存

1. 远程内存读取路径尝试减少 mmap_lock 依赖

发生了什么:
Rik van Riel 提交系列(3 个补丁):① 对 mm->context.untag_mask 使用 READ_ONCE/WRITE_ONCE;② 允许 folio_walk_start() 在 per-VMA 锁下运行;③ 在可能的情况下无需 mmap lock 即可读取远程内存。来源

为什么重要:
减少对全局 mmap_lock 的依赖,在并发场景下降低锁竞争,提升内存操作的可伸缩性。

2. khugepaged 修复 collapse_file 失败后 xarray 节点泄漏

发生了什么:
syzkaller 发现,当 collapse_file() 的 collapse 因某些原因(如页面状态不符)失败时,已分配的 xarray 节点未能释放,导致内存泄漏。Rik van Riel 提交补丁,在 collapse_file() 失败路径中显式调用 xa_destroy() 清理残留的 xarray 节点。

该问题在 xarray 的 slot 中表现为 xa_is_node() 返回 true 的孤立节点,永久占用 slab 内存。

为什么重要:
xarray 节点泄漏随着 collapse 失败累积可能导致 slab 内存膨胀,特别在使用大量 tmpfs/shmem 且 khugepaged 活跃的系统上风险较高。syzkaller 的触发表明该路径可被正常用户空间操作可达。

来源


3. 使用 walk_page_range_vma() 替换 walk_page_range(),并在 mincore 中尝试 per-VMA lock

发生了什么:
Kefeng Wang 提交系列 (4 个补丁),在 mincore 中先尝试 per-VMA lock 并改用 walk_page_range_vma(),在 mprotect、mlock、migrate_device 中也改用 walk_page_range_vma()

为什么重要:
该系列将多个内存管理路径的页表遍历接口统一为 walk_page_range_vma(),有利于代码一致性。

来源

4. shrinker_info 拆除与扩容的竞争修复

发生了什么:
Qi Zheng 修复 expand_shrinker_info() 与 teardown 之间的数据竞争。expand_shrinker_info()shrinker_mutex 保护下遍历所有可见的 memcg,为其分配新的 shrinker_info 单元。但若在遍历过程中某个 memcg 被销毁(shrinke_info 已在 free_shrinker_info() 中被释放),则后续访问空指针导致崩溃。

修复方式为在 expand 过程中检查 memcg 是否仍存在,并使用 RCU 机制确保 info 的安全引用。

为什么重要:
该路径在 memcg 频繁创建/销毁的环境(如容器动态扩展)或 shrinker 注册/注销时触发,不修复则可能产生内核崩溃或 use-after-free。

来源


5. shrinker debugfs 空指针解引用修复

发生了什么:
同一作者的另一补丁修复 shrinker debugfs 中的 NULL 指针访问。当某个 shrinker 实例尚未与 memcg 关联即被 debugfs 读取 count 时,代码试图解引用空指针。补丁在相应的回调函数中添加空检查。

为什么重要:
debugfs 接口通常由用户态工具(如 trace-cmdbpftrace)触发,该空指针解引用会导致内核 panic,属于稳定性和安全修复。

来源


6. opportunistic_compaction 避免碎片驱动的 reclaim 循环

发生了什么:
Matthew Brost 提交该系列 v6,包含两个补丁:

  • [v6,1/2] mm: Introduce opportunistic_compaction concept to vmscan and shrinkers
  • [v6,2/2] drm/xe: Make use of shrink_control::opportunistic_compaction hint

来源

为什么重要:
该系列在 vmscan 和 shrinker 中引入 opportunistic_compaction 概念,并让 Xe 驱动应用对应 hint,为内存回收路径增加一种可选的分支。

🔧 其它子系统

网络

  • AF_XDP selftests 超时行为稳定:Tushar Vyavahare 系列修复 xsk selftests 中超时处理,显式处理超时避免随机失败。 来源

eBPF

  • libbpf ringbuf 零边界修复:Tamir Duberstein 提交补丁修复 ringbuf_process_ring() 中当 n 为零时的问题——原代码在检查记录边界之前会推进消费者位置并调用回调,导致误消耗第一个可用记录;修改为在读取 ring 位置前直接返回 0,使 ring_buffer__consume_n()ring__consume_n() 在所有记录仍处于队列中时返回。同时添加了相应的测试用例。来源
  • GCC 15 构建兼容性:Clark Williams 向后移植 strchr() const 限定符修复(resolve_full_path)至 6.1.y 稳定分支,解决 GCC 15 的 -Werror 构建失败。 来源
  • RISC-V BPF JIT:为RV32 JIT添加BPF_SDIV和BPF_SMOD的有符号支持,修正此前将它们当作无符号操作的问题。来源

调度

  • scx_flatcg vtime delta 计数修正:修复反向的 vtime delta 记账,导致 cgroup 间 CPU 时间分配异常。 来源

👀 值得追的讨论 / Patch

6. zram 交换 I/O 路由方向讨论

Jianyue Wu 提交 “[PATCH 0/3] mm/zram: route block swap I/O through swap_ops” 补丁系列,试图让 zram 绕过通用块层直接注册 swap 回调。Christoph Hellwig 明确反对此方向,认为压缩应在核心 swap 代码中处理,而非依赖块设备层面的绕过。Sergey Senozhatsky 仅就 “legacy interface” 表述进行了澄清讨论,未提出具体技术替代方案。来源

DAMON 自动调优的 huge page collapsing

Asier Gutierrez 提交补丁,引入 DAMOS_QUOTA_HUGEPAGE_MEM_BP 自动调优目标:根据监测到的热访问模式将内存区域折叠成 huge page,并通过检查 huge page 占总内存消耗的比例(以基点单位)自动调整折叠激进程度。同时附带一个演示模块(SAMPLE_DAMON_HPAGE)。评审中主要询问了该调优目标数值的单位定义,以及为何测试结果显示 THP always 性能更高而自动调优在内存效率上的优势未充分说明。 来源

⚡ 一句话速览

  • slab_alloc_context v3 继续 review:Vlastimil Babka 的 slab_alloc_context 系列 v3 收到 Suren Baghdasaryan 和 Harry Yoo 的 review,讨论 alloc_flags 的传递路径及补丁顺序调整。 来源
  • DAMON sysfs kobject_del 补全:SeongJae Park 补全多路径的 kobject_del(),解决 CONFIG_DEBUG_KOBJECT_RELEASE 下 sysfs 目录创建失败。 来源
  • page_vma_mapped_walk PMD 逻辑重构:Wei Yang 提交 v2 补丁重构 page_vma_mapped_walk 中 PMD 处理分支,将原来的 pmd_trans_huge/pmd_is_migration_entry 合并分支与 device-private 分支改为由 pmd_presentpmd_is_migration_entry 两个分支处理,移除了原先对 device-private pmd 的显式处理。讨论中 Lance Yang 指出新的 not_found() 路径在未持有页表锁时可能产生与并发迁移的竞态,David Hildenbrand 和 Balbir 参与讨论。来源
  • page_table_check 跳过 PFN 映射 PTE:Andrey Smirnov 修复 vDSO vvar 映射触发 page_table_check 误报,原因是这些页是 PFN 映射(非 struct page 管理),不应跟踪。 来源
  • 新增 mm_lru_add_drainmm_lru_add_drain_all tracepoint:JP Kobryn 添加这两个 tracepoint,分别报告 LRU add batch 被 drain 时的 CPU 和 batch 数量(区分完全与部分 drain),以及捕获 __lru_add_drain_all 的调用者及是否对所有 CPU 设置 force 标志,以定位 LRU 批处理 drain 的竞争根源。来源
  • 使用现有 highatomic reserves:JP Kobryn 提交补丁,在 buddy 快速路径中优先利用已有的 highatomic 预留内存。 来源
  • percpu 分配器考虑 GFP 约束:Kaitao Cheng v3 系列修复 percpu 分配中的 NOFS/NOIO 递归和 GFP_KERNEL 隐含的 IO/FS reclaim 风险。 来源
  • pgtable UAF via RCU 延迟释放 v5:David Carlier v5 采用 RCU 延迟释放内核页表,修复 ptdump 在 vmalloc 卸载时 walk 已释放页表的问题。 来源
  • DAMON samples 拼写修复:Asier Gutierrez 修正 Kconfig 中 “Thps” -> “This”。 来源
  • page_alloc 缺少 vmstat.h 包含:Ben Dooks 补上 vm_numa_stat_key 所需的 vmstat.h 头文件以消除编译警告。 来源