2026-06-13 内核社区日报
虚拟 Swap 空间架构首次亮相,为 zswap 开辟独立内存后端;KASAN MTE 引入 allocation-only 轻量模式,在检测能力与开销间提供新权衡。
🧠 重点 · 内存
1. 虚拟 Swap 空间(VSwap):将 zswap 等后端独立为可寻址的虚拟块设备
发生了什么: Nhat Pham 提交了 vswap v2 补丁系列,包含7个补丁:添加虚拟 swap 设备基础设施、支持 zswap 和 zeroswap 作为 vswap 后端、支持物理 swap 作为 vswap 后端、仅对物理 swap 条目计费、添加 debugfs 计数器、延迟物理集群的 memcg_table 分配、将 swap_info_struct 的 max/pages 拓宽为 unsigned long。来源
为什么重要: 该系列引入虚拟 swap 设备层,使 zswap 和 zeroswap 可以作为独立后端工作,不再直接绑定于物理 swap 设备,为更灵活的后端切换和管理提供框架。
2. KASAN HW_TAGS: 新增 boot option 仅在分配时打标签,减少运行时 MTE 开销
发生了什么: Dev Jain 提交 RFC,为 arm64 MTE 的 KASAN 引入一个 boot option,使得每个对象仅在分配时设置随机标签,释放时保留该标签,从而跳过 free-time poisoning。该选项会削弱对 use-after-free 的检测能力(具体包括“use-after-free-before-reallocation”和“double-free”),但旨在降低 KASAN 运行时开销。作者表示“we are not clear about the performance benefit”,并请求 Android 社区协助测试。
为什么重要: 该选项允许用户以牺牲部分 UAF 和 double-free 检测能力为代价,降低 KASAN MTE 运行时开销,为部署场景提供性能与安全检测之间的权衡选择。
3. kmemleak_scan() 避免 soft lockup 的 v2 补丁,讨论关注 need_resched() 在 PREEMPT_RCU 下的有效性
发生了什么: Breno Leitao 提交 v2 补丁,解决 kmemleak_scan() 在遍历所有线程 kernel stack 时因单个 rcu_read_lock() 内无调度点导致的 soft lockup(实际案例:CPU stuck 22s)。补丁从 kernel/hung_task.c 借用了 rcu_lock_break() 模式:当需要调度时固定两个迭代游标,释放 RCU 读锁、cond_resched()、再重新获取锁,然后检查游标是否仍存活,若失效则中止本轮扫描并跳过报告。SeongJae Park 提供了 Reviewed-by。Oleg Nesterov 随后指出,在启用了 CONFIG_PREEMPTION 和 CONFIG_PREEMPT_RCU 的内核中 need_resched() 几乎不会为 true(cond_resched() 为 nop),提议改用 check_hung_uninterruptible_tasks() 中的 time_after() 触发 break。Lance 确认此问题,并认为基于时间的检查更好。 来源 | 讨论
为什么重要: 该补丁修复了在大量线程(尤其在 KASAN/lockdep 调试构建下)的系统中 kmemleak_scan() 可能触发 soft lockup 的实际错误;同时讨论揭示了当前 need_resched() 方法在 PREEMPT_RCU 内核中的失效风险,推动了更健壮的替代方案(基于时间触发)。
4. Al Viro 发布 v3:将核心 kmem_cache 实例改为静态分配,消除运行时指针解引用开销
发生了什么: Al Viro 发布 v3 系列,将 dentry、file、inode、mount、buffer_head 等核心 slab 缓存从运行时 kmem_cache_create() 改为编译时静态分配。新增 include/linux/slab-static.h,提供 kmem_cache_setup() 等 helper 用于声明和初始化静态 struct kmem_cache 实例(通过引入 struct kmem_cache_opaque 保持类型不透明)。该系列已覆盖 VFS 四大缓存、inode、mnt、bh、seq_file、thread 组件(fs_cachep、files_cachep、signal_cachep 等),并以 UFS 模块作为测试样例。v3 修复了上一版中 /sys/kernel/slab 目录下对静态缓存的命名问题(静态缓存直接以自身成员名作为子目录名)。
为什么重要: 这些核心缓存在每次分配时需要解引用一个只读指针,其开销在频繁路径(如 dentry、inode 分配)中可见于 profile。静态分配使分配路径退化到 & 运算,消除了这一指针间接访问,且不受 runtime_const 机制需要特定架构支持的限制,所有架构均可受益。v3 系列还考虑了模块中静态缓存的生命周期(通过 pin 模块的 kobject 避免 sysfs 访问竞态),使得模块也能使用这一技术。系列整体为后续淘汰部分 runtime_const() 宏提供了更简单的替代方案。
5. DAMON 引入自动调优的 huge page collapsing 机制 v4
发生了什么: Gutierrez Asier 表示将再次审查 SeongJae Park 的所有意见,并计划在下一版去掉 RFC 标记;未来还计划提交 cold page split 补丁。SeongJae Park 对此表示期待。
为什么重要: 该补丁系列正从 RFC 阶段向正式补丁迈进,并规划了后续添加 cold page split 以提供完整 THP 支持的路线。
后续动态: 针对 Zhaoyang Huang 的 v2 补丁,Zi Yan 指出该版本仍有其他问题,例如 LRU 计数器不平衡,建议暂停并准备更完整的版本。
🔧 其它子系统
文件系统
- exfat:限制目录项名前进指针:Bryam Vargas 提交补丁,在
exfat_find_dir_entry()中对uniname_advance()循环添加边界检查,防止目录损坏导致越界访问(commit 参考:来源)。 - hfs:避免
hfs_mdb_commit()死锁:Sam Sun 提交 v3,为 HFS 添加mdb_lock专用于 MDB 提交序列化,同时缩小原mdb_bh的锁定范围使其仅覆盖主 MDB 缓冲区更新与脏标记,避免因锁定范围过大导致 bitmap 回写或 I/O 时与同一 buffer_head 的死锁。来源 - SCMI Telemetry FS v4:Cristian Marussi 发布 31 个补丁系列,引入
stlmfs伪文件系统暴露 ARM SCMI 遥测传感器数据。新增 AB 接口文档。(来源) - syzbot 报告
path_openatmemory leak:新泄漏报告在进程path_openat路径上,syzbot已 attach。(来源)
网络 / eBPF
- bpf:硬件时间戳代理 v2:Kuniyuki Iwashima 更新系列,为虚拟网络设备提供 API 来代理硬件时间戳。新增
bpf_skb_set_hwtstamp()kfunc 和ETHTOOL_MSG_TSINFO_SETnetlink 消息,允许 BPF 程序为传入包设置虚拟时间戳,以及返回 TX 时间戳。(来源) - bpf, sockmap:修复
skb_to_sgvec()中的 BUG_ON:在 SK_SKB strparser 路径上,verdict 或 parser BPF 程序调用bpf_skb_change_tail()缩小 skb 后,skb_to_sgvec()使用的 len(来自 strp_msg 的 full_len)可能超出 skb 实际数据,触发BUG_ON。修复在调用前钳位 len 为skb->len - off,并在 off 已超过 skb 长度时返回-EINVAL,消除内核崩溃。来源 - bpf:强化 gotox 的 subprog 边界检查 v2:在 CFG 构建阶段已根据当前 subprog 限制 gotox 间接跳转目标集的情况下,
check_indirect_jump()从运行时PTR_TO_INSN寄存器中的 INSN_ARRAY map 解析的 target 可能来自不同的 map,导致目标超出当前 subprog 边界。补丁新增检查,要求每个来自实际 PTR_TO_INSN map 的 target 必须位于当前 gotox 指令所在的 subprog 范围内,否则拒绝加载程序,从而防止因跨 subprog 间接跳转而导致的崩溃。(来源) - bpf:保留 scalar zero 的 var-offset stack 读取 v2:Woojin Ji 发送 v2 补丁系列。当 var-offset stack read 读取到 spilled scalar constant zero 时,保留已知的零事实,同时将贡献的 stack slots 标记为 precise,并添加对应 selftests。该模式可通过正常 C 代码(clang 22.1.6 -O2/-O3)生成,此前 verifier 会误拒绝此类程序,修改后能正确接受。来源
- tcp: 替换
min_tso_segs()为tso_segs()回调:允许拥塞控制算法提供每个数据突发的显式 TSO 段数,并覆盖默认的tcp_tso_autosize()。改动涉及 BBR 和 BPF 的实现,无功能性变更。来源 - veth BQL v7:Sashiko AI review 指出,teardown 时清除 DRV_XOFF 因依赖
netif_running(dev)但dev_close()中该检查恒为假,导致 peer 的 TX 队列停滞 16 秒(到 TX 看门狗超时)。BQL 完成(netdev_tx_completed_queue)本身已正确执行。来源 - Generic devmap egress skb sharing 修复已合入 bpf-next(来源)
调度 / 进程
- sched:支持长任务名 v3:André Almeida 提交 v3,该系列清理
get_task_comm()用法(改为新的copy_task_comm()宏),并用TASK_COMM_EXT_LEN扩展任务命令名长度,同时添加相应测试与 prctl 支持。(来源)
👀 值得追的讨论 / Patch
- liveupdate:添加文件保存内部API:Samiullah Khawaja 提交「liveupdate: Add internal APIs for file preservation」补丁系列,为 liveupdate 文件保存添加内部 API,支持 VFIO-Cdev 和 guest_memfd 两个已知用例,该补丁由 Pasha Tatashin 编写。来源
- khugepaged PMD collapse swap PTE 统计修复:Lance Yang 的补丁在
mthp_collapse()中为 PMD-order 候选额外地计入扫描阶段接受的 swap PTEs(unmapped),因为 swap PTEs 不在 present-PTE bitmap 中。David Hildenbrand Ack 了该补丁,并提到未来有清理机会,例如在 userfaultfd VMA 中collapse_max_ptes_none可能不精确。来源 - mm/slub:保留前一个对象生命周期的 RFC:Pengpeng Hou 提交 RFC,通过保留已释放对象的生命周期信息来改进 use-after-free 和 double-free 的检测。Vlastimil Babka 给出初步 review,认为该方向有用,并建议将新增 debug 选项直接扩展(不另设独立选项)以满足生产环境调试需求。来源
⚡ 一句话速览
- mm/kmemleak: avoid soft lockup 补丁的 review 反馈:Oleg Nesterov 审阅了 Breno Leitao 的 v2 补丁,认为补丁本身逻辑无误,但指出其中
need_resched()检查在CONFIG_PREEMPTION && CONFIG_PREEMPT_RCU下可能无效(此时cond_resched()为空操作),建议改用time_after()等时间触发方式。Lance 在回复中承认遗漏了该场景,并同意改用基于时间的 break 检查。来源 - slabinfo 属性名修复:Yichong Chen 修复
slabinfo工具读取的总对象属性名不一致问题(total_objectsvsobjects_total)来源 - mempool debug 从 CONFIG_SLUB_DEBUG_ON 解耦:lirongqing 移除了 mempool 调试逻辑中与 CONFIG_SLUB_DEBUG[_ON] 绑定的
#ifdef,改用运行时 static key (mempool_debug_enabled) 控制开关,从而允许通过独立启动参数切换。此举解决了生产内核中因CONFIG_SLUB_DEBUG_ON=n导致调试被编译剔除,以及用户已关闭 slub 调试但 mempool 仍强制开启的矛盾 来源 - mm/page_alloc:移除 GFP→ALLOC_ 标志的等效转换:Brendan Jackman 移除
__GFP_HIGH与__GFP_KSWAPD_RECLAIM到对应 ALLOC_ 标志的等效转换,理由是“没有明确理由相信它更快”,测试显示新旧代码性能差异不大 来源 - THP SWAP 在 PowerPC Book3S64 上启用 v3:Ritesh Harjani 的系列允许架构通过
ARCH_MAX_PMD_ORDER覆盖SWAP_NR_ORDERS,并在 PowerPC Book3S64 上启用 THP_SWAP。其中,SWAPFILE_CLUSTER改为运行时配置。来源 - zram 编译临时错误:
linux-next在构建 zram 驱动时报'bio' undeclared,来自未就绪的 commit 引入 来源 - mm/huge_memory:PMD-level swap entries 语义澄清讨论:Lance Yang 反馈 Usama Arif 的系列,指出 PMD swap entries 需要先定义明确规则:一个 PMD swap entry 是代表背后存在(或即将存在)一个 PMD 大小的 folio,还是仅仅作为 512 个 swap slot 的紧凑页表编码。该规则不明确会导致调用者易遗漏问题。来源
- bpf:修复 generic devmap egress skb sharing:补丁已合入 bpf-next,修复 XDP 同一 SKB 被多个 devmap egress 路径使用时间步问题 来源
- bpf:rqspinlock 修复
raw_res_spin_unlock_irq中调度问题:已合入 bpf-next 来源