本周内核两条线并行:一条在改地基——fd 的安装与回滚要从各驱动手里收归系统调用出口(50 帖 POC),VM_SPECIAL 这个把四类不相干属性搅在一起 20 年的掩码退场(40 帖,已进 mm-unstable),内核构建最多提速 36%;另一条在立规矩——AI 生成的补丁一天涌进 13 个列表共 125 帖,netdev 直接下两个月禁投令,Linus 对 hazard pointers 只回一句「先给我看钱」。

封面 · 9月20日 · 每周内核雷达

📊 板块热度

/ column
板块热度条形图 · 本周(周一~周日 · 7 天累计)

本周(09-14~09-20,7 天完整累计)各板块邮件量:net 3616 · DRM 2254 · mm 2164 · media 1092 · fs 926 · PCI 669 · Rust 355 · arch 354 · block 258 · rt 148 · LSM 138 · virtio 3。net 大幅领跑——但值得留意的是,这份量里有一部分来自本周那场 AI 补丁洪流,量高不等于 signal 多。virtio 仍是 12 板块里最冷的(3 条),实际讨论已整体迁到 virtualization 合并列表。

💡 本周头条

/ section

fd 想改生死簿:把「安装与回滚」从驱动手里收归系统调用出口

〔09-15〕linux-fsdevel · [PATCH RFC POC 00/50] file: handle files on syscall exit · 本周最热线程(52 封回复)

现状 一个系统调用要返回一个 fd(打开文件、建 dma-buf、建 eventfd…),得自己做三件事:先预留一个 fd 号、再决定成功时把 file 装上、失败时把号还回去。这套「预留—提交或回滚」的样板,被抄在每一处会返回 fd 的代码里。
痛点 抄得多就一定会抄错。装到一半失败要回滚,回滚路径最容易被漏;drm ioctl 里就有一大坨「失败时把 dma-buf fd 塞回去」的手工代码。而且回滚顺序错了会泄漏 fd 号,多次失败累积下来就是「fd 表满」这类难查的故障。
方案 Christian Brauner 提出把这件事上收到系统调用出口:fd_prepare() 先在 task 上预留一个槽,fd_stage() 把 file 挂上去;系统调用成功,出口路径统一安装所有暂存的 file,失败则统一丢弃。调用方不再需要任何 unwind 代码。50 帖里绝大多数就是在删这些样板——KVM、amdgpu、io_uring 等一处处拆。
为什么 关键取舍是「不碰热路径」:get_unused_fd_flags() 和 fd_install() 语义保持不变,open()/dup() 这些每天跑亿万次的路径继续走老路,只有需要复杂回滚的驱动改用新接口。另一个边界划得很清楚——预留属于「线程+发起它的那次系统调用」,fork 的子进程不继承,有未完成预留的线程不能 unshare fdtable。
效益 驱动侧少掉一整套易错的错误处理代码。更深远的是它把「fd 的生命周期」这个契约从「每个调用方各自实现」变成「VFS 统一保证」,回滚正确性从此只需在一处验证。
下一步 这是 RFC POC,作者自己写明「even if it's just for illustrative purposes」。它动的面很大——全 17 个架构的 entry 层都要配合。讨论窗口正开着,是介入的好时机。
一句话点评 本周最有分量的一次「收权」——VFS 把一件人人都在自己做的事收回去自己做。50 帖的体量说明作者是认真的,POC 的标签说明他也知道这事没那么快。

AI 补丁洪流撞上维护者:netdev 下禁投令,Linus 只回一句「先给我看钱」

〔09-16~09-19〕lkml / netdev / linux-mm · 一周内三起标志性事件

现状 AI 写内核补丁这件事,过去一年从「能不能写」变成了「一天能写多少」。生成成本趋近于零之后,投递成本还在原地——每一封都要维护者亲自读、亲自评审。
痛点 本周这笔账集中爆了:一次 AI 辅助的引用计数审计,在三个多小时里往 dri-devel 连发 69 封修复补丁;同期 hazard pointers 的 28 帖系列、以及一天内涌进 13 个列表的 125 帖,都在挤占同一批维护者的注意力。
方案 维护者开始用规则回应。netdev 直接下两个月禁投令——不接受该来源的补丁,直到对方改掉批量投递的做法。Linus 对 hazard pointers 的回复是一句「Show me the money」:不是反对这个机制,而是要求先拿出真实场景的收益数据再谈。
为什么 这里有个容易被误读的点:被挡下的不是「AI 写的代码」,而是「不承担评审成本的投递行为」。同一周里,AI 评审工具 Sashiko 在 vulab 的第 69 封里当场抓出一处 type confusion——那个「修复」会把虚表指针减一。工具既能放大噪音,也能抓出真 bug,分野在于是否有人对结果负责。
效益 禁投令和收益门槛都是「把成本还给投递方」的做法。对认真的贡献者反而是好消息——注意力是内核最稀缺的资源,把它从噪音里解放出来,真正有数据的系列才排得上队。
下一步 这套规则会怎么固化还不清楚——是变成各子系统的惯例,还是需要一份跨子系统的声明。可以确定的是,以后提机制级改动,「收益数据」会从加分项变成入场券。
一句话点评 本周真正的分水岭不在代码里。内核社区第一次用「禁投 + 要数据」这种硬规则回应生成式产能,而不是继续靠维护者硬扛。

📰 mm 内存管理

/ column
VM_SPECIAL 退场 把「是否内核自持 / 能否 expand-merge / 是否 mlock 特例 / 是否阻止 GUP」四类互不相干的属性揉在一个掩码里 20 年,驱动作者长期误用。40 帖改为描述行为的谓词(vma_is_kernel_owned / vma_can_merge / vma_can_gup…)并建立不变式:只有 kernel-owned 映射才允许改 VMA_IO_BIT。akpm 已确认收进 mm-unstable,本周讨论持续到 09-19。 原文
mTHP 拆页 v2 把「未充分使用的大页拆分回收」从 PMD 级 THP 扩到 mTHP。v1 的两个设计被 David Hildenbrand / Barry Song / Johannes Weiner 逐一否掉,v2 采纳折中:knob 保持绝对值。代价是同一个 knob 要服务两个层级,等于牺牲 PMD THP 的 collapse 积极性。 原文
swap tier RFC v11 v11 推翻重做——不再用「优先级区间」定义 tier,而是把每个不同的 swap priority 直接视为一个 tier。memcg 通过 debugfs 选 tier,mask 以 cgroup ID 为键,不改 struct mem_cgroup、不加 Kconfig。从 v1(2025-11)磨到 v11,是「先最小可用、撞坑再改」的样本。 原文
device DAX 并入通用 vmemmap HVO(HugeTLB vmemmap 优化)泛化的第三步:device DAX 从「专属尾部页预留 + 各架构私有逻辑」迁到基于 memory section 的通用模型,净删代码(20 文件 +244/-459)。已收 Mike Rapoport / David Hildenbrand / Qi Zheng 的 Acked-by。 原文

📰 net 网络

/ column
TCP GSO 重组(机制) BIG TCP 按 netdevice 协商,一条路径上两种口可共存。BIG TCP 包走到不支持的口时 GSO 状态丢失,协议栈退化成逐 MSS 单包——实测 veth→bridge→TAP→guest virtio-net 掉 69% 吞吐(51.55→15.85 Gbps),修复后回到 52.62。关键取舍:明确放弃 per-device 开关,不加 netlink ABI、不加 net_device 状态,因此无 UAPI、无驱动改动,自动生效。 原文
BPF 时间戳 2.0 RFC 本周唯一「新框架 + 新 UAPI」级 RFC,动 TCP 发送路径的 skb 元数据。设计上复用 skb_shared_hwtstamps 而不新增字段,代价是要专门用两块补丁兜与真实硬件时间戳的冲突。粒度做到每个被拆分的 skb 都记 start time。 原文
bridge 泛洪快路径 bridge 维护者亲自动手,把 VLAN 哈希查找从快路径上拆掉。新增 port-VLAN RCU 链表 + >8 成员时的 RCU 数组,泛洪时只考虑真正参与该 VLAN 的端口。病态拓扑(一个 VM 口 + 一个上游口参与、其余不参与)收益最大。 原文

📰 fs 文件系统

/ column
path_* API 加固 建立一条不变量:一个已填充的 struct path 恰好持有一份引用。原来 path_get() 可被消费者任意加减引用,历史上反复引出泄漏/悬空 bug。新增 path_create / path_move / path_clone 三个原语,转换几乎全量(大部分走 coccinelle 脚本)。典型的「先立规矩再改代码」——本身几乎是零行为变更。 原文
O_CREAT|O_DIRECTORY 被打回 ⚠️ 这条要纠正一个流行说法:多个来源称该系列「Applied to vfs-7.4.lookup」,但拉邮件原文可见 Brauner 09-17 确实先说了 Applied,09-18 又在同一线程补了一句「Dropped after I reviewed it once more」。镜像反查一致:未合入、不在 next。 凡涉及合入状态,必须以邮件原文或镜像反查为准。 原文
XFS fs-verity v16 fs-verity 从 ext4/f2fs 扩到 XFS 的长线系列。v16 关键变化是用独立 kmem cache 取代往 iomap ioend 里塞 work_struct,不再为 verity 污染通用结构。作者明确列出仍未获 review 的 3 个 patch——要参与就从这三个切入。 原文

📰 DRM 显示

/ column
drm_panel 内嵌 bridge(最大结构改动) 现状是 panel 创建时不带 bridge,panel_bridge 由下游临时包出来,造成生命周期/devm 归属错配、消费者分不清拿到的是什么、销毁还得猜谁该调 remove。改成 panel 内嵌 bridge 后,上游一律用统一 bridge API 交互。这是 bridge 热插拔的前置条件,终点是删掉整块旧代码。v3 共 19 帖:中段内嵌、后段 deprecate 旧 API、末段批量改造 tc358767/tc358768/analogix_dp 等驱动。 原文
ATOMIC_RESET 新 uAPI 给 atomic ioctl 加声明式「复位到初始状态」:带该 flag 时内核先用所有 KMS 对象的默认状态填 commit,再叠加请求里显式给出的属性。现状是合成器想要已知基线必须把每个对象每个属性都显式设回默认。Mutter 已有可用实现。真实阻塞点是它依赖所有驱动都实现 atomic_create_state。 原文
drm/sched FAIR 回归争论 一周内热度最高的讨论线:9070XT 满载下 FAIR 策略性能严重退化。Philipp Stanner 与 Tvrtko Ursulin 的交锋,Stanner 称「为性能站台的外部啦啦队」是 drm_sched 设计失误的根因之一。情绪之外,这条线指向的是调度策略与真实负载的匹配问题。

📰 media 视频采集

/ column
virtio-media v9(框架级新驱动) 把 V4L2 语义搬到 virtio 上——guest 侧注册 V4L2 + video device,host 侧是 virtio 虚拟设备,host 上现有的 uvcvideo 等被整体「代理」进 guest。作者明确说刻意不用 VB2、也不用其它 V4L2 常规框架。前置的 VIRTIO_ID_MEDIA(ID 48)已进 v7.3-rc1。Tsirkin 在 09-19 连回三封。 原文
v4l2-subdev metadata 铺路 v8 13 帖做三件事:把「谁在调这个 pad」结构体化并挂进 pad ops、把 op 存在性检查从各驱动上移到核心 wrapper、收敛 set_fmt/get_fmt 的语义歧义。这三步是「subdev 元数据流」的前置条件——只有 subdev 能区分调用方,多路流/元数据流的权限与路由才表达得出来。 原文
mem2mem 多 job 并行 此前框架隐含「一个 m2m_dev 同时只有一个 curr_ctx」,多核硬件只能靠驱动在 device_run 里直接调 v4l2_m2m_job_finish 去「骗」框架调度下一个 job——作者在 cover letter 里直说这是 dirty hack。这次把「多上下文并行」做成一等公民(新增 max_parallel_jobs)。取舍值得学:调度只做 context 级,单流不提速,N 路并行才吃满 N 核,以此规避跨核帧序错乱。 原文

📰 PCI / 总线

/ column
Flit Logging 首次接入 PCIe 6.0 起错误上报从 TLP 转向 Flit,需要走 _OSC 协商 + 新扩展能力,此前内核里是空白。v2 共 10 帖:前 4 条先修 AER sysfs 既有问题,5-6 铺垫重构,7-10 才落 Flit Logging 本体(含限流 sysfs 控件)。属新硬件代际的链路层诊断能力接入。 原文
endpoint 支持硬件自有 MSI-X 布局 新增 struct pci_epc_msix_layout,打破旧的「PBA 紧跟 Table」假设。与 RK3588 直接相关:RK3588 的 MSI-X Table 固定在 BAR4+0x4000、PBA 在 BAR4+0x5000,位于预留 BAR 而非 EPF 自有 config BAR。设计上刻意不让 endpoint core 自动选择该布局,选择权留给 EPF 驱动。实测反馈:EP 侧打印正确,但 host 侧 MSI-X1 返 -110(ETIMEDOUT),双方可复现,尚在定位。 原文
动态 OF 节点回归修复 CONFIG_PCI_DYNAMIC_OF_NODES=y 下,设备报告 Type-1 桥 header 但没有下游总线时 of_pci_make_dev_node() 挂死。争论点是修复姿势:最初提 quirk 改 class/header type,Bjorn Helgaas 明确反对,最终采用「无下游总线则省略 bus 属性」——理由是 Type-1 header 设备没有 pci_bus 是合法状态(Intel uncore 常见),不该用 quirk 改硬件声明。 原文

📰 virtio 虚拟化

/ column
remoteproc 支持任意 virtio 设备 现在 remoteproc 上只能跑 rpmsg 和 virtio-console,根因是 vring 预分配在共享内存,但 virtio 驱动用 kmalloc 分配的 buffer 远端处理器够不着。引入对驱动透明的 bounce buffering——在 vdev 的 map/unmap 回调里按 swiotlb 思路搬数据,并用地址区间判断做 bypass。测试跑在 i.MX93 的 Cortex-M33 + Zephyr 上。维护者已开始 review。 原文
virtio-blk 内联加密 v3 关键在新增了 control virtqueue——virtio-blk 一直是「单 vq 到多 vq」的简单模型,加 control vq 等于开了一条带外控制通道,后续所有配置类特性都会挂上去。该线程从 2026-01 迭代到 v3,跨 8 个月反复被打回,协议侧分歧不小。 原文
virtio-gpu userptr(一周 v6/v7/v8) virtio-gpu 从「渲染」转向「计算」的接口扩展:数据面从 blob 改成 userptr 零拷贝映射,新增 blob userptr resource 和 VIRTIO_GPU_CAPSET_ROCM 能力。09-17、09-18 两天连发三版,v8 立刻收到逐条 review,是当前 review 最活跃的线程。uAPI 一旦定型难改,值得早看。 原文
virtio 列表迁移的事实 virtio-dev@lists.oasis-open.org 本周几乎空转——最新一封停在 09-13,整周只有 1 个线程。实际流量已整体迁到 virtualization@lists.linux.dev(vhost/vdpa/virtio/vsock 合并列表)。做 virtio 的人盯错列表就会以为这周没事发生。

📰 Rust

/ column
PCI SR-IOV 抽象与它的反对意见 Rust 抽象第一次要跨 PF/VF 驱动边界并跨语言共享数据,直接顶到「安全抽象的边界画在哪」。Danilo Krummrich 的反对是方向之争:FFI 层代码量超过实际需要、更易错,且会激励写跨语言混合驱动,主张 FFI 面停在子系统层而非给单个驱动开后门。这条结论会决定 Rust for Linux 之后怎么与存量 C 驱动共存。 原文
netlink zerocopy 顺带炸出真缺陷 迁移到 zerocopy 时发现 GenlMsg::put 把 usize 长度 unchecked 转成 c_int,长度超过 i32::MAX 时翻负,绕过 nla_put() 里有符号的 skb_tailroom() 检查,随后被当成极大无符号长度,触发 skb_over_panic()。评审要求把「转换」和「长度校验」拆成两个补丁。 ✅ v3 已进 linux-next(tags/next-20260918)。 原文
unsoundness 批量审计 queue_rq 回调与 module_param SetOnce 两处相隔三天、指向同类问题——安全 API 被证明可导致 UB,等于 Rust 对调用者的承诺失效。unsoundness 在 Rust 抽象里的级别高于普通 bug,维护者必须处理。对读补丁的人是很好的模式样本。
leds 抽象打到 v25 价值不在补丁本身而在这个数字——它是「一个 Rust 子系统抽象要被接受得跨过多少轮评审」最直观的标尺。对目标是成为内核 patch 贡献者的人,比读任何单个补丁都更能看清审阅者到底卡什么。

📰 LSM 安全

/ column
LSM boundaries 大讨论(本周最重) 焦点是 BPF-LSM 这一个模块能不能拥有自己的 policy object 及其 kfunc 生命周期——直接决定 bpf_lsm_policy_* 这组 kfunc 是否成立、析构归内核还是归 BPF 侧。参与者含 Christian Brauner 与 Günther Noack。本质是「LSM 该不该为 BPF 程序开放内核态对象」的架构级争论。
landlock tracepoint 修复 tracepoint 是内核少有的「明示 ABI」区域。这里同时修了宽度类型名(影响 BTF/BPF 侧匹配)、blocker 上报错误、ptrace tracer 报错对象错误、信号号上报的不是实际生效值——四条都是「观测到的原因 ≠ 真实原因」这类最难查的错。消费者(bpftrace/自研解析器)会受影响。 原文
AppArmor 一周 5 连发 5 条来自 4 个互不相干的作者,集中在引用计数泄漏与边界检查两类——通常意味着前一轮 refcount/CFI 类误用被扫描器批量发现。其中 accept index + 1 那条机制值得记:owner-conditional 的 accept 项在 perms 表里占两个 slot,校验器只查了 index 本身,把 ACCEPT_FLAG_OWNER 放最后一项即可越界。 原文
verity keyring 固定 ID 现状是进程只能按名字 search verity keyring,而名字是可被污染的字符串。给 fs-verity/dm-verity 一个 KEY_SPEC_* 级别的固定 ID,等于让校验路径可以不依赖名字解析直接定位 keyring——「减少信任输入」的接口设计。 原文

📰 block 块设备

/ column
virtio-blk 钳制 max_segments 未协商 VIRTIO_RING_F_INDIRECT_DESC 时,SG 段直接占用环槽。host 报 seg_max=1024 + 1024 槽环时,1023-1024 段数据加 2 个 header 描述符 = 1025-1026 > vring.num,virtqueue_add_split() 返 -ENOSPC → blk-mq 队列被永久卡死(I/O 挂 D 态)。修法是把不变式写进 virtblk_read_limits(),无条件按 ring_size - 2 钳制。 原文
block: run_todo() 新回调 7.1 合并窗口的改动打破了「__loop_clr_fd() 调用时已无未完成 I/O」的旧假设,导致空指针解引用;但要 flush 就得 drain_workqueue(),而它不能在持有 disk->open_mutex 时调用。run_todo() 提供在 open_mutex 释放之后执行的同步清理钩子,代价是序列化责任转移给驱动实现者。典型的「加 API 换掉锁语义」。 原文
ublk CVE-2026-90323 sqe->addr 非法时 ublk_fill_io_cmd() 已置 UBLK_IO_FLAG_ACTIVE,uring_cmd 完成但 tag 仍处 active → teardown 挂死。修法是把「校验」与「应用 buffer」拆开,确保 io->buf 不在状态检查前被写。属「完成/状态机不变量被破坏」的典型类别。

📰 arch 架构 / 构建

/ column
内核构建提速 36%(机制级) 把所有架构共用的构建瓶颈并行化:kallsyms 用 C 重写 mksysmap、modpost 描述符改汇编输出、objtool 并行解码、depcheck 取代时间戳依赖检查、rustc 与其余构建并行。收益:allmodconfig 全量 -19%~-36%,增量 -61%~-66%,no-op 构建 -89%~-95%(EPYC 30.6s → 1.5s)。跨 x86/arm64/arm/riscv/s390/loongarch 全部测过。 原文
hv 捐赠页从 direct map 摘除 真实故障链:hv_call_deposit_pages() 把页捐给 hypervisor 后页仍留在 direct map,load_unaligned_zeropad() 这类故意越界读的 helper 一踩进去,hypervisor 抛 #GP,异常表 fixup 救不了。修法是先把页从 direct map 摘掉再交出去。它暴露的是架构间 set_direct_map() 语义分歧——同期 Mike Rapoport 发了专门文档说明各架构哪里不一致。 原文
arm64 vDSO robust futex v9 进程持有 robust mutex 时被杀死,内核需原子地「解锁并清 op_pending」,落在 vDSO 里做才没有 syscall 开销。x86 已有,arm64 补上,属跨架构 ABI 对齐。v9 主动砍掉 compat vdso32 入口(要先在 arch/arm/ 落地),说明这个 ABI 会分两步铺开。 原文
折叠页表的冗余读 RFC 用 ptep_get()/pmdp_get() 等在编译期折叠页表的配置上会退化成多余的 READ_ONCE()。arm64 CONFIG_PGTABLE_LEVEL=3 的反汇编证据显示同一值读两遍。改法是让 pXdp_get() 对折叠层级返回 dummy entry + 编译期校验——用类型约束替代运行期检查。作者预告下周去掉 RFC 标签。 原文

📰 rt 实时调度

/ column
RT 可睡眠锁误报修复 non_block_start()/end() 的本意是抓「回调里依赖锁或可睡眠条件」,当年明确把 spinlock 排除。但 RT 上 spinlock_t/rwlock_t 变成可睡眠锁、带 might_sleep(),于是 mm 的 non_block 区间与 pwm 的 hrtimer 路径直接 splat。修法不是放松检查,而是给检查加判据「这次重调度请求是否来自可睡眠锁」。 原文
can_spin_trylock 收紧引反对 把 v6.19 的 kmalloc_nolock() 检查从「仅 NMI/硬中断」收紧为 !preemptible()。Alexei Starovoitov 当场反对:7.0 起 bpf arena 在 raw_res_spin_lock_irqsave 下调用 alloc_pages_nolock(),改后会让人所有 BPF 程序(含 sleepable)的 bpf_arena_alloc_pages() 返回 NULL、用户态缺页直接 SIGSEGV。倾向是「检查应针对 pi_lock/rq lock 这几把,而不是所有 irq/preempt disabled 区间」。 原文
softirq 上下文表示 IRQ 退出、softirq 开始前有一段窗口:HARDIRQ_OFFSET 已减、softirq 尚未开始,任何读上下文的人看到的都是「被中断的任务」。RT 上 can_spin_trylock() 与 local_trylock() 会在这个窗口不再拒绝硬中断上下文;oops_end() 会把中断里的 oops 误判为任务上下文而杀掉被打断的任务。该路径本身是 !PREEMPT_RT only。

📰 LWN / 本周综述

/ column

本周 LWN 值得对读的几篇:Accelerating the kernel's build process(与上面 kbuild 提速 36% 那条同源)、Thread-identity switcheroo for io_uring(io_uring 的提交者身份迁移)、Recent work in memory tiering(与上面 page_counter stock 下移那条相辅相成——先搬地基、后加 tiered limits)、The "rnull" Rust block driver、Adding BPF to blk-iocost、Using steal time to moderate CPU demands、Fixing the TCMalloc regression with RSEQ operations,以及 7.3 合并窗口的上下篇与 7.2 开发统计。⚠️ LWN 部分文章有订阅墙,标题可抓、正文可能需订阅——本期只对标题与公开摘要做归纳,未逐篇核对正文。

🧭 合入状态

/ column
✅ 已进 linux-next(本周确认) mm: eliminate VM_SPECIAL, VMA_SPECIAL_FLAGS(mm 树 mm-unstable,next 内可见 e24a88477cfb)· Rust netlink zerocopy v3(tags/next-20260918~101^2~6)· drm_bridge every-panel v2 的两个子补丁(dd8950786bd2 drm/omap、acb05c825e39 drm/tve200,主体内嵌 bridge 尚未排队)· drm ATOMIC_RESET v3 前置补丁(38d8b5a35367,tags/next-20260914)
⬜ 未合入(邮件列表阶段) 本周 20 条重点补丁经本地三镜像反查(索引快照 2026-09-20 05:38,mainline 201183 / next 206916 / stable 331356 条),其余全部为「mainline 未合入 · 不在 linux-next 队列 · 未回移植」——符合预期,这些补丁多在一周内刚发出,合入有数周滞后。
⚠️ 工具盲区(如实标注) mirror-lookup.sh 的 mid 正则只认 时间戳.序号-…@domain 形态。b4 生成的新式 mid(如 20260917-build-speedup-v3-0-9ecf4163ff36@kernel.org)既建不进索引、query 也被判非法——意味着 Brauner 全家(vfs 树)和 netfs 系列等大量现代补丁系列查不了状态。本期这些条目改用 git log --grep 直扫镜像手工确认。这是工具盲区,不是「未合入」的证据。

📰 架构动向

/ column
收权:把散落的契约收归一处 本周最清晰的一条线。fd 的安装/回滚从各驱动收归系统调用出口;struct path 的引用计数从不变量缺位收归 path_create/path_move/path_clone 三原语;VMA 的 flag 语义从「任选 flag」收归描述行为的谓词 + 不变式校验。三件事形态一致:把一件人人各自实现、各自出错的事,变成一层统一保证。
去特例:专有路径并入通用设施 同样反复出现。device DAX 的 vmemmap 优化并入通用 memory section 模型(净删代码);HugeTLB 的专属优化并入 sparse-vmemmap;nfsd 的 OPEN 想收敛回 vfs_lookup_open() 主干,消除自建并行实现;bridge 把 panel 这个特例内嵌进来,让上游不必关心对方是 panel 还是 bus-to-bus bridge。
约束前移:用编译期和类型替代运行期检查 折叠页表让 pXdp_get() 返回 dummy entry 并编译期校验;VMA 建立「只有 kernel-owned 才允许改 IO_BIT」的不变式并在每次 mmap 后校验;Rust 侧持续讨论能否用类型态保证 DMA 参数在任何操作前设定(结论倾向:问题是并发不是顺序,type-state 做不到)。
AI 参与留下可见痕迹 本周多条补丁带 Assisted-by: LLM 标签(如 RT 列表的 gpio mvebu raw spinlock 修复),同时 kbuild 提速系列因「LLM somehow corrupted the numbers」被 Linus 当场揪出一个被弄错的基准数字。工具在提效和引入错误两端都在留下痕迹——这也是本周 AI 洪流讨论的现实底色。

📰 与你方向的交叉点

/ column
RK3588 MSI-X 布局(PCI endpoint) 直接对上。RK3588 的 MSI-X Table 固定在 BAR4+0x4000、PBA 在 BAR4+0x5000,位于预留 BAR 而非 EPF 自有 config BAR。新系列用 struct pci_epc_msix_layout 把这种硬件自有布局做成合法配置,选择权留给 EPF 驱动(dw-rockchip 走 msix_doorbell)。目前 host 侧 MSI-X1 返回 -110 的问题双方可复现,是介入讨论的窗口。
camera / GMSL2 侧 两条直接影响你:dt-bindings 的 orientation 宏(FRONT/BACK/EXTERNAL 从各家裸数字收敛成正式宏,核心头已 accepted,5 个 SoC 家族的 DTS 在分批迁移)——你自己板子 dts 里的 orientation 迟早要换成新宏;v4l2-subdev 的 metadata 铺路系列把「谁在调这个 pad」结构体化,这是多路流/元数据流权限路由的前置条件。
桥接与显示链路 两条值得跟:drm_panel 内嵌 bridge——终点是删掉 bridge/panel.c 与 drm_of_find_panel_or_bridge() 整块旧代码,凡自己写 bridge/panel 胶水的驱动最终都要迁;tc358762 v4 修复——作者在 Beagleboard 上跑 RPi display 时发现的一批问题,含「丢掉 drm_bridge_funcs.mode_set」「始终启用 VTG」,是「一条链上 bridge 与 panel 要一起修」的完整案例。注意该系列基于 v7.2,不适用于 v7.3-rcX 及更新。
virtio(块设备与传输层) virtio-blk 加 control virtqueue(内联加密打头,后续所有配置类特性都会挂上去)与 virtblk max_segments 钳制(队列被永久卡死的修复)都直接落在你熟的 virtio-blk 传输层。

📖 本期概念速查

/ section
fd 延迟安装 把 fd 的安装与回滚从各驱动搬到系统调用出口路径统一处理,调用方不再需要 unwind 代码。fd_prepare() 预留槽位,fd_stage() 挂 file,出口路径按系统调用成败统一提交或丢弃。
VM_SPECIAL 一个把四类互不相干属性(内核自持 / 能否 expand-merge / mlock 特例 / 阻止 GUP)揉在一起的 VMA 掩码。驱动作者无法从 flag 反推语义,长期误用。本周被拆成一组描述行为的谓词。
mTHP multi-size THP,除 2MB PMD 之外的多档匿名大页(如 64KB)。它让「大页」不再只有一档,也让按 order 缩放阈值的旧做法失效。
Flit Mode PCIe 6.0 起用 PAM4 编码的 FLIT 模式替代 8b/10b,错误上报随之从 TLP 转向 Flit,需要新的扩展能力与 _OSC 协商。
hazard pointers 一种无锁内存回收机制:读者把自己正在访问的对象指针发布到「危险指针」槽,回收者据此判断对象是否还有人引用。本周 Linus 要求先拿出真实场景的收益数据。
control virtqueue virtio-blk 在数据 virtqueue 之外新增的控制通道。该设备此前一直是纯数据面模型,加控制队列后,配置类特性(加密、后续更多)有了挂载点。
bounce buffering 当设备/远端处理器够不着驱动分配的 buffer 时,把数据搬到一个双方都能访问的中间缓冲区。本文场景是远端处理器够不着 kmalloc 内存。
unsoundness Rust 语境下指安全 API 实际可导致未定义行为——等于 Rust 对调用者的安全承诺失效。级别高于普通 bug,维护者必须处理而非可选修复。

如果对你有用,点个赞,或转给需要的朋友。

数据来源:mm / net / fs / DRM / drm / media / PCI / virtio / Rust / pci / LSM / block / arch / rt / LWN(lore.kernel.org)· 北京时间