2026-06-20 内核社区日报

今天 DAMON reclaim 修复了内存泄漏和 ctx 生命周期问题;filemap 通过减少 xarray 查找次数加速小尺寸读缓存。

🧠 重点 · 内存

1. DAMON reclaim 修复潜在内存泄漏与 use-after-free

发生了什么: yahia ahmed 提交了一个 v2 patch 系列,修复 damon_reclaim_init() 中的潜在内存泄漏:移除早期返回(early return)以让函数继续执行,并将 ctx 变量置为 NULL 以避免 use-after-free。来源

为什么重要: 该修复消除了 DAMON reclaim 初始化路径中的内存泄漏和 use-after-free 风险,使冷内存自动回收模块更健壮。

2. filemap 减少小尺寸读缓存的 xarray 查找次数

发生了什么: Chi Zhiling 提交了 [PATCH 0/2] 优化 filemap 中 xarray 查找:
(1)在 filemap_get_read_batch() 中,当只获取一个 folio 时,xas_next() 会触发额外的 xarray 迭代,而实际上可以直接跳出。该优化将边界检查从循环条件移至 xas_next() 之前,避免一次不必要的查找。
(2)类似地,filemap_get_folios_contig() 也应用相同的优化,减少 xas_next() 调用次数。

为什么重要: 对于小尺寸读(例如恰好命中一个缓存页),减少一次 xarray 查找可以降低 CPU 开销,提升 read 操作速度。虽然单次节省很小,但遍历热点路径累积效果可观。

来源

3. DAMON 引入 damon_nr_accesses_mvsum() 并移除 nr_accesses_bp 字段

发生了什么: SeongJae Park 提交了 [RFC PATCH 0/13] 系列,引入 damon_nr_accesses_mvsum() 函数,并逐步将 DAMON 中所有依赖 nr_accesses_bp 字段的地方替换为此移动求和函数,最终移除了 damon_region->nr_accesses_bp 字段及相关辅助函数。

为什么重要: 该系列移除了不再需要的字段及相关辅助函数,简化了代码。

来源

4. DAMON 处理零采样间隔

发生了什么: SeongJae Park 提交 RFC 补丁,在 damon_max_nr_accesses() 中处理零采样间隔。

为什么重要: 该修复增强了 DAMON 在异常配置下的健壮性。

来源

5. ctx 生命周期与范围检查修复

发生了什么: Yiyang Chen 提交补丁修复 hid_bpf_get_data() 中的整数溢出漏洞。原检查 offset + size <= ctx->allocated_size 因无符号加法可回绕,导致超大 size 通过检查并返回越界指针。修复改为先拒绝 offset > ctx->allocated_size,再比较 size 与剩余空间 ctx->allocated_size - offset

为什么重要: 该漏洞可被恶意 HID 设备或 BPF 程序利用,通过构造 size = ~0ULL 绕过边界检查,读取或写入 ctx 缓冲区外的内核内存。补丁同时新增 selftest 回归测试,验证此类请求返回 NULL。

来源 | 来源

🔧 其它子系统

文件系统 / VFS

  • coredump 优化:Xin Zhao 提交 v3 补丁,尝试在 coredump_wait() 中当 MMF_DUMP_MAPPED_SHARED 未设置时提前调用 exit_files(),以减少不必要的文件锁竞争。但 Christian Brauner 指出该做法会破坏 systemd-coredump、apport 等工具通过 /proc/pid/fd 枚举文件描述符的能力,补丁未被接受;作者表示将重新设计。来源
  • loop 设备 NULL 指针解引用:Tetsuo Handa 提交 v4 补丁修复 lo_rw_aio() 中可能出现的 NULL 指针解引用,当 loop 设备被快速打开关闭时可能出现。来源
  • fuse SYNCFS 权限检查:Jimmy Zuber 提交 v2 系列,允许特权用户态 fuse 服务端使用 FUSE_SYNCFS 操作,并添加了 selftest。来源

网络

  • Realtek phy 10G 广告位清除:Jan Klos 提交 v2 补丁,修复 RTL8127A 连接 10G 链路夥伴后无法降速的问题——MDIO_AN_10GBT_CTRL_ADV10G 位未被清除,导致总是广告 10G。清除该位后,用户可以强制协商更低速度。来源
  • bnx2x 内存泄漏修复:修复 bnx2x_alloc_mem_bp()tpa_info 分配失败时未释放早期 fastpath 结构体的问题。来源
  • netdevsim UAF 修复:Hrushiraj G. 提交补丁,修复 __nsim_dev_port_del() 中 debugfs 文件持有已释放 netdevsim 结构的指针导致的 use-after-free。来源
  • PSE-PD 解耦控制器查找:Corey Leavitt 的系列被接手发布 v2,将 PSE 控制器注册/注销事件通过 notifier 转发给 PHY 层,避免在 MDIO 探测时的死锁。来源
  • NFC 和 prestera 非对齐访问修复:Runyu Xiao 提交多个补丁,修复 st-nci 和 prestera DSA 标签代码中对非对齐内存的直接强制类型转换,改用 get_unaligned 系列宏。来源来源
  • airoha 队列选择下溢:修复 airoha_dev_select_queue() 中当 skb->priority 为 0 时无符号减法导致的队列下标下溢。来源

eBPF

  • ringbuf 防止丢失唤醒:Tamir Duberstein 提交 v2 系列,修复 libbpf ringbuf 处理中消费者发布位置后未检查生产者位置更新的问题,确保不会错过唤醒。来源
  • sockmap 禁止从 tc/xdp/flow_dissector 更新/删除:Sechang Lim 提交 v2 补丁,因这些上下文中的 sock_map_update_common()__sock_map_delete() 会以 stab->lock → sk_callback_lock 顺序上锁,而 SK_SKB stream parser 在 sk_psock_strp_data_ready() 中持有 sk_callback_lock 后,通过 tcp_bpf_strp_read_sock() 发送 ACK 出站时可能触发一个 sched_cls 程序从 sockmap 删除并获取 stab->lock,形成反向锁顺序,导致死锁。补丁修改 may_update_sockmap() 让 verifier 拒绝这些程序中的更新/删除操作。来源
  • sockmap 拒绝会修改包的 stream parser:同一位作者提交 v5 系列,防止将 SK_SKB 类型 stream parser 附加到 sockmap 上,因为 parser 可能在 frag_list 链上操作并改变 skb 长度,引起 slab 错误。新补丁只在 parser 程序通过 bpf_skb_pull_data() 等写操作时拒绝,只读 parser 仍然允许。来源

Rust

  • DRM Higher-Ranked Lifetime 私有数据:Danilo Krummrich 提交 v3 系列,为 Rust DRM 驱动引入 RegistrationGuardRegistrationData,确保 ioctl 处理时父总线设备仍绑定,避免 UAF。改动包括重命名 DeviceContext、添加 ParentDevice 关联类型等。来源
  • EDU PCI 驱动样本:Maurice Hieronymus 提交 v2 系列,添加一个使用 MMIO、IRQ 和 DMA 的 QEMU EDU 设备样本驱动,并扩展了 Rust PCI 和 completion 抽象(complete() 方法、pcim_enable_device() managed 版本)。来源

👀 值得追的讨论 / Patch

  • KCSAN 报告 __anon_vma_prepare 与 __vmf_anon_prepare 数据竞争:syzbot 通过 KCSAN 检测到在 __anon_vma_prepare()__vmf_anon_prepare() 之间存在数据竞争,涉及堆栈跟踪中的写操作(mm/rmap.c:212)与读操作(mm/memory.c:3823)。报告未包含修复。来源
  • Dynamic Kernel Stacks 系列被指仅为 PoC:Thomas Gleixner 回复称该系列“连 RFC 都算不上,只是 PoC 状态”,批评其缺少实际工作量下的性能数据,且对失败场景和分配逻辑缺乏周全考虑。Dave Hansen 提出另一种基于 _PAGE_ACCESSED 位回收的替代方案。讨论中 Zach O’Keefe 未表示同意发布新版。来源
  • Bluetooth L2CAP UAF 问题:syzbot 报告在 bt_accept_dequeue 中发生 slab-use-after-free 写操作,并指出先前补丁 commit ab1513597c6c 未能修复根因。来源

⚡ 一句话速览

  • swap 耗尽时避免 large folio split:David Hildenbrand 回复 RFC patch,讨论在 swap 空间不足时是否应避免拆分 large folio 而直接丢入 swap 槽,讨论持续。来源
  • deferred split shrinker 迁移到 list_lru:Wei Yang 对 Johannes Weiner 的 v5 系列进行 review,指出 __folio_freeze_and_split_unmapped() 中对于 device-private folio 仍会尝试锁 list_lru 并执行删除操作(尽管这类 folio 不在 deferred split 队列上),虽无危害但带来额外开销,建议增加 !folio_is_device_private() 检查。来源
  • migrate 时 requeue destination folio 到 deferred split 队列:Usama Arif 的 v2 补丁在 migrate 时记录源 folio 的 deferred split 状态并重入队目标 folio。Wei Yang 回复指出可能存在与 deferred_split_scan 的竞态条件,作者尚未回应。来源
  • mm/page_vma_mapped PMD device-private 检查:Lance Yang 的 v2 补丁获得 Wei Yang 审核,需要进一步确认 revalidate 逻辑。来源
  • PSI irqtime 跳过优化:Usama Arif 讨论 psi_account_irqtime 中的早期退出条件,当无新 irq 时间时跳过会计,减少开销。来源
  • Linux Memory Hotness and Promotion 会议笔记:6月18日会议笔记发布,涉及IBS Memory Profiler 最新基准测试进度、migrate_pages() 中非临时存储的讨论、以及分层感知 memcg 限制的性能测试(开销控制在1–2%)等话题。来源
  • percpu ASSEMBLY 替换:Thomas Huth 提交补丁,将 percpu-defs.h 中的 __ASSEMBLY__ 替换为 __ASSEMBLER__来源
  • bpf_iter_tcp_established UAF:Jose Fernandez (Anthropic) 提交补丁修复 bpf iter 中 TCP established 遍历时因使用 sock_hold() 而非 refcount_inc_not_zero() 导致的 use-after-free;该问题源于 reqsk_queue_hash_req() 在 ehash 链上发布请求 sock 后才设置引用计数,导致持有 bucket 锁期间引用计数可能为 0,从而引发饱和与释放后访问。来源
  • rt_spin_unlock() RCU 保护修复:Thomas Gleixner 提交补丁修复 rt_spin_unlock() 中 RCU 保护过早释放导致的 UAF 问题,修复方案将 rcu_read_unlock() 移到解锁操作之后,使 RT 锁行为匹配非 RT 语义。来源