sched discussion
[PATCH 6.1 0001/1067] nvmet-tcp: fix race between ICReq handling and queue teardown
LLM 分析
6.1 Stable Release:6.1.178-rc1 候选版 review
系列概况
- 标题: [PATCH 6.1 0000/1067] 6.1.178-rc1 review
- 作者: Greg Kroah-Hartman
- 版本: Linux 6.1.178-rc1
- 规模: 1067 个 backport 补丁(本次输入展示前 1000 条;后段 1001-1067 已省略)
- 修改文件: 跨 drivers、fs、net、arch、sound、crypto、kernel、mm、security、tools 等几乎所有子系统
- 代码统计: 数千行变更(单个 patch 多数为 5-50 行级小修)
- Message-ID: 20260721152424.521567757@linuxfoundation.org
- 完整性: 完整公告 + 1000 条 patch 邮件;review 截止时间 2026-07-23 15:23 UTC
补丁目的
为 6.1 stable 分支准备下一个 release 候选。Greg 把所有要 backport 进 6.1.178 的修复整理成一个 1067 patch 的 series,发布到 LKML,请社区 review。任何异议需在截止时间前反馈,否则视为同意合入。整条 series 也可以作为单 patch 从 stable-rc 仓库获取,或从 linux-6.1.y 分支 cherry-pick 完整变更集。
关键实现
由于本系列是跨子系统的大批量 stable backport,没有统一的"关键实现"。下面挑出几条代表性 patch 进行说明:
nvmet-tcp ICReq race fix(0001)
NVMe/TCP target 驱动在 ICResp 发送后无锁更新 queue->state。修复方法是在 state 转换前后用 state_lock 串行化,发现 NVMET_TCP_Q_DISCONNECTING 就用内部哨兵 -ESHUTDOWN 提前返回(不要当成 transport error 传播)。同时 nvmet_tcp_socket_error() 在错误路径把 rcv_state 置 RECV_ERR,让 receive 端 quiesced。
eventpoll UAF fix(0038 + 一组拆分)
Linus Torvalds 指出 epoll 在 mutex_unlock 之前做 ep_refcount_dec_and_test 是错的:次要引用者释放后 ep 可能被另一个路径真正释放,导致正在 unlock 的 mutex 被踩踏。修复是把 ep refcount 的 atomic 操作移到 mutex_unlock 之外——refcount 本就是对象生命周期的语义,不需要 mutex 保护。后续 0041-0046 拆成多个清理 patch(split __ep_remove、去掉前缀改名)。
bpf/arm64 B.cond out-of-range(0002)
aarch64_insn_gen_cond_branch_imm() 漏掉对 label_imm_common() 返回的 SZ_1M 越界哨兵的检查。encode_immediate 用 19-bit mask 截断后 bit 18(符号位)被置位,CPU 把向后 ~1MiB 的跳转当成立刻执行。修复是越界返回 AARCH64_BREAK_FAULT,让 validate_code() 扫到 break 时让 JIT fail,而不是静默错误编码。
userfaultfd must_wait writability gate(0006)
无锁路径上 pte_write()/huge_pte_write() 解码非 present 的 swap/migration entry 时,把 offset 位当作 write 位,结果是 garbage。修复加 pte_present() 守卫,非 present 条目返回"不等待",让 fault 重试路径处理。垃圾 write 位导致线程睡眠等 UFFDIO_WAKE 的最坏情况被消除。
f2fs atomic write retry zeroing(0015)
COW inode 中的 NEW_ADDR 占位被 retry 当成现有数据,f2fs_write_begin() 把整个 folio 清零,导致部分 atomic write retry 时保留范围外的字节变 0。修复用 NEW_ADDR 作为占位标记,复用时仍读原 inode 的旧数据。
KVM ioeventfd BUG_ON → get_unaligned(0021)
emulator 把跨页 store 拆成多页写时,对齐 dst.valptr[N] 触发 BUG_ON。修复用 get_unaligned() 替换直接解引用;C99 把未对齐访问定义为 UB,CONFIG_UBSAN_ALIGNMENT=y 会告警。
f2fs deadlock in f2fs_balance_fs(0018/0019)
OPU/IPU DATA folio 在 f2fs_balance_fs 触发 GC 时,truncator 等写入完成、kworker 等 GC folio 锁的循环死锁。修复在 GC 之前强制提交所有缓存的 OPU/IPU DATA bio(f2fs_submit_merged_write + 新增的 f2fs_submit_all_merged_ipu_writes)。0019 把同样的提交搬到 GC_MERGE 路径。
类比
6.1.178-rc1 review 像一次杂志的"双月刊校样审稿"。Greg 是总编辑,把作者们交来的 1067 篇稿件按主题打包成一期,订阅邮件列表的人都是审稿人。每条 patch 是文章,标题里的 [PATCH 6.1 NNNN/1067] 就是它在期内的页码。如果你在正式付印前发现哪一段有错,发邮件说"这一段别印",否则默认同意排版。
Highlight:风险与注意点
- stable backport 的本质风险:所有 patch 都是从更新分支 cherry-pick,每个 patch 都附
Fixestag 指回原始 commit。stable 团队会针对 6.1 内核结构做最小化调整(删除多版本兼容代码、open-code 内联 helper 等),但仍有 merge 冲突风险,需关注是否有 6.10+ ABI/数据结构变化导致 cherry-pick 时引入新问题。 - 本批 patch 类型分布:以 bugfix 为主(约 80%+),少量 feature(如 VIA Labs USB 2.0 hub NO_LPM quirk、Telit FE990D50 串口 composition、USB 外设支持)和 cleanup(refactor/命名调整)。涉及 NVMe over Fabrics、eventpoll、bpf/arm64 JIT、KVM、I2C core、SMB3/ksmbd、wifi、NTFS3、OCFS2、cifs、afs、batman-adv、perf/selftests 等关键子系统。
- 典型回退观察点:建议优先关注
nvmet-tcpICReq/teardown race、eventpollUAF 重构(0038-0046)、f2fsGC deadlock、bpf多个 bounds check 与 nospec slot 修复、KVMCR8/VMX 注入相关 patch、i2c core注册竞态(0024-0028, 0232)、cryptoRNG 接口移除、xprtrdma系列(0515-0535)。 - 稳定性优先 vs 性能:所有进入 stable 的 patch 都过 Greg 的"只修 bug、不破坏用户、影响面明确"准则,本次没有性能 patch 也没有 RFC。
- 验证策略:从 commit message 的
Fixestag 反查上游原始 patch,对比 6.1.y 当前代码上下文;优先回归硬件相关子目录(NVMe-oF、I2C、SMB3、wifi、ieee802154、macsec 等)。
Patch 概览
(本节省略:系列太长无单条主线,按 subsystem 分组更合适。代表性 patch 见"关键实现"。)
版本变化
(本节省略:6.1.178-rc1 是 6.1 stable 系列的常规迭代 release 候选,不存在 v1→v2 的演化;它只是 commit 累积到一定量后的一次集中 review 节点。)
一句话总结
6.1.178-rc1 是 Greg Kroah-Hartman 把 1067 个 upstream fix cherry-pick 进 6.1 stable 后的一次集中 review 公告,请社区在 2 天内反馈异议,否则视为同意合入下一个 stable release。
+---------+ +-----------+ +--------------+
| Author |--->| Greg K-H |--->| 6.1 stable-rc |
| upstream | | (editor) | | (tree) |
+---------+ +-----------+ +--------------+
|
v
+-------------+
| 1067 patches |
+-------------+
|
+------+-------+-------+------+
v v v v v
NVMe fs/f2fs net/i2c KVM usb ...