2026-06-16 内核社区日报
今日关注:
kfree_rcu_nolock()系列收到 Alexei Starovoitov 详尽 review,slab 在 NMI/hardirq 上下文的递归保护面临调整;eBPF 方面 sockmap 锁反转修复落地、conntrack opts 边界检查加强;文件系统侧 vmsplice 包装器在 s390 引发回归、btrfs 多路径错误修复系列提交。
🧠 重点 · 内存
1. kfree_rcu_nolock() 系列 v3 获 Alexei Starovoitov 基本认可,同时指出 deferred_work_barrier() 中的潜在 rcuwait 竞争
发生了什么:
Harry Yoo(Oracle)的 kfree_rcu_nolock() 系列 v3 收到 Alexei Starovoitov 的回复。Alexei 表示该系列整体看起来不错(“Overall looks good to me”),但提醒自动化分析工具 sashiko 在几个案例中产生了误报,不过其中一个关于 deferred_work_barrier() 的评论可能是真正的 bug:在 PREEMPT_RT 下,irq_work_sync() 使用 rcuwait_wait_event(),而 rcuwait 只允许单个 waiter,若 deferred_work_barrier() 被多个线程同时调用(例如在 kmem_cache_destroy() 和 kvfree_rcu_barrier_on_cache() 中),会导致只有第一个任务被唤醒,其余任务永久阻塞。Harry 确认这是一个预存问题,需要修复。
为什么重要:
该预存 bug 涉及 deferred_work_barrier() 在无全局锁保护下的并发调用,其在 PREEMPT_RT 配置下可能引发任务永久挂起,修复将避免关键的稳定性风险,有助于 kfree_rcu_nolock() 系列在实时及高并发场景下的落地。
🔧 其它子系统
eBPF
-
bpf, sockmap: fix lock inversion between stab->lock and sk_callback_lock
sock_map_update_common()和__sock_map_delete()在持有stab->lock时调用sock_map_del_link(),后者会获取sk_callback_lock(write);而另有代码路径反向锁获取顺序,导致锁反转可在高并发场景下引发死锁。Sechang Lim 提交了修复,将stab->lock的获取移动到sk_callback_lock已经释放之后。来源 -
bpf: Fix partial copy of non-linear test_run output
BPF_PROG_TEST_RUN返回非线性(分片)输出时,bpf_test_finish()对线性数据长度计算有误:当用户提供data_out小于总长度时,会错误地返回-ENOSPC而丢弃已拷贝的片头,且不更新data_size_out。Sun Jian v2 修复了长度计算,确保短缓冲区情况下仍能拷贝前缀并报告真实大小。来源 -
bpf: Add missing access_ok call to copy_user_syms
Jiri Olsa 补上了copy_user_syms()中缺失的access_ok()调用。此前直接从用户态指针__get_user未事先检查地址范围,sashiko AI 检测到潜在的安全隐患。该修复还清理了错误路径的错误码处理。来源 -
bpf: Guard conntrack opts error writes
conntrack lookup/attach 的 kfunc 允许 BPF 程序传入opts/opts__sz,但 verifier 检查了 opts__sz 范围后,wrapper 函数仍会向opts->error写入数据。若 opts__sz 小于offsetof(opts, error) + sizeof(error),写入会越界。Chen YY 提交了修复,在写入前检查 opts__sz 是否足够覆盖 error 字段,防止 kernel stack 破坏。来源 -
Abhishek Dubey v8 系列,共 7 个补丁:修复 long branch trampoline 地址的 8 字节对齐、将
dummy_tramp_addr移至 long branch stub 末尾以避免反汇编失败、修正 powerpc JIT 反汇编以适应连续反汇编、启用 powerpc64 verifier 反汇编 selftest(添加__powerpc64架构标识)、修正 tailcall 阈值比较指令、添加 tailcall verifier selftest for powerpc64,以及修复 large BPF 程序的 JIT buffer overflow。来源
文件系统 / VFS
-
vmsplice 改为 preadv2/pwritev2 包装器在 s390 上触发回归
Alexander Gordeev 报告 commit e2c0b2368081(“vmsplice: make vmsplice a trivial wrapper for preadv2/pwritev2”)在 linux-next 的 s390 上导致 selftesttools/testing/selftests/mm/cow.c挂起。Askar Safin 回复称若此补丁落地,该测试需改用其他机制。来源 -
btrfs: error-path 修复系列 for device add/replace
7 个补丁修复了设备添加和替换操作出错时的一系列未正确清理的问题:- 新设备通过
list_add_rcu()发布后错误路径未等 RCU 宽限期即 free; - 提交 sprout transaction 后继续操作失败时无法回滚已提交的改動;
- replace 进入 STARTED 状态后失败未 drain 正在进行的复制写;
- cancel/suspend 路径中 target device 残留指针;
mark_block_group_to_copy()失败时未销毁已打开的 target 设备;
- 新设备通过
-
该系列修补 btrfs 设备添加与替换错误路径上的 7 个长期 bug:free 设备前等待 RCU grace period、不解除已提交投种设备、start/finish/cancel 失败时 drain replace writes、挂起 dev-replace 时保持 exclusive op 以防 balance 等操作并发等。这些 bug 由代码审计发现,仅出现在罕见分配/错误路径或窄竞争窗口。来源
-
fuse: 修复 passthrough 并行 direct write
Russ Fellows v2。此前fuse_file_io_open()会无条件剥离FOPEN_PARALLEL_DIRECT_WRITES(只要FOPEN_DIRECT_IO未设置),即使 passthrough 路径的fuse_passthrough_write_iter()实际上可以安全并行。修复是:passthrough 模式下保留该标志;并让fuse_passthrough_write_iter()在写回时使用 shared inode lock,从而真正允许并行 direct write。测试显示多线程写入吞吐显著提升。来源 -
netfs: 从 folio_queue 迁移到 bvecq(v4)
David Howells 的大规模重构:将 netfslib 内部的 I/O 缓冲管理从自定义的folio_queue和rolling_buffer替换为标准化的bvecq(segmented bio_vec queue)。这简化了与块层、RDMA(smbdirect)的接口,最终移除了ITER_FOLIOQ迭代器类型。同时提供了netfs_alloc/free_bvecq_buffer()和netfs_extract_iter()替代旧接口。v4 还包含子请求触发进度报告的最小间隔限制,以及将 prepare/issue 阶段整合等清理。来源 -
super: 提出全局设备到超级块表的 RFC v2
Christian Brauner 的 RFC 系列意在替代bdev->bd_holder的单超级块绑定,引入一个全局 device-to-superblock 表,允许多个超级块共享同一块设备(如 erofs、btrfs、多设备 ext4/f2fs)。系列为 xfs、btrfs、ext4、erofs、f2fs 提供了新的fs_bdev_file_open_by_{dev,path}()helper,将fs_holder_ops私有化,并通过设备表查找超级块以处理 freeze/thaw。最终连user_get_super()也改用该表,消除了对全局super_blocks链表的手工遍历。来源 -
hfs 标签
hfs-v7.2-tag1已合入 torvalds/linux.git
Viacheslav Dubeyko 提交的 hfs 仓库拉取请求中的标签hfs-v7.2-tag1已被合并至 torvalds/linux.git。来源
👀 值得追的讨论 / Patch
-
RCU Tasks callback 队列调整移至 irq_work
Matt Fleming 提交补丁,将call_rcu_tasks_generic中涉及cbs_gbl_lock的队列调整操作推迟到irq_work中执行。该路径可从 BPF task-storage 销毁时被调用,此时 sched_ext 持有 rq->lock,若 RCU Tasks kthread 同时持有cbs_gbl_lock则可能导致锁竞争或死锁。Paul E. McKenney 指出 RCU Tasks Trace 尚未基于 SRCU 实现。来源 -
ntfs: Windows native symbolic link 支持
Hyunchul Lee v2 补丁系列为 ntfs 添加 Windows native symbolic link 支持,引入native_symlink=raw|rel和symlink=wsl|native挂载选项来配置解析与创建行为,同时修复符号链接大小报告为 0 的问题并清理目标名转换。来源
⚡ 一句话速览
-
kfree_rcu_nolock 讨论: 邮件中指出
deferred_work_barrier()在 PREEMPT_RT 上存在并发锁调用引发 rcuwait 竞争的问题,可能导致任务永久挂起,被认为是一个需要解决的预存 bug。来源 -
bpf linked scalar precision backport:Zhenzhong Wu 提交 v3 将 verifier 的 linked scalar precision 修复(
98d7ca374ba4)backport 到 6.6.y stable,补丁包含bpf: Track equal scalars history on per-instruction level等变更。Paul Chaignon 指出该 backport 的第一个补丁破坏了 selftest “precise: test 1”(需要将 r9 纳入 precise 寄存器集合),并建议 Zhenzhong 发送 v4 将相关测试调整合并入补丁。来源 -
bpf: Allow type tag BTF records to succeed other modifier records:Emil v2 补丁允许 Clang 生成的
typedef struct rbtree __arena rbtree_t等 typedef 与 type tag 组合的 BTF 编码通过验证。将btf_check_type_tags()重命名为btf_check_modifier_chain_length(),并新增btf_type_tag_walk()统一扫描所有修饰符以收集 type tag,同时调整 selftests 以接受此类记录序列。来源 -
selftests/bpf: 移除 sockmap + kTLS 测试:Jakub Kicinski 提交补丁,删除
tools/testing/selftests/bpf/prog_tests/sockmap_ktls.c、test_sockmap_ktls.c及test_sockmap.c中与 sockmap 和 kTLS 组合相关的测试(共约 642 行),原因是该组合不再被支持——在 sockmap socket 上安装 TLS ULP(或反之)已被拒绝。来源 -
overlayfs 在 idmapped mount 测试中的支持:Christian Brauner v1 为
src/vfs添加了 O_TMPFILE 支持探测以及 overlayfs 上 whiteout-device 的跳过逻辑,避免测试在 overlay 下层出错。来源 -
fat: 停止读取超出目录结束标记的条目:Matteo Croce v3 修复了 FAT 遍历时未及时停止于 DIR_Name[0]==0x00 的问题,可减少读取无效目录项导致的错误回退。来源
-
vfs: O_ 标志定义从八进制/十六进制转换为 (1<<n):Jori 的 patch 因 build 失败需改为更可读的位操作形式,Geert Uytterhoeven 发来改进建议。来源
-
syzbot: dentry_kill slab-use-after-free:新报告指出
dentry_kill中可能出现 slab-after-free 读,影响 linux-next,目前尚无修复。来源 -
discoverable root partitions:Vincent Mailhol 提交 19 补片系列实现无需
root=参数,通过分区类型 UUID 自动发现根设备,覆盖 alpha, arc, x86 等架构。来源 -
HFS syzbot 测试补丁讨论:David Maximiliano Hermitte 提交测试补丁,在
hfs_read_inode()和hfs_brec_read()中增加早期校验,拒绝损坏元数据,以避免hfs_write_inode()中的 BUG()。该补丁保持hfs_write_inode()不变。目前 Slava 因个人行程请求推迟审查至 6 月 26 日左右。来源