mlx5dv
与 DevX¶
Quote
- 头文件:
infiniband/mlx5dv.h
- API 前缀:
mlx5dv_
mlx5dv
(Direct Verbs)API 支持从用户空间直接访问 mlx5 驱动设备的资源,绕过 libibverbs
的数据通路,直接暴露低级别的数据通路。
兼容性
从 Connect-IB 开始的所有 Mellanox 网卡设备(包括 Connect-IB、ConnectX-4、ConnectX-4Lx、ConnectX-5 等)都实现了 mlx5 API。
DevX API 疑似是 Mellanox 开发的 mlx5dv
的前身,其仓库上次更新时间为 2018 年,当年 mlx5dv
也并入了 rdma-core
。现在 DevX 成为了 mlx5dv
的一部分。
这部分的文档少得可怜。目前仅有的文档来自 rdma-core/providers/mlx5/man
的 mlx5 Programmer's Manual。我们先对 DevX API 的各个部分建立大概的印象:
-
DevX(见
mlx5dv_devx_obj_create
):目标是使用户空间驱动程序尽可能独立于内核。当设备提供新的功能和命令时,不需要内核更改就能使用。- DEVX 对象代表底层的固件对象。
- 创建 DEVX 对象后,可以通过
mlx5dv_devx
API 进行查询、修改或销毁。
这一部分的数据结构都是固件相关的二进制数据,编程时采用大量宏定义和位操作。需要仔细查看具体的设备文档。
-
Direct Rule(见
mlx5dv_dr_flow
):让应用程序直接控制设备的所有包转发(packet steering)功能,定义复杂的流表规则,包括计数、封装、解封装等。
DMA 示例¶
使用 mlx5dv
API 执行 DMA 拷贝:
- Host:
- 用 IB Verb 创建设备上下文、PD
- 使用
mlx5dv_devx_umem_reg()
注册用户 DMA 内存,获得一个struct mlx5dv_devx_umem
。 - 使用
MLX5_CMD_OP_CREATE_MKEY
调用mlx5dv_devx_obj_create()
获得 MKEY。 - 使用
mlx5dv_devx_general_cmd()
执行MLX5_CMD_OP_ALLOW_OTHER_VHCA_ACCESS
,允许其他 VHCA 访问内存。
- Device:
- 用 IB Verb 创建设备上下文、PD 和 MR。
- 从 Host 获取相关数据
- 使用
MLX5_CMD_OP_CREATE_GENERAL_OBJECT
和MLX5_GENERAL_OBJ_TYPE_MKEY
调用mlx5dv_devx_obj_create()
创建 MR 别名。