sched discussion
Re: Linux 7.1.11
LLM 分析
Linux 7.1.11:稳定线 bugfix 集锦
系列概况
- 标题:Linux 7.1.11
- 作者:Greg Kroah-Hartman
- 版本:7.1.11(stable 分支 linux-7.1.y 的第 11 个子版本)
- 规模:跨多子系统,diffstat 显示至少 30+ 文件
- 修改文件:Makefile;drivers/block/null_blk/zoned.c;drivers/bluetooth/hci_aml.c;drivers/dma/fsl-edma-main.c;drivers/gpu/drm/amd/amdgpu/{amdgpu_dev_coredump.c, amdgpu_dev_coredump.h, amdgpu_vm.c, amdgpu_vm.h};drivers/gpu/drm/i915/display/;drivers/gpu/drm/xe/display/;drivers/hid/* 多驱动
- 代码统计:amdgpu_dev_coredump.c 约 130 行(+/-),其余多为几十行规模
- Message-ID:2026082722-shelve-footrest-a5fb@gregkh(公告);回复 2026082722-rebuttal-verse-06ff@gregkh
- 完整性:两封邮件 body 在抓取端均被截断,公告邮件只保留 diffstat 前半段;回复邮件保留了完整 diff 但尾部被裁切
补丁目的
本次是 7.1 稳定分支的常规维护发布,把 7.1.10 以来积累的回归和正确性问题集中收口。从回复里能直接读到的两处典型 fix:
drivers/block/null_blk/zoned.c补齐 zoned 设备的零值/越界校验;drivers/bluetooth/hci_aml.c修复固件 buffer 长度不够时的越界读取,并顺手把指针改成const。
剩下 diffstat 里点名的 amdgpu coredump/VM、i915/xe 的 fb_pin/initial_plane、HID 多驱动等改动都是 7.1.y 稳定线拉过来的 backport。
旧流程的问题
null_blk在 zone_size_sects 为 0 时,mb_to_sects会进入"0 除法"路径或产生异常移位;旧的is_power_of_2(zone_size)校验对 zone_size=0 也放行。hci_aml的aml_download_firmware直接把firmware->data强转成aml_fw_len *并解引用,没有先看 firmware 长度是否足以容纳头部;指针也丢了const语义。
新流程
null_blk在 helper 入口加WARN_ON_ONCE(!dev->zone_size_sects)兜底,主路径把 "非 2 的幂" 收紧为 "非零且是 2 的幂",并在null_init_zoned_dev末尾显式拒绝 zone_size_sects==0。hci_aml在解引用前比较firmware->size >= sizeof(*fw_len),过小就走bt_dev_err报错;fw_len同时声明为const struct aml_fw_len *。
关键实现
Makefile
-SUBLEVEL = 10
+SUBLEVEL = 11
子版本号从 10 升到 11,stable 分支用户用 uname -r 一眼就能看出。
drivers/block/null_blk/zoned.c
static inline sector_t mb_to_sects(unsigned long mb)
{
+ if (WARN_ON_ONCE(!dev->zone_size_sects))
+ return 0;
...
}
helper 入口直接挡掉零值;同时把校验收紧:
- if (!is_power_of_2(dev->zone_size)) {
- pr_err("zone_size must be power-of-two\n");
+ if (!dev->zone_size || !is_power_of_2(dev->zone_size)) {
+ pr_err("zone_size must be non-zero power-of-two\n");
并在末尾追加 zone_size_sects 为 0 的拒绝路径:
+ if (!dev->zone_size_sects) {
+ pr_err("zone_size too large or too small, leads to zero sectors\n");
+ return -EINVAL;
+ }
三道闸门:helper 兜底、配置校验、初始化末段拒绝,避免后续计算出现 0/0 或位移异常。
drivers/bluetooth/hci_aml.c
-static struct aml_fw_len *fw_len = NULL;
+static const struct aml_fw_len *fw_len = NULL;
-fw_len = (struct aml_fw_len *)firmware->data;
+if (firmware->size < sizeof(*fw_len)) {
+ bt_dev_err(hdev, "Firmware is too small ...");
+ ...
+}
+fw_len = (const struct aml_fw_len *)firmware->data;
先做长度检查再做 cast,从源头挡住越界读。
类比
这就像小区物业的"周巡检 + 修缮单":Greg 是物业经理,7.1.11 就是这次检修记录。
第一封 reply 里展示的两份工单分别是:
- 地下车库(null_blk)的拦车杆:以前 0 高度的"幽灵车"能直接放行,现在加了三道闸——杆前拦截(helper 入口)、杆机校验(is_power_of_2)、杆后拒入(init 末尾 EINVAL)。
- 蓝牙门禁(hci_aml)的刷卡器:以前直接读取刷卡数据,现在先确认卡片数据长度足够再读取,指针也改成只读视图,避免把卡内容偷偷改坏。
而公告邮件里的 diffstat,就是这次检修后整栋楼(多个子系统)的"问题—修法"清单汇总。
ASCII 流程图
+-----------------------+ +------------------------+
| 7.1.10 | ---> | 7.1.11 |
| linux-7.1.y @ 7.1.10 | | linux-7.1.y @ 7.1.11 |
+-----------------------+ +------------------------+
| ^
| release process |
v |
+-----------------------+ +------------------------+
| accumulated fixes | -----> | backport + checks |
| (amdgpu, i915/xe, | | Makefile SUBLEVEL++ |
| null_blk, hci_aml, | | |
| HID drivers) | | |
+-----------------------+ +------------------------+
+--------------------------+ +--------------------------+
| old flow | --> | new flow |
|--------------------------| |--------------------------|
| zone_size=0 accepted | | WARN_ON_ONCE + return 0 |
| fw_len bare memcpy deref | | size>=sizeof check |
| pointer loses const | | const struct fw_len * |
+--------------------------+ +--------------------------+
drivers/block/null_blk/zoned.c
+--------------------------+
| null_init_zoned_dev |
|--------------------------|
| 1) zone_size==0 ? |----> -EINVAL
| 2) !is_pow2(zone_size)? |----> -EINVAL
| 3) zone_size_sects==0 ? |----> -EINVAL
| 4) mb_to_sects() helper |
| -> WARN_ON_ONCE(0) |
+--------------------------+
drivers/bluetooth/hci_aml.c
+--------------------------------+
| aml_download_firmware() |
|--------------------------------|
| firmware request |
| | |
| v |
| size < sizeof(fw_len) ? ----[yes]---> bt_dev_err + return
| | | (failure path)
| [no] |
| v |
| cast to const aml_fw_len * |
| | |
| v |
| deref fw_len safely |
+--------------------------------+
Highlight:风险与注意点
- 分类与频道:thread 来源频道是
sched,但内容是 7.1 稳定线发布,覆盖 DRM/蓝牙/HID/DMA/块设备等多个子系统,跟 scheduler 没有直接关系;阅读时不要被频道标签误导。 - 正文截断:公告邮件 body 在 lore 抓取时被裁切,只能看到 diffstat 的前若干项;具体每个改动的语义需要去
git tag v7.1.11对照完整 log,否则容易把 backport 当成新特性。 - WARN_ON_ONCE 的副作用:
mb_to_sects在生产环境若真的命中,刷屏 + return 0 会让后续 IO 静默丢失,需要确认上游是否打算后续改成静默返回。 - hci_aml 错误路径不完整:原 diff 在 lore 抓取里被截断,
bt_dev_err之后是返回-ENOMEM还是-EINVAL、是否release_firmware,从摘录里看不出来,必须看完整 patch 才能评估失败语义。 - 跨子系统 backport 顺序:amdgpu/i915/xe 的改动量大(amdgpu_dev_coredump.c 单文件 130 行),很可能与主线有冲突,需要稳定线维护者在合并窗口里手工 rebase。
Patch 概览
本次 thread 没有编号 patch series,只是一个稳定发布。diffstat 里出现以下大块:amdgpu coredump 重构、amdgpu VM 调整、i915/xe 的 fb_pin 与 initial_plane 改写、HID 多驱动小修。
版本变化
7.1.10 → 7.1.11:单纯子版本号递增;无主线 RC 关联说明,正文截断看不到 base commit。
一句话总结
Greg KH 放出 7.1 稳定线 7.1.11,主要修补 null_blk zoned 与蓝牙 hci_aml 固件校验等回归,并把 SUBLEVEL 从 10 升到 11。