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 上导致 selftest tools/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_queuerolling_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|relsymlink=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.ctest_sockmap_ktls.ctest_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 日左右。来源