【内核高手进阶】RDMA 静态 dmabuf 铁血进化史:从争议到标准,打破异构计算壁垒
前言
在高性能计算(HPC)领域,GPU 与网卡(NIC)之间的 P2P(点对点)数据传输是性能的生命线。然而,Linux 内核 RDMA 子系统曾有一个极其严苛的限制:要玩 dmabuf 共享,硬件必须支持 ODP(按需分页)。这导致除了 NVIDIA/Mellanox 之外,其他厂商(如 Intel, Broadcom, Amazon EFA)都被拒之门外。
本文将通过复盘 RFCv1 到 RFCv3 的三次顶级技术博弈,带你深入了解 “静态 dmabuf 接口” 是如何从一个被“NAK”的补丁,进化为内核通用标准的。
一、 RFCv1:大胆的突围与激烈的争论
背景:Gal Pressman (Amazon EFA) 发现,像 Habanalabs 这种 AI 加速器,其显存本身就是固定(Pinned)的,根本不会移动。既然不移动,为什么非要网卡支持复杂的 ODP 通知机制?
提出的问题
目前 RDMA 强制要求动态 dmabuf(需要 ODP)。Gal 提出:通过检查 move_notify 回调是否存在,来区分静态和动态设备。 如果是静态设备(如 Habanalabs),就允许非 ODP 网卡开启 P2P。
开发者大PK
-
Christian König (AMD 维护者):直接给了个 NAK(拒绝)。他认为改框架太麻烦,建议直接在导入/导出阶段“Pin(固定)”所有缓冲区。但他同时警告:
amdgpu从不这么干,因为固定内存会造成显存碎片,干扰显示输出。 -
Daniel Vetter (Intel/DRM 维护者):泼了一盆冷水。他认为 Habanalabs 的驱动代码还没进内核主线(linux-next),现在谈架构修改是“空中楼阁”,没意义。
-
Jason Gunthorpe (RDMA/VFIO 维护者):站出来撑腰。他指出 VFIO 虚拟化也急需这个功能,这不只是 Habanalabs 的私活,而是通用需求。
RFCv1 结论
初步达成一致:不要试图去欺骗框架,而应该通过显式的“固定(Pinning)”机制来解决。
二、 RFCv2:规范化路径的探索
解决的问题与改进
基于 V1 的反馈,Gal 推倒重来。RFCv2 不再简单地绕过检查,而是引入了规范的 Pinning 流程:
-
在映射页面前,显式锁定
dma_resv。 -
调用
dma_buf_pin()将缓冲区物理位置锁死。 -
通过这种方式,即便网卡不支持 ODP,也能安全地访问 P2P 内存。
开发者意见
-
Christian König:认可了 Pinning 的方向,但他发现 Gal 在驱动里写了一个“虚假(Dummy)”的回调函数(里面只放个
WARN_ON)来骗过内核检查。Christian 吐槽道:“这代码看起来糟透了,如果是可选的,就应该是可选的。”
RFCv2 结论
代码审美达成共识:V3 必须干掉那些无意义的空回调函数,让内核接口真正支持“可选的移动通知”。
三、 RFCv3:最终合入,定义的巅峰
RFCv3 是最终并入主线(Upstream)的版本,它不仅是代码的胜利,更是内核文档的革新。
相对于 V2 的改进
-
彻底重构接口:引入了
ib_umem_dmabuf_get_pinned()。如果驱动不支持 ODP,就调这个函数,它会自动完成 Pinning,且不再需要驱动提供move_notify回调。 -
文档语义澄清(关键):补丁 #1 修改了 dmabuf 的核心文档。明确指出:Pinning 并不意味着必须把内存搬到系统内存(RAM)。只要导出者愿意,它可以让内存就地锁死在显存里。
解决的终极问题
它解决了 “灵活性”与“确定性”的矛盾。通过这个补丁集,Linux 内核官方承认了“非动态 P2P”的合法地位。网卡不需要支持昂贵的 ODP,也能与 AI 加速器进行零拷贝通信。
四、 后续:各大厂商的“大圣归来”
RFCv3 合入后,RDMA 子系统正式开启了“平民 P2P”时代。
1. Intel irdma:实战落地的排头兵
由 Zhu Yanjun (yanjun.zhu@linux.dev) 提交的补丁,标志着 Intel 在异构计算联动上的重大进步。
-
详细背景:Intel 的
irdma驱动本身不支持 ODP 功能。在 RFCv3 之前,它几乎无法参与 dmabuf 的 P2P 传输。 -
解决的问题:Zhu Yanjun 引入了对
reg_user_mr_dmabuf的支持。通过调用ib_umem_dmabuf_get_pinned(),irdma能够完美导入 Habanalabs 导出的 dmabuf。这使得 Intel 网卡能在不依赖高端特性的情况下,实现与 AI 加速器的标准 P2P。 -
合入链接:可在内核邮件列表中搜索 RDMA/irdma: implement reg_user_mr_dmabuf support。
2. Broadcom bnxt_re:硬件兼容性的跨越
博通也跟进实现了该接口。由于其硬件同样无法处理动态内存移动,通过静态 Pinning 机制,bnxt_re 现在可以在高性能存储和计算集群中,像 mlx5 一样直接读写 GPU 缓冲区。
3. Microsoft mana:云端虚拟化的福音
微软的 Azure 网卡(MANA)也实现了该功能。在云端复杂的虚拟化环境下,动态迁移内存极其困难。通过 RFCv3 的静态接口,Azure 成功让虚拟机内的 GPU P2P 性能得到了质的飞跃。
结语
从 Gal Pressman 孤身挑战框架,到 Christian 和 Jason 的严苛打磨,再到 Zhu Yanjun 等开发者的实战跟进,静态 dmabuf 的历史,就是 Linux 内核向生产力妥协并进化的缩影。 现在的 Linux 内核,即便你手里没有顶级的 ODP 网卡,只要你有优秀的驱动和正确的架构,P2P 的高性能之路依然为你敞开!
参考资料:
-
Linux Kernel Mailing List (LKML)
-
RDMA Subsystem Documentation
-
[Patch] RDMA/core: Support supported dmabuf pinning (RFCv3)

更多推荐
所有评论(0)