2026-06-18 内核社区日报
今天最值得关注的是 userfaultfd 对特殊 VMA 的注册防护,以及 DAMON 结合 mTHP 的自动折叠/拆分,利用 ARM SPE 硬件反馈来指导策略。
🧠 重点 · 内存
1. DAMON 引入 mTHP-aware collapse/split 机制,ARM SPE 反馈闭环
发生了什么: Wang Lian 发布了 RFC v1 系列,将 DAMON 的监测能力与 multi-size THP (mTHP) 的折叠/拆分结合。核心改动包括:
- 在 DAMOS
DAMOS_COLLAPSE操作中新增target_order字段; - 向 khugepaged 添加外部调用接口
damon_collapse_folio_range(); - 实现 mTHP-aware 的
DAMOS_COLLAPSE处理函数; - 引入新的
DAMOS_MTHP_SPLIT操作及hot_threshold参数; - 实现
DAMOS_MTHP_SPLIT处理函数; - 为 sub-THP 拆分决策添加 SPE(Statistical Profiling Extensions)反馈。
为什么重要: 该补丁系列将 DAMON 的监测能力与 mTHP 的折叠/拆分决策结合,并通过 ARM SPE 硬件反馈辅助拆分判断,有望提升透明大页策略的适应性。来源
2. PSI 跳过无新 IRQ 时间时的中断时间计算
发生了什么: Usama Arif 提交的补丁在 sched/psi 中,当 irqtime 没有新增长时,跳过 irqtime_account_irqtime() 的调用。PSI 的 irq 指标通过统计每个 CPU 上 IRQ 模式的总时间(由 struct irqtime 维护)来计算压力。如果两次 tick 之间没有新的 IRQ 发生(delta 为 0),仍调用该函数会触发不必要的原子操作和 per-CPU 变量访问。
为什么重要: 减少了 PSI 轮询路径的开销,尤其在 IRQ 不活跃的 CPU 上。PSI 是 Android 系统性能监控的核心(如感知卡顿、负载反馈),此优化对常驻后台监测的服务有益。来源
3. hugetlb:pagemap 接口改用 PAGE_SIZE 粒度索引
发生了什么: Jane Chu 发布了 v2 系列,重构 hugetlb 的 /proc/pid/pagemap 输出和 hugetlb_fault_mutex_hash() 接口。核心改动:
- 将
hugetlb_fault_mutex_hash()从原来的 huge page 级索引改为 PAGE_SIZE 级索引,使之与filemap_get_folio()等通用接口的索引语义一致; - 在 memory-failure 路径中,
is_raw_hwpoison_page_in_folio()等函数也同步迁移到 PAGE_SIZE 粒度,避免因索引粒度不匹配导致错误判断; - hugetlb 的 pagemap 读取使用
read_iter()替代旧式回调。
为什么重要: 统一索引粒度消除了 hugetlb 代码中隐含的“假定 huge page 大小为索引单位”的假设,使得 memory-failure 机制能正确处理 sub-page 粒度的 HWPoison,同时为后续 hugetlb 支持大页内混用不同状态(如部分 poisoned)打下基础。来源
4. s390:在 lazy MMU 模式下批量刷新 PTE
发生了什么: Alexander Gordeev 发布了该系列,利用 IPTE 指令的 “Additional Entries” 字段一次失效多个 PTE。在 lazy MMU 模式(mremap、mprotect 等系统调用所使用)下,set_pte() 和 ptep_get() 改用 per-CPU 缓存来暂存 PTE 值,在退出 lazy 模式时通过一条多 PTE 的 IPTE 指令一次性应用。该系列还引入了 arch_enter_lazy_mmu_mode_with_ptes 等辅助函数,并修改了 lowcore 结构以记录 lazy MMU 计数。性能测试显示:mprotect 加速约 15 倍,munmap 约 3 倍,mremap 约 28 倍;fork 变慢约 1.5 倍。
为什么重要: 批量 TLB 刷新可显著降低页表操作延迟,对 s390 上大型虚拟化/数据库负载有益。每条全局 IPTE 指令会引发 CEC 的 quiesce 状态,该系列减少了 IPTE 调用次数,从而缓解 CEC 范围的 quiesce 流量。在四台 LPAR 同时连续执行 mprotect 的极端测试中,quiesce 事件减少了约 25 倍。来源
5. page_owner:支持 per-fd 的 NUMA 节点和打印模式过滤
发生了什么: Zhen Ni 发布了 v10 系列(在几天前 Andrew 指出文档要求后可望合入),为 page_owner 添加基于文件描述符的过滤能力。用户通过打开 /sys/kernel/debug/page_owner 获得 fd 后,可通过 ioctl 设置过滤条件:
print_mode:选择输出完整栈、仅 stack handle、或两者;NUMA node filter:只显示指定 NUMA 节点上的 page owner 记录。
配套的 tools/mm/page_owner_filter 工具已更新。
为什么重要: 现有 page_owner 输出所有页的分配记录,对 NUMA 系统或大型内存排查极为冗长。per-fd 过滤允许每个调试进程按需筛选,减少 log 噪音并加速问题定位,尤其对 NUMA-aware 的应用性能调优有直接帮助。来源
6. vmalloc:利用连续物理内存加速ioremap/vmalloc/vmap
发生了什么: Wen Jiang 发布了 v4 系列,共 6 个补丁,在 vmalloc 路径中尝试批量映射连续物理页。当前 vmalloc 分配页表时以 PAGE_SIZE 为单位逐个映射,此系列在 arm64 上扩展了 CONT_PTE 批处理:若物理内存连续,则一次写入多组 PTE 并启用硬件 contiguous bit,减少页表写操作。该系列包含 arm64 hugetlb 的 CONT_PTE 批处理扩展、arch_vmap_pte_range_map_size 动态选择映射粒度、提取 vmap_set_ptes() 函数、扩展页表遍历支持更大 page_shift 并消除重新遍历、以及对齐 vm_area 以支持批量映射等改动。
为什么重要: 该系列通过连续页批处理减少了页表映射操作次数,提升了 vmalloc/vmap 的映射效率,降低了内存管理开销。来源
🔧 其它子系统
eBPF / BPF JIT
- LoongArch 实现 BPF arena、私有栈和异常支持:George Guo 为 LoongArch JIT 添加了
bpf_jit_supports_insn()门控未实现的 arena 原子指令、私有栈(bpf_jit_supports_private_stack())和异常(bpf_throw)。新的 patch 系列([PATCH 0/5])允许 LoongArch 运行更多 BPF 程序类型,包括 struct_ops 私有栈测试。来源 - PAHOLE 支持 GCC DW_TAG_GNU_annotation:Vineet Gupta 发布 v5,在 pahole 的 dwarf 加载器中添加对 GCC 生成的 DW_TAG_GNU_annotation 的支持,最终目的是为 GCC 内核构建启用 CONFIG_PAHOLE_HAS_BTF_TAG。该系列包含对 decl tag 参数索引的处理、BTF 类型标签排序测试等改动。来源
- pahole 编码真实函数签名(true signatures):Yonghong Song 发布 v6,在 DWARF loader 中分析参数 ABI 寄存器使用情况,丢弃经编译器优化(
DW_CC_nocall)后实际不存在的参数,使 BTF 反映编译后签名,减少 BPF 程序因参数不匹配导致的运行时错误。来源 - ringbuf 避免唤醒丢失及补充消费 API:Tamir Duberstein 提交 bpf 系列,修复 consumer 发布位置后未同步时 producer 写入新记录导致 wakeup 丢失的问题,通过在检查新数据前插入全屏障并添加边缘触发的 epoll 测试;同时新增
ring_buffer__consume_n和ring__consume_n接口,并明确文档要求消费者在再次等待前必须清空队列。来源
👀 值得追的讨论 / Patch
- swap tiers v8 讨论:Nhat Pham 回复 Youngjun Park 的 swap tiers v8 系列,对使用
memory.swap.tiers.max('0'禁用、'max'启用)的接口表示赞同,并讨论了 zswap 作为默认顶层 tier、内核触发的提拔/降级机制、per-CPU 分配缓存集成及 selftests 等后续方向。来源
⚡ 一句话速览
- walk_page_range_vma 替换系列 v2:Kefeng Wang 发布 v2,继续将 mincore、mprotect、mlock 和 migrate_device 中的 walk_page_range 替换为
walk_page_range_vma()。来源 - zswap per-cgroup proactive writeback v4:Hao Jia 发布 v4,添加了
memory.reclaim的zswap_writeback_only键,允许用户在 cgroup 层主动触发 zswap 回写,配合统计和测试用例。来源 - percpu 分配 NOFS/NOIO 递归修复 v4:Kaitao Cheng 发布 v4,确保 percpu 的后备 vmalloc 分配和 chunk 填充遵循调用者传入的 GFP_NOIO/GFP_NOFS 约束,避免在 FS 路径中递归进入 reclaim。来源
- DAMON hugepage collapsing sample 模块必要性被质疑:SeongJae Park 回复 v1 系列,质疑新增的 SAMPLE_DAMON_HPAGE 模块是否真的必要,认为该模块增加约 200 行代码且与其他示例功能重叠,担忧维护负担。另有讨论指出该模块的 config 依赖存在冗余(DAMON_VADDR 已隐含 DAMON 依赖)。来源
- page_alloc 使用已有 highatomic 保留 v2:JP Kobryn 发布 v2,在 buddy fastpath 中使用已有的 highatomic 保留。来源
- arm64 ARCH_HAS_COPY_MC v15:Ruidong Tian 发布 v15,继续完善 arm64 上 copy_mc_to_kernel() 的实现,仍在对 uaccess 和 GHES 路径进行微调。来源
- PageTransCompound() 移除 v2:Kefeng Wang 发布 v2,将 KSM 中最后一个用户替换为 folio 版本,彻底清除
PageTransCompound()宏。来源 - slub 去重 NUMA 策略计算:Hao Li 补丁将 allocation 路径中重复的
policy_nodemask()调用提取为通用 helper,减少冗余。来源 - page_alloc 构建 vm_numa_stat_key 条件修复:Ben Dooks 修复了
CONFIG_NUMA=n时错误编译vm_numa_stat_key导致链接失败的问题。来源 - DAMON sysfs 目录释放顺序修复 v1:SeongJae Park 提交系列,分别修复
access_pattern_add_dirs()中目录 put 顺序和scheme_add_dirs()内部错误时的 stats 目录释放问题。来源