0/2 已展开

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:

  1. drivers/block/null_blk/zoned.c 补齐 zoned 设备的零值/越界校验;
  2. 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_amlaml_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。