今天 Linux 内核圈,值得花 3 分钟看三件事:mm 把 per-VMA 锁放开到全配置scalable COW 的地基落地,和 nouveau 默认开启 atomic modesetting

封面 · 8月14日 · per-VMA 锁全配置放开

🎬 今日导读

/ section
头条 mm 无条件开放 per-VMA 锁,binder / TCP 摆脱 mmap_lock 回退
头条 mm/rmap 用匿名 pgoff 索引 MAP_PRIVATE 文件页,scalable COW 地基落定
DRM nouveau NV50+ 默认启用 atomic modesetting,老卡用户受益
机制 xswap 虚拟 swap、CXL Type-2 直通、skb secmark 换 xarray

💡 今日头条

/ section

mm 把 per-VMA 锁放开到全配置:binder 和 TCP 扔掉 mmap_lock 回退

〔08-14 03:34 北京〕· [PATCH v6 0/5] mm: Unconditional per-VMA locks and cleanups

现状 进程地址空间由一棵 VMA(虚拟内存区域)树描述,历史上所有「查 VMA 再改它」都靠一把全局 mmap_lock 读写锁;per-VMA 锁是页错误热路径引入的细粒度替代品,但此前只在「启用 SMP 且启用 MMU」的架构上才编译。
痛点 因为不是全配置可用,通用代码不敢依赖它——Suren 做 x86 shadow stack 时为了避开 mmap_lock 的递归锁死只能绕路;binder、TCP 等场景也不得不保留 mmap_lock 回退路径,全局锁竞争依旧。
方案 把 per-VMA 锁改成全配置可用(其依赖的 RCU、maple tree、引用计数本就不挑 SMP/MMU);新增 vma_start_read_unlocked() 辅助 API,让调用方用一把 per-VMA 读锁替换「mmap_read_lock + vma_lookup + 解锁」这个常见惯用法。binder 两处、TCP 一处迁移。
为什么 唯一代价是 !SMP / !MMU 构建里 VMA 变大一点点;换来的是去 #ifdeffery、复杂度大降、代码更干净——用内存多占几字节换掉一堆条件编译。
效益 binder(Android 高频 IPC)与 TCP 路径彻底不再碰 mmap_lock 回退,全局锁竞争下降;页错误热路径锁粒度进一步细化,也惠及后续一切想绕开 mmap_lock 的工作。
下一步 系列由 Dave Hansen 起头、Suren 接棒,v6 在等 mm 与 binder/net 维护者 ack,有望进 -next 排队。
一句话点评 一把锁从「部分配置可用」到「全配置可用」,抽象简化与锁竞争双赢——mm 层少见的低风险高收益系列

scalable COW 的地基:MAP_PRIVATE 文件页换用匿名 pgoff 索引

〔08-14 01:32 北京〕· [PATCH v5 00/16] mm/rmap: index MAP_PRIVATE file-backed folios by anonymous pgoff

现状 内核的「匿名内存」其实有四副面孔:纯匿名、shmem、MAP_PRIVATE 映射 /dev/zero、以及其他 MAP_PRIVATE 文件映射(CoW 后 folio 变匿名)。反向映射(rmap)靠 folio->mapping 和 folio->index 两个字段定位引用它的 VMA。
痛点 对 MAP_PRIVATE 文件映射,CoW 出的匿名 folio 的 index 沿用「文件页偏移」,大量匿名 folio 的偏移互相冲突,rmap 的 remap 追踪争用加剧,scalable COW 依仗的 maple tree 快速路径永远走不上。
方案 给 VMA 引入「匿名页偏移(anonymous page offset)」属性,让 CoW 出的匿名 folio 按匿名偏移索引、与纯匿名行为一致;同时把 MAP_PRIVATE 的 /dev/zero 映射「彻底匿名化」。v5 共 16 篇。
为什么 为 scalable COW 打地基——快速路径按 folio->index 在 maple tree 里定位 VMA,统一到匿名偏移后冲突消失、快速路径可用;未来还可在 remap 时 unshare 深 fork 层级里的匿名映射,省掉大部分 remap 追踪。
效益 合并性几乎不受影响(只有 CoW 后又 remap 的边缘情形要求偏移也匹配);换来 scalable COW 的性能地基与后续 unshare 优化空间。
下一步 v5 已收敛(末尾 4 篇 /dev/zero 细节留待后续处理);scalable COW 本体继续推进。
一句话点评 一次「索引地图」的重绘,让 COW 性能快速路径终于能跑起来——典型的地基型系列

📰 mm

/ column

xswap:zswap 撑起的「虚拟可扩展 swap 设备」(RFC v3)

linux-mm · PATCH RFC v3

定位 mm/swap 层,RFC v3 提出虚拟可扩展 swap 设备 xswap——后端页由 zswap 压缩存储,容量可在线增长。
做法 15 篇系列:swap_info_struct 加 xswap 字段、cluster 按需 vmalloc 扩展、sysfs 创建接口与上限、shrink 工作队列等。
效益 让 zswap 从「swap 加速器」变成可扩展的 swap 后端,swap 容量不再受物理设备限制。
和你相关 关注内存回收 / swap 的同学可跟进——这是把 zswap 能力外扩的大方向。

大 folio 迁移:批量 rmap 遍历降开销

linux-mm · PATCH v2

定位 mm/rmap 层,迁移大 folio 时要逐页做反向映射遍历,开销偏高。
做法 7 篇 v2:把大 folio 迁移期间的 rmap 遍历批量合并,减少重复查找。
效益 大页面迁移路径提速,THP / 大 folio 场景受益。
和你相关 和迁移、碎片整理相关,跑大页面负载的同学可关注。

没有 swap 时不再拆大 folio

linux-mm · PATCH v6

定位 mm/vmscan 回收层:无 swap 环境下换出大 folio 会先把它拆成小页。
做法 v6 系列:swap 不可用时避免无谓的大 folio 拆分,减回收路径开销。
效益 无 swap 部署(手机 / 嵌入式)回收更高效,大页面保留率更高。
和你相关 无 swap 设备的回收行为会因此变好。

📰 DRM

/ column

nouveau:NV50+ 默认开启 atomic modesetting

DRM · PATCH RESEND v7

定位 DRM/KMS 层,nouveau 是少数仍未默认启用 atomic modesetting 的现代驱动。
做法 5 篇 v7:NV50+ 默认启用 atomic,NV04 保持原样(从未实现 atomic)、
效益 用户态对非 atomic 驱动的支持正在腐坏,默认 atomic 让 nouveau 跟上现代 KMS 栈;Lyude 已在自己多数机器默认开启数月。
和你相关 用 NVIDIA 老卡跑桌面 Linux 的同学,未来默认就是 atomic 显示栈。

内核 Rust:新增「按范围预留 ID」抽象(nova-core 通道 ID)

dri-devel / Rust · PATCH v6

定位 内核 Rust 抽象层,为驱动提供「按范围预留 ID」的能力,服务 nova-core 的硬件通道 ID 管理。
做法 v6 系列引入 range-based ID reservation 抽象。
效益 nova-core 从 GSP 拿到的通道 ID 可按范围安全管理,Rust 驱动基建再进一步。
和你相关 关注 nova-core / 内核 Rust 的同学可跟进。

📰 PCI

/ column

CXL Type-2 设备直通:27 篇把加速器搬进虚拟机

PCI / vfio · PATCH v4

定位 PCI/vfio 层:让 CXL Type-2 设备(如加速器)能整体透传给 guest,guest 内跑专有驱动。
做法 27 篇 v4:新增 vfio/cxl 子模块,虚拟化 CXL DVSEC、模拟并陷阱 HDM decoder、reset 与电源转换时撤销 HDM 映射、响应 guest 触发的 CXL reset。
效益 CXL Type-2 加速器云化直通的关键一步,guest 获得完整 CXL 能力视图。
和你相关 关注 CXL / 虚拟化直通的同学,这是 CXL 从存储走向计算的关键。

PCIe endpoint 也学会 DMA:EP 用 DMA 通道与 host 搬数据

PCI / dmaengine · PATCH v7

定位 PCIe endpoint 子系统:给 endpoint 模式补上 DMA 能力,EP 不再只靠寄存器 / 中断交互。
做法 10 篇 v7:dmaengine 静态通道 ID + dw-edma 通道委托 + PCI dwc 暴露 EP DMA 资源与元数据。
效益 endpoint 功能扩展到 DMA,为高性能 EP 用例(虚拟化 / 加速器)铺路。
和你相关 做 PCIe endpoint / 虚拟化 IO 的同学可关注。

📰 net

/ column

ARP / 邻居表按网络命名空间隔离(15 篇)

netdev · PATCH v4

定位 net/neighbour 层:arp_tbl 与 nd_tbl 目前是全局表,多租户下相互干扰、锁竞争明显。
做法 15 篇 v4:把 ARP 表与邻居表按网络命名空间(netns)隔离。
效益 容器 / 多租户网络的 ARP、ND 状态隔离,资源与故障域更清晰。
和你相关 做容器网络 / 多租户的同学,这是邻居子系统的重大收敛方向。

bpf_ksock:BPF 程序能碰内核 socket 了(v7)

netdev / BPF · PATCH v7

定位 BPF 层:新增 bpf_ksock kfunc 系列,让 BPF 程序访问内核态 socket。
做法 5 篇 v7:ksock kfuncs + 异步回调保护 + LSM 挂载禁用的测试覆盖。
效益 内核 socket 暴露给 BPF,可观测与安全程序能做的事更多。
和你相关 做 BPF / 可观测的同学可跟进。

📰 LSM

/ column

skb 的 secmark 换成 xarray 索引:摆脱定宽整数的语义困局

LSM / net · PATCH 0/7

定位 网络 + LSM 跨界:skb 的 secmark 目前是 32 位整数,多个 LSM 共享同一语义空间。
做法 7 篇系列:新增两个操作 struct lsm_prop 的 hook,SELinux / Smack / AppArmor 各自适配,skb secmark 改为 xarray 索引。
效益 secmark 从定宽整数变为可扩展索引,摆脱 32 位语义冲突,为多 LSM 并存铺路。
和你相关 关注安全子系统 / 多 LSM 架构的同学可跟进。

📰 media

/ column

virtio-media:虚拟媒体设备有了统一通道(v7)

media / virtio · PATCH v7

定位 media + virtio 跨界:新增 virtio-media 设备类型,让虚拟摄像头 / 编解码器以统一 virtio 通道暴露给 guest。
做法 v7 4 篇:骨架驱动 + session 管理 + scatterlist 构建 + ioctl 操作。
效益 虚拟化场景的媒体设备有了标准通道,qemu 侧可按此实现。
和你相关 关注虚拟化 / 媒体子系统的同学可跟进。

MacBook 摄像头驱动进内核:Broadcom FaceTime HD

media · PATCH 0/5

定位 新驱动:把社区 facetimehd 代码移植进内核,驱动 MacBook 的 Broadcom FaceTime HD 摄像头。
做法 5 篇:搬运代码 + Kconfig / Makefile + 编译期修复 + 固件提取脚本 + MAINTAINERS。
效益 苹果本用户的内核摄像头驱动有望进主线。
和你相关 在 MacBook 上跑 Linux 的同学可以期待。

📌 机制雷达:跨域大改动

/ section
per-VMA 锁全配置化 一把 VMA 级读锁从「部分配置可用」变「全配置可用」,binder / TCP 去掉 mmap_lock 回退 · 原文
匿名 pgoff 索引 MAP_PRIVATE 文件映射的匿名 folio 改按匿名偏移索引,为 scalable COW 铺路 · 原文
xswap 虚拟 swap zswap 支撑、可在线扩容的虚拟 swap 设备(RFC)· 原文
skb secmark → xarray 网络包安全标记从定宽整数换为 xarray 索引,多 LSM 语义解耦 · 原文
CXL Type-2 直通 vfio/cxl 把 CXL Type-2 加速器整体透传给 guest(27 篇)· 原文
PCIe endpoint DMA endpoint 模式补上 DMA 能力(dmaengine 通道委托)· 原文
neighbour 表命名空间化 arp_tbl / nd_tbl 按网络命名空间隔离(15 篇)· 原文

○ 更多动态

/ column

更多动态

media: uvcvideo 重提交时保持 status URB 间隔 〔08-13 15:47〕

media: uvcvideo 不越界读 uvc_status_control 〔08-14 04:43〕

fs: netfs 修读进度上报与未初始化返回值 〔08-13 21:45〕

block: loop 修新引入的锁反转 〔08-14 00:14〕

Rust: hrtimer 修 forward() / expires() 与并发 arming 竞态 〔08-13 21:48〕

mm: selftests/mm 把 GUP 微基准从功能测试里拆出来 〔08-14 02:13〕

📖 本期概念速查

/ section
per-VMA lock 进程地址空间里 VMA(虚拟内存区域)粒度的读锁,基于 RCU + maple tree,可替代 mmap_lock 的热路径加锁
anon pgoff VMA 的「匿名页偏移」属性,让 CoW 出的匿名 folio 按匿名偏移被反向映射定位
scalable COW 面向深 fork 层级的写时复制优化,靠 VMA 在 maple tree 中的快速定位加速
atomic modesetting DRM/KMS 的原子化模式设置——一次 commit 提交完整 plane / CRTC 状态,现代 GPU 显示栈基础
secmark skb 上的安全标记,SELinux / Smack 等 LSM 用来给网络包打标签;本次从定宽整数改为 xarray 索引
xswap 由 zswap 压缩存储支撑的「虚拟可扩展 swap 设备」,容量可在线增长

一把锁放开全配置,一张索引重绘加速 COW——今天的地基比楼房多。

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