本系列以 Linux、rdma-core 和 mlx5 为分析对象,从 Verbs API 开始逐层分析用户态 provider、uverbs、RDMA Core、mlx5 内核驱动和 HCA 硬件,并进一步梳理内存注册、队列创建、数据收发、完成通知以及 GPU DMA-BUF 使用流程。本文说明各篇文章的定位、阅读顺序和源码入口。
1. 分析范围
本系列以 RC QP 和 RoCEv2 为主线,仅在相关接口处说明 InfiniBand 差异,主要分析以下内容:
- 控制路径:设备初始化,以及 MR、QP、CQ、EQ 等资源的创建、配置和释放过程。
- 数据路径:提交请求、HCA 访问内存,以及数据发送、接收和完成的处理过程。
- GPU 专题:基于 DMA-BUF 的 GPU 内存注册、RDMA 访问和资源释放过程。
2. 篇目导航
本系列共包含 11 篇文章,按"系列导读---软件架构---分层实现---专题路径---GPU 内存"的顺序展开。
| 编号 | 文档 | 内容 |
|---|---|---|
| 01 | RDMA-Verbs-文章导读(一) | 本系列文章的分析范围、章节安排和阅读路线。 |
| 02 | RDMA-Verbs-软件架构(二) | 建立从应用、用户态库、内核服务、mlx5 驱动到 HCA 和内存的分层模型,区分资源控制、用户态/内核态收发路径与事件通知路径。 |
| 03 | RDMA-Verbs-API 和数据结构(三) | 分类介绍 Verbs API,解析 context、PD、MR、QP、CQ、WR、SGE 和 WC 等对象及其分发关系,并说明 MR 注册与地址语义。 |
| 04 | RDMA-Verbs-MLX5 用户态库(四) | 分析 mlx5 provider 的 context、私有对象、队列 buffer、DBR 与 UAR/BF,以及创建 PD/MR/CQ/QP、提交 WQE 和解析 CQE。 |
| 05 | RDMA-Verbs-内核 uverbs 接口(五) | 分析 /dev/infiniband/uverbsN 设备入口、文件与事件上下文、ioctl 属性和 legacy write ABI,以及用户对象的查找、提交、回滚与销毁。 |
| 06 | RDMA-Verbs-内核 RDMA Core(六) | 分析 Linux RDMA Core 的设备注册与注销流程、ib_device_ops 安装与 Kernel Verbs 分发,以及通用对象、驱动私有对象和用户对象的关系。 |
| 07 | RDMA-Verbs-内核 MLX5 驱动(七) | 说明 mlx5_core 与 mlx5_ib 的分工和初始化,分析 RDMA 资源请求、固件 command queue 及 IRQ/EQ 设备事件分发流程。 |
| 08 | RDMA-Verbs-内存管理(八) | 比较普通 MR、DMA-BUF MR、ibv_buf 和 device memory,分析用户页固定、DMA 映射、设备内存分配及 MKey/UMR 配置路径。 |
| 09 | RDMA-Verbs-QP、CQ 和 EQ(九) | 分析用户态和内核态 QP/CQ 创建流程,解析 QP→CQ→completion EQ 的对象与硬件关系,并说明 QP 状态转换、销毁和失败处理流程。 |
| 10 | RDMA-Verbs-数据收发与完成(十) | 区分 SEND、WRITE、READ 和 Atomic 等操作语义,分析提交 WQE 和 CQE/WC 的处理流程,以及 CQ 轮询和 completion channel 事件通知。 |
| 11 | RDMA-Verbs-GPU 内存与 DMA-BUF(十一) | 以 AMD GPU 为主线,分析 HSA/KFD allocation 导出 DMA-BUF 和 RNIC importer 的映射流程,并说明 P2P/GTT 条件、地址空间、同步、释放等内容,以及 NVIDIA DMA-BUF 的使用方法。 |
第 02 篇先建立全局架构;第 03~07 篇分别深入通用 API 与对象、mlx5 用户态 provider、uverbs、RDMA Core 和 mlx5 内核驱动。在此基础上,第 08~10 篇横向串联内存、QP/CQ/EQ 和数据收发三条专题路径;第 11 篇再把内存注册与同步机制扩展到 GPU DMA-BUF 场景。
3. 阅读路线
首次阅读时按文章编号展开:先了解软件架构和 Verbs 对象,再理解用户态、内核通用层与设备驱动的实现边界,随后串联内存、队列、数据路径和 GPU 内存专题。如果只关心特定方向,可以在阅读第 02、03 篇后选择专题:用户态数据路径重点阅读第 04、09、10 篇,内核控制路径重点阅读第 05~09 篇,GPU 内存路径重点阅读第 08、11 篇。
图中的箭头表示阅读顺序。中间一行的三个模块分别对应第 04、05~06、07 篇文章,建议从左到右阅读。

4. 源码基线
| 仓库 | 版本 | Commit |
|---|---|---|
| rdma-core | v65.0-1-gb5d5872dc |
b5d5872dcee3fcb1800662a2708ee906c2efa1c7 |
| Linux | v7.2 |
8d3ae59288f1e7d58d76558a6ee96d533bc5019f |
| rocm-systems | hip-version_10.1.62460 | 5ea42aa92369c55f13edb934711cba18ab123790 |
| nvshmem | v3.6.5-0 | 6e53a40d9db16df170b3b0057e94c340d72f77eb |
| open-gpu-kernel-modules | 610.57.04 | e4a5faa2567f28c8eabe0ebb6422b6d0abcf37eb |
5. 源码入口
| 源码入口 | 主要内容 |
|---|---|
| rdma-core/libibverbs/ | 用户态 verbs、设备发现和命令封装。 |
| rdma-core/providers/mlx5/ | mlx5 用户态资源管理与收发实现。 |
| linux/drivers/infiniband/core/ | uverbs、RDMA Core 和内存管理。 |
| linux/drivers/infiniband/hw/mlx5/ | mlx5_ib 资源管理与内核态收发实现。 |
| linux/drivers/net/ethernet/mellanox/mlx5/core/ | mlx5_core 设备初始化、固件命令和事件处理。 |
| linux/include/rdma/ib_verbs.h | 内核 verbs 接口与对象定义。 |