2026-07-05 内核社区日报
DAMON 核心错误处理大幅简化,
damon_stop()正式变为 void;KSM rmap walk 性能优化 v11 展示数百毫秒冻结的严重问题;hugetlb 修复空 nodemask 导致的潜在崩溃;文件系统方面O_CREAT|O_DIRECTORYmkdir+open 原子操作进入 v3。
🧠 重点 · 内存
1. DAMON 核心简化错误处理:damon_stop() 改为 void,damon_start() 失败时回滚已启动的 context
发生了什么: SJ Park 提交了一组 11 个补丁的 RFC,集中简化 DAMON start/stop/commit 的错误处理路径。(1) damon_stop() 的返回值始终为 0,且没有任何调用者检查——将其返回类型改为 void,并移除所有调用者中的返回值检查(包括 sysfs、reclaim、lru_sort 以及 mtier、wsse、prcl 示例)。(2) damon_start() 在启动多个 context 时,若中途某个 context 启动失败,该系列让 damon_start() 自动停止已启动的 context,避免遗留运行中的 context。(3) damon_call() 失败时,该补丁使其在返回错误前同步停止 context。(4) 该系列共修改 8 个文件,增加 32 行、删除 35 行,净减少 3 行代码。
为什么重要: 这些改动消除了 DAMON 核心中那些“理论上可能失败但实际从不失败”的返回值,并使多 context 启动和 damon_commit() 失败路径的语义更清晰。调用者不再需要手动清理残留 context,减少了因错误处理遗漏导致的潜在 bug(原文提到历史上曾发现并修复过这类 bug),同时简化了示例模块的代码。虽然尚在 RFC 阶段,但核心方向明确。
2. hugetlb 修复 alloc_fresh_hugetlb_folio 中空 nodemask 传递导致的空指针解引用
发生了什么: Sourav Panda 提交 v2 补丁,修复 alloc_fresh_hugetlb_folio() 在从 alloc_buddy_hugetlb_folio_with_mpol() 接收到 NULL nodemask 时的空指针解引用。若 order 为 gigantic,NULL nodemask 会传播到 hugetlb_cma_alloc_frozen_folio(),后者在 for_each_node_mask() 中直接解引用导致崩溃。补丁在 alloc_fresh_hugetlb_folio() 中显式检查 nodemask 是否为 NULL,并默认使用 cpuset_current_mems_allowed;同时为 hugetlb_cma_alloc_frozen_folio() 添加 node_isset(nid, *nodemask) 检查,使其尊重内存策略。
为什么重要: 该补丁修复了 gigantic hugepage 分配路径中可能触发的空指针解引用内核崩溃,该路径在启用 hugepage 的场景下具有稳定价值。补丁标注了 Fixes: eb02f14c4a2b ("mm/hugetlb: allow overcommitting gigantic hugepages") 并添加了 Cc: stable。
3. KSM rmap_walk 性能优化系列:冻结数百毫秒的问题有望解决
发生了什么: xu.xin16 提交 KSM reverse-mapping 性能优化系列。该系列修复了一个严重的性能问题:当 KSM 进行 rmap_walk 时,由于遍历方式不当,可能冻结应用程序数百毫秒。基准测试显示(20,000 个 VMA 共享同一个 anon_vma 时),该系列将 anon_vma 锁持有时间从 >500ms 降至 <2ms。Andrew Morton 回复表示这是重大改进,希望看到该系列完成。Andrew 附带的 AI 审查指出其中一个 32 位问题需要修复。
为什么重要: 该系列修复了 KSM 反向映射时的性能问题,可显著减少因长时间持有 anon_vma 锁导致的应用程序卡顿、延迟尖峰和吞吐量下降,甚至容器超时。
4. folio LRU 与 swap 声明清理:swap.c 正式更名为 folio.c
发生了什么: Jianyue Wu 提交 v7 系列,分三步整理 folio LRU 和 swap 声明。(1) 将 page-cluster sysctl 移到 mm/swap_state.c,与 swap readahead 代码同位置。(2) 将 mm/swap.c 重命名为 mm/folio.c。(3) 将 MM 内部 reclaim 和 workingset 声明从 include/linux/swap.h 移至 mm/internal.h。
为什么重要: 重命名后 swap cache 和 swap-in readahead 留在 mm/swap_state.c,folio LRU 帮助函数位于 mm/folio.c,内部 reclaim/workingset 声明移至 mm/internal.h,使得代码职责划分更明确,减少了不必要的全局可见性。
5. userfaultfd: 修正 UFFDIO_MOVE 中 pmd_migration_entry_wait 的参数传递
发生了什么: Usama Arif 提交补丁,修正 move_pages_huge_pmd() 中 pmd_migration_entry_wait 的参数。原先传入 &src_pmdval(局部栈变量)是错误的;该函数需要传入真实的 PMD 指针以锁定并重新读取页表。在 split-PMD-lock 内核上,栈地址还会解析到错误的锁。补丁改为传入 src_pmd,匹配 __handle_mm_fault() 和 hmm_vma_walk_pmd() 的做法。
为什么重要: 参数错误使 UFFDIO_MOVE 在处理巨大页迁移条目时可能等待无效地址或错误锁,导致操作不一致。修正后确保等待正确的 PMD,使等待行为与预期一致。
🔧 其它子系统
文件系统
O_CREAT|O_DIRECTORYmkdir+open 原子操作:Jori Koolstra 提交新系列,实现open(O_CREAT|O_DIRECTORY)作为原子 mkdir + open 操作。系列将O_IS_MKDIR检查从 VFSlookup_open()下推到各个文件系统,并增加了通过 dangling symlink 创建目录的拒绝逻辑。来源- ntfs: serialize attribute-list replacement with lookups v5:Cen Zhang 修复 ntfs 中
attribute-list替换时与并发查找间的 slab-use-after-free 问题(KASAN 在ntfs_attr_lookup中报告)。v5 引入 per-ntfs_inode 的attr_list_lock,搜索上下文在读侧持有该锁,属性列表修改路径在写侧替换列表,从而防止游离指针被访问。来源 - ntfs: 修复 insert range 错误路径中的 hole runlist 内存泄漏:
ntfs_non_resident_attr_insert_range()在ntfs_attr_map_whole_runlist()失败时未释放hole_rl。来源 - ksmbd: 修复单字节范围锁检查跳过:
check_lock_range()使用 inclusive 范围,start == end应视为有效的一字节范围而非空范围。来源
网络
- IGMP/MLD UAF 与内存泄漏修复:Eric Dumazet 提交 3 补丁系列,修复 IPv4 IGMP 和 IPv6 MLD 中设备销毁与查询处理之间的竞态导致的 UAF(在
igmp_gq_start_timer()和 MLD delayed work 中),以及igmp_mod_timer()中可能的引用计数泄漏。来源 - PRP RedBox (PRP-SAN) 支持:为 hsr 驱动添加 PRP RedBox 数据路径与重复丢弃逻辑,使 PRP RedBox 能代理其后挂接的 SAN(单附加节点)设备。该系列实现 IEC 62439-3 标准中的 PRP-SAN 场景。来源
- bnge/bng_re: 修复 TX ring ID 宽度:Firmware 需要超过 16 位来寻址 TX ring ID,将 HSI field 宽度扩至 32 位以避免溢出。来源
- ipv4: fib: 使用 kfree_rcu 释放 fib_alias:在 notifier 失败的错误路径中,
fib_insert_alias已将新的fib_alias发布到fa_list,因此删除时必须使用kfree_rcu()以避免可能的 RCU 使用后释放。来源 - xfrm6: 修复 secpath 满时的越界写:
xfrm6_input_addr()的深度检查少计了 1,导致在sp->len == XFRM_MAX_DEPTH时仍尝试写入sp->xvec[sp->len++]。来源
eBPF
- HID BPF: 修复符号比较错误:
hid_bpf_hw_request()中将带符号的ret与无符号的size比较可能导致缓冲区副本溢出。来源 - libbpf: 修复 bitfield dump 的边界检查:
btf_dump_get_bitfield_value()的边界检查应使用完整的 backing type 大小而不是已读取的字节数。来源 - XDP checksum hint 与 assertion RFC 继续讨论:关于在 redirect 场景保留 HW checksum 验证结果的讨论,有观点认为 assertion 部分与 hint 部分可独立推进,需要进一步整理。来源
Rust
- fwctl Rust 抽象:Zhi Wang 提交补丁,为 Rust 驱动提供
fwctl_device和fwctl_uctx的安全 Rust 包装,允许注册 fwctl 设备并通过类型化的 trait 接口实现固件 RPC 回调。该抽象将生命周期和引用计数处理封装在包装器内,避免了从fwctl_device释放路径中要求 Rust drop glue。来源 - workqueue wrapper 讨论 C 侧新工作队列的影响:Marco Crivellari 报告,由于 C 侧引入了
system_percpu_wq和system_dfl_wq作为system_wq和system_unbound_wq的替代,Rust 工作队列的 doctest 触发了弃用警告,讨论是否应跟进更新。来源 - nova-core auxiliary bus Rust 绑定:Alistair Popple 为 NVIDIA 开源 GPU 驱动 Nova 添加 auxiliary bus 的 Rust 注册数据。来源
安全 / 内核
- seccomp: non-cooperative pinned-memfd argument redirect v5:Cong Wang 提交 v5,新增
vm_mmap_remote()和vm_munmap_remote()用于在另一个进程的 mm 中安装映射,配合SECCOMP_IOCTL_NOTIF_SEND_REDIRECT实现非交互式的系统调用参数重定向。v5 增加对clone/fork和rt_sigreturn的 seccomp 别名支持,以及重定向后重新验证外层 filter 的逻辑。来源
👀 值得追的讨论 / Patch
slub: free_to_pcs_bulk() 内存泄漏修复讨论
发生了什么: Shengming Hu 提交的补丁修复了 free_to_pcs_bulk() 中 remote_objects[] 填满跳转到 flush_remote 后丢失本地对象的潜在内存泄漏。Harry 回复指出控制流复杂,并提到该函数在 v6.18 周期已修复过一个类似泄漏。Shengming 确认该泄漏是通过代码审查发现,当前用户(如 maple_node 缓存)因条件苛刻无法触发,补丁旨在使代码对未来的用户或 PCS_BATCH_MAX 变化更健壮。来源
为什么重要: 该补丁消除了一个因控制流复杂导致的内存泄漏隐患,避免了未来缓存配置或使用模式改变时可能出现的资源泄露,提升代码长期健壮性。
⚡ 一句话速览
- mm: page_reporting batch 容量可配置:允许 virtio balloon 等驱动设置批处理容量,适应不同设备缓冲区大小,Andrew Morton 表示接受。来源
- secretmem 在 HIGHMEM 下禁用:
secretmem_fault使用set_direct_map在 HIGHMEM 上不可用,补丁将其禁用以防未定义行为。来源 - arm64 huge_ptep_get 处理未对齐地址:Dev Jain 系列修复多处 hugetlb PTE 访问,v3 增加对未对齐地址的处理。来源
- 稀疏内存 mem_map 遮蔽警告修复:Anuradha Weeraman 修复
sparse_init_one_section()中参数名与全局mem_map冲突的 W=2 警告。来源 - PMD 级 swap entry 预备补丁系列提交并讨论补丁管理方式:Usama Arif 提交了 PMD 级 swap entry 的预备清理补丁系列(前6个补丁),并询问 Andrew Morton 对于后续小修改是发送 fixlet 还是完整替换版本的偏好。Andrew 回应了其当前流程偏好,表示此案例中可由 Usama 决定。来源
- tail page private 在 free/split 时归零:Zi Yan 的 v2 系列确保复合页返回分配器前
tail_page->private为零,并检查大页拆分时新 folio head 的 private 字段;包含 percpu-km 清 private、compaction 移除冗余 order 记录、split 与 free 时检查等改动。来源