2026-06-02 内核社区日报

Live Update 进入 ABI v2 解除上限,lruvec drain 预释放死 folio 带来 37.6% 吞吐提升;vmalloc 优化意外引入 7.2% 回归。


🧠 重点 · 内存

1. mm/lruvec:lru_add drain 时预释放死 folio,per_process_ops 提升 37.6%

发生了什么:
Meta 的 JP Kobryn 发现,在他们的集群中约 24% 的 lruvec 锁竞争发生在 lru_add batche drain 时,且这些 folio 已经是"死"的状态(refcount 为 0,仅因缓存未及时释放)。commmit 9669b87065a6 在 drain 路径中引入预检查:若 folio 已 dead 则直接从 batch 中释放,不参与后续 LRU 操作,从而减少 lruvec 锁持有时间。

为什么重要:
kernel test robot 在 will-it-scale 中测得 per_process_ops 提升 37.6%。这个优化对经典 LRU 和 MGLRU 都有效,因为两者共享 lruvec drain 路径。Fleet 实测 24% 的锁等待转化为实际吞吐收益,是近期最直接的锁竞争优化之一。

来源


2. Live Update ABI v2:解除会话与文件数量上限(v5)

发生了什么:
Pasha Tatashin 发布了 Live Update 的 v5(共 13 个 patch),对 ABI 进行重大升级:

  1. 引入 struct luo_ser 集中状态管理:原先状态分散在多个 FDT 属性/子节点,现统一为单一 KHO raw subtree,简化序列化路径。
  2. KHO 添加 linked-block 序列化支持:允许会话和文件元数据使用多内存块链式存储,替代单块连续内存的限制。
  3. 解除固定上限:会话数不再限于 16 页(约 819 个),文件数不再限于单条 session 内的固定页数,改为按需动态分配。

配套测试验证了 2000 个 session、500 个文件在 kexec 后仍能正确恢复。

为什么重要:
Live Update 正被用于更广泛的持久化场景(如容器热升级)。此前 session 和文件上限是已知痛点,v5 彻底消除这一限制,并为后续支持更大规模状态迁移铺平道路。

来源


3. vmalloc 优化 vfree 引发 shm ops_per_sec 7.2% 回归

发生了什么:
lkp 报告 commit 60ced5818f64 (“vmalloc: optimize vfree with free_pages_bulk()”) 导致 stress-ng.shm.ops_per_sec 下降 7.2%。该优化在 vfree 时使用 free_pages_bulk() 将高阶页面分解后一并归还,目的是减少 split_page() 开销,但在 shm 场景下引入了额外延迟。

为什么重要:
7.2% 的性能回归在稳定版反合入前必须定位。根因可能与 batch 大小、缓存亲和性有关。开发者正讨论是否需要 revert 或用更细粒度的策略。

来源


4. zswap shrink_worker 写回游标做 per-memcg(v3 继续讨论)

发生了什么:
Hao Jia 的 v3 patch 将 zswap pool 的 shrink_worker 写回 cursor 从全局改为 per-memcg。Nhat Pham 在回顾中指出:per-memcg 游标能避免一个 cgroup 的持续换入换出导致另一个 cgroup 的 cold page 被跳过不回收。Yosry Ahmed 进一步建议简化实现,预计下一版将采纳。

为什么重要:
多 cgroup 场景下写回公平性是 zswap 优雅退出的关键。此改进直接改善容器混部环境的内存 pressure 响应。

来源


🔧 其它子系统

eBPF / BPF arena

  • arena kernel faults with scratch page:commit dc11a4dba246 引入,当 BPF 程序访问 arena 时,kernel 侧 VM 区域使用 scratch page 代替立即建立映射,避免对 kernel 地址空间的非预期改变。v3 系列后续补丁还添加了 BTF type tag 识别 arena 指针,支持函数直接返回 arena 指针(无需 cast 为 u64)。来源
  • pahole 支持 DW_TAG_GNU_annotation:gcc 16 新增此 DWARF tag,pahole 现可将其转换为 BTF decl_tag,使 eBPF 程序可以检测 GCC 编译的 struct/function annotation。来源

文件系统 / VFS

  • ntfs folio 引用修复:Matthew Wilcox 清理 ntfs 代码中对 page->__folio_index 的非法访问,并修复 handle_bounds_compressed_page() 中 highmem 处理逻辑。来源

架构

  • arm64:hot-removed page table dtor 调用:修复内存热拔出时未调用 pagetable_dtor() 的问题,避免 page table page 资源泄露。来源

👀 值得追的讨论 / Patch

  • swap cluster assert empty WARNING:syzbot 报告 swap_cluster_assert_empty 触发 WARNING,根因疑似 swap entry 引用计数泄漏。尚无修复被提出,值得跟踪。来源
  • vmalloc regression 调查:如上文所述,free_pages_bulk() 优化在 shm 场景下引发 7.2% 回退。讨论方向包括 revert 或增加 per-allocation 策略开关。来源
  • munmap 时 ANON_VMA_LAZY 延迟 anon_vma 创建:Barry Song 与 wangtao 就实现方式有不同见解(是否需要在 munmap 时强制创建 anon_vma),争论仍在进行。来源

⚡ 一句话速览

  • list_lru reparent: Shakeel Butt 的 v2 patch 在清空 xarray 前先 drain list_lru,防止 per-memcg slub kmem_cache 对象泄漏。收到 reviewer 确认,预期合入 next。来源
  • shmem read 优化: v2 系列通过合并 yarray 查找和 folio batching,减少 2-3 次 xa_load per page。Baolin Wang 给出 review,预计下版改进。来源
  • mTHP collapse 支持(v18):Nico Pache 的 khugepaged mTHP collapse 系列收到 Lorenzo Stoakes 深度 review;Lorenzo 建议拆分 memory-failure 相关 patch 简化评审。来源
  • HWPoison kernel pages 增强(v8):Breno Leitao 新增 -ENOTRECOVERABLE 返回值用于不可恢复 kernel page,并添加 sysctl panic_on_unrecoverable_memory_failure。Miaohe Lin 指出细节需要打磨。来源
  • percpu 内存分配 NOFS/NOIO 上下文丢失: Kaitao Cheng 修复在 chunk create/populate 中未保存 memalloc_nofs_save 上下文的问题,可能导致递归 deadlock。Michal Hocko 建议 revert 原 commit 并重做。来源
  • page_isolation huge page scan underflow: Kaitao Cheng 发现当扫描 compound page 时 nr_pages 可能因 folio 并发 split 而下溢,v2 改用更安全的 atomic read。来源
  • cleanup guard 移除 NULL 检查(v5):Dmitry Ilvokhin 对 DEFINE_GUARD() 添加 __nonnull_args() 注解,使编译器能在静态已知 NULL 时发出警告,并清理 nvdimm_busirqdesc_lock 的兼容代码。来源
  • pkey selftests 重构(v6):Hongfu Li 将共享的断言/追踪 helper 移到 pkey_util.c,修复多处 mmap/clone 错误检查缺失,避免测试 hang。来源
  • DAMON sysfs refresh_ms 测试:Ruslan Valiyev 添加 kdamond refresh_ms 功能的用户态测试,验证 sysfs 只读文件自动更新。来源
  • mmap_miss heuristic 跳过 VM_EXEC 映射:Usama Arif v7 patch 确保可执行文件的 mmap readahead 不受随机访问启发式干扰。reviewer 已 Ack 方案。来源