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 进行重大升级:
- 引入
struct luo_ser集中状态管理:原先状态分散在多个 FDT 属性/子节点,现统一为单一 KHO raw subtree,简化序列化路径。 - KHO 添加 linked-block 序列化支持:允许会话和文件元数据使用多内存块链式存储,替代单块连续内存的限制。
- 解除固定上限:会话数不再限于 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,并添加 sysctlpanic_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_bus和irqdesc_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 方案。来源