今天两场改动都动到 API 契约:Linus 把 __get_user/__put_user 从 x86 拿掉,起因是一起 vringh 内核内存泄漏; dma_fence 有人想用自旋锁换掉 RCU,AMD 认为这是 no-go。 硬件侧,Rockchip 的 eDP 与 tyr 驱动都有新版本。

封面 · 10月21日 · 拆掉 __get_user

📊 板块活跃度

/ column
板块活跃度条形图 · 近 24h · 全 12 列表

数据截至 10-21 06:23 北京,近 24h 各板块真实计数:net 753 · DRM 365 · mm 232 · PCI 175 · media 135 · fs 110 · Rust 109 · LSM 55 · block 40 · rt 31 · arch 2 · virtio 1。net 的高位主要来自 v7.4 合并窗口的 GIT PULL, 机制讨论则集中在 uaccess 原语退场 与 dma_fence 的同步模型。

🎬 今日导读

/ section
头条 Linus 的 uaccess-cleanups:删掉两个用户内存原语
显示 dma_fence 锁方案被挡回;tyr 进 VM/BO ioctl;RK3568 eDP 到 v3
采集 Apple AVD 驱动 v3、Qualcomm CCI 恢复、VD55G0 bring-up
其他 memory.reclaim 源选择、P2PDMA 上 Intel Xeon、ceph 子卷隔离

💡 今日头条

/ section

Linus 拆掉 __get_user:把正确性从调用者记忆里拿走

〔10-20 15:25 北京〕· Removing __get_user / __put_user for good (Linus Torvalds,uaccess-cleanups 分支)

现状 内核给驱动两套访问用户内存的原语:get_user()/put_user() 做完整的地址检查与缺页处理;__get_user()/__put_user() 只负责拷贝,地址合法性、页错误禁用都由调用者自己保证。后者长期被当作快路径, 出现在 vhost、vDPA、i915 等大量驱动里。
痛点 这套分工把正确性押在调用者的记忆上。10-19 的报告给出实例:vringh 的 getu16_iotlb() 把 iotlb_translate() 的结果直接送进 __get_user(),全程没有 access_ok(),在 vDPA 透传场景 可以泄漏内核内存。MST 的修复是改用 get_user();他也指出用户页被换出时 会返回 -EFAULT,需要 worker 重试,而 vdpa_sim 目前没有做。
方案 在这条讨论里,Linus 公开了 uaccess-cleanups 分支,目标是把 __get_user()/__put_user() 整个删掉:先完成 x86, 随后补上 alpha、hexagon、32 位 arm、powerpc 中「显然正确」的转换; 需要裸拷贝的地方改为 unsafe_get_user()/unsafe_put_user(), 并用 scoped user access 显式圈定禁页错误的范围。
为什么 这是一次「删 API」而不是「加检查」的清理。与其要求每个调用者记住先 access_ok()、再 __get_user()、还要选对上下文, 不如让这个容易误用的原语消失。注意分支并不删除所有 access_ok(): Linus 明确说只拿掉两个原语,raw_copy_*_user() 与 fork 的栈检查 等仍会保留。
效益 x86 已由 Ingo Molnar 做了 64 位与 32 位 build + boot 验证,MST 在 VM 里测过 vDPA 并给了 Acked-by,i915 侧已送 CI;vringh 本身按新方式修好。一个附带的新约束: 架构如果去掉 __get_user(),必须提供 arch_get_kernel_nofault(),否则通用实现会重新引入它。
下一步 Linus 的测试只到「能 build、能 boot」,他自己说异常路径覆盖不足。剩下较多的是 alpha/mips/sparc 的信号栈代码——他说 sparc32 那部分「太乱」,留给熟悉架构的人。 分支已在 kernel.org 公开,等待更多测试与评审。
一句话点评 删掉一个可被误用的原语,比在每个调用点加检查更能收敛风险;代价是各架构的边角路径要有人真的跑过。

📰 DRM 显示

/ column

★ dma_fence 想用一把锁换掉 RCU,AMD 说这是 no-go

〔10-20 18:01〕· [RFC PATCH v2 0/3] Solve dma_fence's problems by locking (Philipp Stanner)

定位 dma_fence 是 DRM 与 media 共用的同步原语:GPU 命令、显示翻转、 摄像头帧完成都用它串联。当前 fence->ops 由 RCU 保护,回调可以在 RCU 读侧并发执行;驱动释放 fence 前要自己等 synchronize_rcu()。
做法 Philipp Stanner 的 v2 RFC 用三个补丁把 fence->ops 的 RCU 保护 去掉,改成用 fence 自带的自旋锁保护回调;模块卸载路径与 get_*_name() 回调也一并改为锁保护。目标很直接:让 dma_fence_signal() 之后可以立即 kfree(), 不再需要外部再等一轮 grace period。
争议 Christian König 明确反对:锁会把回调串行化,而 is_signaled() 等回调本来就要并行;轮询与中断两条信令路径已经有锁序反转,加锁只会更糟, 他认为应该继续用 RCU 并扩大范围。作者回应说除 set_deadline() 外回调本来就在锁内执行,并请对方给出真正会死锁的内核实例。到今天结束, 双方没有收敛。
和你相关 凡是写 DRM 驱动、用 fence 串命令的,都会受这条约定影响:它决定 signal 之后能不能直接释放。

★ tyr 补上 VM/BO ioctl,在 RK3588S 上跑过 panthor IGT

〔10-20 16:26〕· [PATCH v4 00/11] drm/tyr: add VM and BO ioctl support (Ke Sun)

定位 drm/tyr 是面向 CSF 架构 Mali GPU 的新驱动,用户态接口对齐 panthor。v4 加入 VM 与 BO 的 ioctl,是这条 Rust DRM 路线补 uAPI 的一步。
做法 系列 11 个补丁,基于 drm-file 系列与 Sami Tolvanen 的 buffer 缓存管理补丁。v4 重做 VmPool 拆除:add() 返回调用者持有的错误, 冲突的 VM 用 EBUSY 杀掉,remove() 先 kill 再复用 ID; 另引入 DmaAttr 描述一致性属性。
效益 panthor 的 IGT 测试在 RK3588S 上通过;作者给出完整系列与前置补丁的 GitLab 分支。
和你相关 RK3588S 是 Mali-G610,tyr 是这条线上 Rust GPU 驱动最直接的参照。

★ RK3568 eDP 补齐:Analogix 控制器加 NaNeng PHY

〔10-20 11:10〕· [PATCH v3 0/6] Add eDP support for RK3568(Damon Ding)

定位 RK3568 的 eDP 输出由 Analogix DP 控制器与 Rockchip 的 NaNeng eDP PHY 组成, 主线此前缺这套组合的绑定、PHY 驱动与 DTS。
做法 六个补丁:补 rockchip,rk3568-edp 绑定;为 NaNeng PHY 新增驱动; 给 analogix_dp bridge 与 rockchip 封装加 RK3568 分支;最后补 eDP 控制器与 PHY 节点。
效益 作者在 RK3568 EVB1 上用 LG LP079QX1 面板验证,DTS 示例直接给出 aux-bus 下的 panel 节点。
和你相关 同属 Rockchip 显示栈,RK3588 的 eDP 调试可以对着这份实现看。

📰 media 视频采集

/ column

★ Apple AVD 解码器 v3:用 Cortex-M3 编程的 V4L2 stateless 驱动

〔10-20 17:39〕· [PATCH v3 00/17] media: apple: add avd driver(Sofus Forstreuter)

定位 AVD 是 Apple M1/M2/M3 上的视频解码 IP。它没有「每个参数一个寄存器」, 而是一个寄存器下发整段指令,因此驱动要保证写入顺序与节流;执行交给片上的 Cortex-M3 协处理器。驱动实现 V4L2 M2M stateless 解码接口。
做法 17 个补丁:驱动把指令写进内存段交给 CM3,CM3 编程硬件并回报完成或错误; 框架大量复用 rkvdec。支持 H.264、H.265、VP9 与 AV1(M3 起),输出 NV12/NV16/P010/P210,参考帧使用 Apple 私有的 Interchange 压缩格式, 系列同时补了 P210 与 Apple interchange 两个像素格式。
效益 作者给出 v4l2-compliance 49/49 全过,以及 fluster 分数:HEVC 145/147、 AV1 238/242、VP9 216/305、H.264 77/135。reset 依赖 apple-dart 的一个补丁。
和你相关 想看 stateless 解码器如何把固件/协处理器包进 V4L2 M2M,这是一份完整样例。

★ Qualcomm CCI:sensor 掉电拉低 I2C 线,控制器从此不再启动传输

〔10-21 03:39〕· [PATCH 0/2] i2c: qcom-cci: Recover after a target powers down under a running controller(Birk Skyum)

定位 CCI 是 Qualcomm 摄像头的 I2C 主机控制器。在 Lenovo Yoga Slim 7x (X1E80100)上,OV02C10 关闭后约 1 秒内再次打开必然超时: sensor 掉电时把 SCL/SDA 拉低,而 CCI 一直保持时钟,master 从此不再启动传输, 队列停在第 1 条命令,直到超时路径自己复位。
做法 两个补丁:resume 时重置控制器(现有 resume 只在电源域塌陷时才清状态); 最后一次传输后等 50 ms 再 suspend,避免控制器在 sensor 掉电后继续被时钟。
效益 此前两次尝试都误判为 sensor 上电时序问题(加 settle time、加 regulator off-on 延迟),本次从控制器状态入手解决。
和你相关 相机 bring-up 里,I2C 主机状态与 sensor 掉电顺序的耦合很常见。

★ VD55G0:能进 STREAMING 却不出帧,问题在两处 VD55G1 遗留

〔10-21 02:10〕· [PATCH 2/4] media: i2c: Add ST VD55G0 global shutter sensor driver(评审回复)

定位 ST VD55G0 是全局快门 sensor,在 Surface Pro 11(Snapdragon X Elite, CAMSS)上以单 lane 840 Mbps 运行。驱动启动后 sensor 接受 start、 也报告 STREAMING,但不出帧,stop 也永不完成。
做法 评审指出两处按 VD55G1 抄来的设置:最小行长度 1128 在 840 Mbps 下必须改为 1200(ST 参考驱动在 900 Mbps 以下用 1200);对 VD55G0 写 0 到 0x0329(映射为 ISL_ENABLE)会直接停帧,而 ST 参考驱动从不写它。
效益 修正后 sensor 正常出流。它也说明 stream on 的返回码不能证明链路真的在工作。
和你相关 sensor 驱动的行长度与寄存器映射按型号分叉,是 camera 调试的高频坑。

📰 mm 内存管理

/ column

★ memory.reclaim 增加 source=:分层内存终于能指定从哪层开始回收

〔10-20 17:07〕· [RFC 0/2] mm: add source selectors to memory.reclaim(Li Zhe / ByteDance)

定位 cgroup v2 的 memory.reclaim 只能表达「从这个 memcg 回收 N 字节」。 在 DRAM 加 CXL/远端 tier 的分层内存上,内核按老化决定降级与回收, 用户态无法指定从哪一层开始施加压力。
做法 RFC 加入 typed source=:只声明回收的源范围(指定 node/tier), 不改变降级目标,也不改变 memory.current 的完成度记账; 不写 source 时行为完全不变。
效益 旧的 nodes= 提案被指出把源选择、回收域、降级目标混在一个参数里, 实现也没有覆盖整条回收路径。新方案缩小语义边界,让分层内存的调度器能用 memcg 粒度表达「先压哪一层」。
和你相关 做 CXL/分层内存或 cgroup 内存控制时,这是少见的、面向用户态的回收策略旋钮。

★ Live Update 会话可以提前冻结,缩短 kexec 停机窗口

〔10-20 22:47〕· [PATCH v2 0/2] liveupdate: Add LIVEUPDATE_SESSION_FREEZE ioctl(Pasha Tatashin)

定位 Live Update(LUO)在 kexec 时保留会话与其中的文件。现在只在 reboot 路径里 逐个冻结会话,且全程持全局写锁,冻结被压到停机阶段。
做法 v2 增加 LIVEUPDATE_SESSION_FREEZE ioctl:用户态用完一个会话就冻结, 只拿 per-session mutex;已冻结的会话在 kexec 时跳过自动冻结,若在 kexec 前关闭 则走 unfreeze 回滚文件。
效益 多个会话可以并发预先冻结,kexec 的黑屏时间缩短;错误路径也补了 ucmd 失败时的解冻。
和你相关 Live Update 是 kexec 保设备/保状态这条线的关键组件,改的是停机窗口。

📰 PCI 总线

/ column

★ P2PDMA 上 Intel Xeon:按服务器代际放行设备直连 DMA

〔10-21 01:37〕· [PATCH v4 0/2] PCI/P2PDMA: Allow P2PDMA on Intel Xeon server CPUs(Pavel Popov)

定位 P2PDMA 允许两个 PCI 设备直接互访内存(例如 GPU 直读 NVMe),不走系统内存。 是否可用取决于主机桥;AMD 用 CPU 代际判断,Intel 一直是空白。
做法 v4 两个补丁把 CONFIG_X86 的 ifdef 从 cpu_supports_p2pdma() 里移出,并加入 Xeon 服务器代际白名单 (Skylake-SP 到 Diamond Rapids)。VMware/Hyper-V 透传没有 host bridge 设备, 只能靠 CPU 判断。
效益 Intel 服务器上 P2PDMA 从「默认拒绝」变成按代际放行,Logan Gunthorpe 的 Reviewed-by 已带上;剩余意见集中在 asm 头文件的包含方式。
和你相关 做 DMA/IOMMU、虚拟化直通或 GPU 直连存储时,主机桥白名单直接决定能不能用。

📰 net 网络

/ column

★ netmem 与 page_pool 引用计数对称化,想赶这次合并窗口

〔10-21 06:03〕· [PATCH net-next v3 0/6] net: unify symmetric netmem and page_pool refcounting(Mina Almasry)

定位 page_pool 与 netmem 是收包路径的两套内存抽象,它们的引用计数规则与命名并不对称, 驱动要在两种语义之间切换。
做法 v3 六个补丁统一对称的引用计数与命名。作者还打算在 net-next 重开后, 把 get_netmem 的命名对齐 folio_get 的现代写法。
效益 Jakub Kicinski 希望在本次合并窗口内进入 net-next,避免以后回移植的负担; 作者也打算把命名约定写进 page_pool 文档。
和你相关 改 page_pool/netmem 的驱动与 XDP 收包路径会直接碰到这套语义。

📰 fs 文件系统

/ column

★ CephFS 子卷隔离 v5:缓存元数据也要有 quarantine cap

〔10-21 04:26〕· [PATCH v5 0/5] ceph: support subvolume quarantine(Alex Markuze)

定位 CephFS 的 subvolume quarantine 把某个子卷隔离,同时允许持有 q/Q MDS auth cap 的恢复客户端访问。难点在于:隔离期间 哪些缓存路径还能直接用本地缓存。
做法 v5 把 fscrypt 符号链接缓存的前置改动与 quarantine 系列合并。关键修正是: 缓存 head metadata 的访问必须具备 live、quarantine-aware 的 AUTH_SHARED cap,否则每次操作都问权威 MDS,包括缓存 stat、 目录回复与加密策略/nonce ioctl。快照路径用 MDS 给出的 subvolume ID 判定, 32 位客户端重新校验。
效益 隔离不再只靠客户端自觉;快照、断连快照与不稳定命名空间世代都有对应的重新校验。
和你相关 分布式文件系统的权限与缓存一致性,与本地 VFS 的 dentry/inode 缓存是两套思路。

📰 block 块层

/ column

★ O_DIRECT 的对齐契约可以被绕过:两处 iterator 边界错误

〔10-21 02:43〕· [patch 1/1] iov_iter: validate extracted segment for bvec alignment(Daehyeon Ko / Andrew Morton)

定位 块层 O_DIRECT 依赖 iovec/bvec 的对齐契约。两处边角让契约失效: iov_iter_extract_bvecs() 在跳过空段或截断后,校验范围与实际取出的段 不一致;bio_iov_iter_get_pages() 拒绝错位 bio 时没有回滚 iterator。
做法 Daehyeon Ko 用 iter->count 界定快路径长度;Andrew Morton 在拒绝路径上 保存并恢复整个 iterator,而不是只减字节数(跳过空段会改变位置但不消耗字节)。
效益 前者有未提权 O_DIRECT preadv() 复现:bvec 出现 (1,4095) 与 (0,1), bio 进入 brd 并完成 4096 字节,而不是 -EINVAL;后者在空 iovec 加 10/1015 段的复现里触发 KASAN 越界读,修复后 writev 返回 1025。
和你相关 直通 I/O、DMA 对齐与 iovec 处理是驱动和文件系统交界处的高频问题。

📌 机制雷达:3 条跨域改动

/ section
v7.4 合并窗口 今天 lkml 被 GIT PULL 占满:x86 的 asm/boot/bugs/cache/cleanups/cpu/fpu/platform/sev/ misc/kdump/microcode/mm/tdx 各组、arm64、vfs 19 组、sysctl、IPE、Rust timekeeping、 hte、EDAC 都在往 7.4-rc1 送,下周 rc1 的内容基本定型 · 原文
virtio-blk 内联加密 v3 两补丁(控制 virtqueue + 内联加密)讨论从 10-12 持续到 10-20,NVIDIA、Qualcomm 与 MST 在 virtqueue 管理上往来多轮;virtio-dev 近 24h 只有 1 条新邮件, 本次抓到的 20 条里 16 条属于这条线程 · 原文
sched_ext 回调语义 ops.cpu_acquire/release() 的可靠性 RFC 在 lkml 继续评审。 Tejun 认为追踪「CPU 是否被更高 sched_class 占用」超出 sched_class 的职责, 建议改成 tracepoint 记录每 CPU 当前生效的调度类 · 原文

更多驱动与存储动态

○ [PATCH v5 10/17] PCI: dwc: Free the MSI domain after the host .deinit() callback 〔10-20 11:11〕

○ [PATCH 3/3] media: i2c: ov5675: Add the OVTI5678 RGB-IR variant 〔10-20 09:50〕

○ [PATCH] media: synopsys: dw-mipi-csi2rx: Fix DPHY testclr reset sequence 〔10-20 11:00〕

○ [PATCH net] veth: fix stale peer max_mtu on XDP program replacement 〔10-20 10:02〕

○ [PATCH net 1/3] net: stmmac: honour Rx checksum errors in the AF_XDP zero-copy path 〔10-21 03:03〕

○ [RFC PATCH net-next 0/4] tcp: carry a BPF-chosen identifier in TSval low bits 〔10-21 01:58〕

○ [PATCH] blk-mq: clear stale inactive flag on hctx reuse 〔10-20 20:52〕

○ [PATCH] apparmor: check address length before reading AF_UNSPEC bind address 〔10-20 22:00〕

更多跨域动态

○ [PATCH v3 0/4] workqueue: OwnedQueue and ScopedWork 〔10-20 20:52〕

○ [PATCH v13 0/7] rust: add ww_mutex support 〔10-20 23:31〕

○ [PATCH v4 0/3] KEYS: rhashtable bug fixes 〔10-21 01:43〕

○ [ANNOUNCE] v6.18.57-rt9 〔10-20 18:05〕

○ [PATCH v5 0/2] irqchip/riscv-aplic: fix probing of multiple APLIC instances 〔10-20 23:39〕

○ [RFC PATCH sched_ext/for-7.4 0/5] sched_ext: Make ops.cpu_acquire/release() reliable 〔10-21 03:00〕

○ [PATCH v2 12/15] arm64: drtm: Update the linker script for EFI_STUB_DRTM 〔10-21 06:49〕

○ [PATCH v3 0/2] virtio-blk: Add inline encryption support 〔10-20 11:22〕

📖 本期概念速查

/ section
unsafe_get_user 只做用户内存拷贝、不做地址检查的原语;必须配合 scoped user access 或 pagefault_disable 使用。
scoped user access 用作用域显式圈定「这段代码在访问用户内存」的新接口,替代调用者手工判断 access_ok。
dma_fence GPU 命令、显示翻转与摄像头帧之间的同步对象;signal 之后等待方才能继续。
SRCU 可睡眠的 RCU 变体;König 认为 dma_fence 的回调保护应继续走 RCU 方向。
P2PDMA 两个 PCI 设备之间的直接 DMA,不经过系统内存;需要主机桥与 CPU/芯片组支持。
netmem 收包路径里统一描述页与 net_iov 的内存抽象,与 page_pool 共同管理回收与引用。
AVD / CM3 Apple 视频解码器与它的 Cortex-M3 协处理器;驱动下发指令段,由 CM3 编程硬件。
LUO Live Update Orchestration,kexec 时保留会话与文件;本期的 freeze ioctl 让用户态提前冻结。

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

数据来源:lore.kernel.org(全内核 13 列表)· 北京时间