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 驱动引入
RegistrationGuard和RegistrationData,确保 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 语义。来源