【RDMA】mlx5dev mlx5dv_devx 接口

目录

mlx5dev和mlx5dv_devx的关系

mlx5dev

mlx5dv_devx

[mlx5dv_modify_qp_lag_port 和 mlx5dv_modify_qp_udp_sport 的区别是?](#mlx5dv_modify_qp_lag_port 和 mlx5dv_modify_qp_udp_sport 的区别是?)

[mlx5dv 接口家族](#mlx5dv 接口家族)


mlx5dev和mlx5dv_devx的关系

mlx5dev 接口基本都是对 mlx5dv_devx 接口的封装和特化。

从代码分析可以看出:

  1. mlx5dv_devx 接口 是最基础的 DEVX 接口,提供了对硬件的直接访问能力:

    • mlx5dv_devx_obj_create/modify/destroy/query - 通用对象操作接口
    • mlx5dv_devx_umem_reg - 用户内存注册
    • mlx5dv_devx_alloc_uar - UAR 分配
    • 等等
  2. mlx5dev 接口 是在 mlx5dv_devx 基础上的封装和特化:

    • mlx5dv_modify_qp_udp_sport - 特化用于修改 QP 的 UDP 源端口
    • mlx5dv_devx_qp_modify - 特化用于修改 QP 对象
    • mlx5dv_devx_cq_modify - 特化用于修改 CQ 对象
    • 等等

正如我们在之前的分析中看到的,mlx5dv_modify_qp_udp_sport 实际上是构建了一个 RTS2RTS_QP 命令并通过 mlx5dv_devx_qp_modify 来实现的,而 mlx5dv_devx_qp_modify 最终调用的是 mlx5dv_devx_obj_modify。

例如:

mlx5dv_modify_qp_udp_sport 和 mlx5dv_devx_obj_modify 都可以用于修改 RoCE 的 UDP 源端口,mlx5dv_modify_qp_udp_sport 本质上是对 mlx5dv_devx_obj_modify 的封装和特化,它最终会调用 mlx5dv_devx_obj_modify 来完成对 QP 的 UDP 源端口的修改。

mlx5dev

resolute (7) mlx5dv.7.gz

Provided by: libibverbs-dev_56.1-1ubuntu1_amd64

https://manpages.ubuntu.com/manpages/resolute/en/man7/mlx5dv.7.html

https://github.com/linux-rdma/rdma-core/tree/master/providers/mlx5/man

bionic (7) mlx5dv.7.gz

由:libibverbs-dev_17.1-1ubuntu0.2_amd64 提供

名称(NAME)

mlx5dv 针对 Mellanox MLX5 设备的直接操作接口(Direct Verbs)

该接口为 MLX5 系列设备提供底层访问能力,用于执行数据路径操作,避免了 ibv_post_send(3) 中常见的通用分支处理开销。

描述(DESCRIPTION)

libibverbs API 是一个抽象接口,不依赖于任何底层硬件的具体实现(意思是 RDMA 网卡不仅有 mellanox(MLX)、还有 intel 等厂商,这些厂商都遵循 OFED 的 verbs API 接口定义,针对自家网卡实现了 API 规定的功能)。这种抽象虽然提高了用户程序的可移植性,但会带来一定的性能损耗。

对于某些对性能高度敏感的应用而言,优化性能的重要性往往超过可移植性需求。

为此,MLX5 提供了"直接操作"(Direct Verbs)API。该接口暴露了 MLX5 设备特有的底层数据路径操作(send/receive/completion),允许应用程序绕过标准 libibverbs 数据路径 API,直接与硬件交互,从而获得更高的性能。(mellanox 自己实现了一套更能发挥自家产品硬件优势的 API)

该接口在特定于 MLX5 硬件的头文件中定义,包含相关的内联函数,以及从 ibverbs 结构到 MLX5 特定结构的转换逻辑。

通过直接include mlx5dv.h 头文件并链接 MLX5 相关库(如 libmlx5.so),即可使用这些新接口。

应用程序一旦使用直接操作路径,必须自行管理所有锁机制。严禁在同一应用程序的数据路径中同时使用直接与非直接的访问方式。否则可能导致未定义行为或性能下降。

注意事项(NOTES)

所有从 Connect-IB 开始的 Mellanox 网卡设备(包括 Connect-IB、ConnectX-4、ConnectX-4Lx、ConnectX-5 及后续型号)均实现了 MLX5 编程接口。因此,使用 MLX5 直接操作 API 并不会将应用程序限制于单一硬件型号,在一定程度上仍保持了跨代设备的可移植性。

参见(SEE ALSO)

ibv_post_send(3)verbs(7)

作者(AUTHORS)

Leon Romanovsky <leonro@mellanox.com>

mlx5dv_devx

mlx5dv_devx_qp_modify ------ 通过 DEVX 接口修改 Verbs QP(队列对)
mlx5dv_devx_qp_query ------ 通过 DEVX 接口查询 Verbs QP(队列对)

mlx5dv_devx_cq_modify ------ 通过 DEVX 接口修改 Verbs CQ(完成队列)
mlx5dv_devx_cq_query ------ 通过 DEVX 接口查询 Verbs CQ(完成队列)

mlx5dv_devx_srq_modify ------ 通过 DEVX 接口修改 Verbs SRQ(共享接收队列)
mlx5dv_devx_srq_query ------ 通过 DEVX 接口查询 Verbs SRQ(共享接收队列)

mlx5dv_devx_wq_modify ------ 通过 DEVX 接口修改 Verbs WQ(工作队列)
mlx5dv_devx_wq_query ------ 通过 DEVX 接口查询 Verbs WQ(工作队列)

mlx5dv_devx_ind_tbl_modify ------ 通过 DEVX 接口修改 Verbs 重定向表(indirection table)
mlx5dv_devx_ind_tbl_query ------ 通过 DEVX 接口查询 Verbs 重定向表(indirection table)

描述

通过 DEVX 接口对 Verbs 对象执行修改或查询操作。

DEVX API 利用 KABI(内核 ABI)机制,允许用户空间直接访问 mlx5 设备驱动,其主要目标是使用户态驱动尽可能独立于内核,从而在无需或仅需极少内核改动的情况下,启用未来设备的新功能和新命令。

上述 API 允许通过 DEVX 接口对 Verbs 对象进行修改或查询,从而实现 Verbs 与 DEVX 之间的互操作性。应用程序可以使用 Verbs 提供的创建接口(例如 ibv_create_qp)创建对象,然后通过 DEVX 接口对其进行修改或查询(例如 mlx5dv_devx_qp_modify)。


参数

  • qp / cq / wq / srq / ind_tbl :要执行操作的 ibv_xxx 对象(分别为队列对、完成队列、工作队列、共享接收队列或重定向表)。
  • in:输入缓冲区,包含以设备规范格式提供的命令输入数据。
  • inlen :输入缓冲区 in 的字节大小。
  • out:输出缓冲区,用于存放按设备规范格式返回的命令输出数据。
  • outlen :输出缓冲区 out 的字节大小。

返回值

成功时返回 0;失败时返回对应的 errno 错误码。

如果错误码为 EREMOTEIO,则可通过 outbox.statusoutbox.syndrome 获取命令失败的详细信息。


另请参阅

mlx5dv_open_device, mlx5dv_devx_obj_create


作者

Yishai Hadas yishaih@mellanox.com

mlx5dv_modify_qp_lag_port 和 mlx5dv_modify_qp_udp_sport 的区别是?

主要功能区别

修改对象不同:

mlx5dv_modify_qp_lag_port 用于修改 QP(Queue Pair)所使用的 LAG(Link Aggregation Group)端口,主要用于多端口网卡的负载均衡或冗余场景。

mlx5dv_modify_qp_udp_sport 用于修改 RoCE v2 QP 的 UDP 源端口,主要用于 RoCE v2 流量的端口定制,便于网络设备识别和流量分流。

应用场景不同:

mlx5dv_modify_qp_lag_port 适用于需要动态切换 QP 绑定的物理端口(如 LAG/多端口网卡)时。

mlx5dv_modify_qp_udp_sport 适用于需要修改 RoCE v2 的 UDP 源端口以实现更灵活的流量管理时。

修改内容不同:

mlx5dv_modify_qp_lag_port 修改的是 QP 的物理端口号(LAG port)。

mlx5dv_modify_qp_udp_sport 修改的是 QP 的 UDP 源端口号。

技术实现区别

cpp 复制代码
static int modify_qp_lag_port(struct ibv_qp *qp, uint8_t port_num)
{
    // ...
    DEVX_SET(rts2rts_qp_in, in, opcode, MLX5_CMD_OP_RTS2RTS_QP);
    DEVX_SET(rts2rts_qp_in, in, qpn, qp->qp_num);
    DEVX_SET(rts2rts_qp_in, in, opt_param_mask,
         MLX5_QPC_OPT_MASK_RTS2RTS_LAG_TX_PORT_AFFINITY);
    DEVX_SET(rts2rts_qp_in, in, qpc.lag_tx_port_affinity, port_num);
    ret = mlx5dv_devx_qp_modify(qp, in, sizeof(in), out, sizeof(out));
    // ...
}



static int _mlx5dv_modify_qp_udp_sport(struct ibv_qp *qp, uint16_t udp_sport)
{
    // ...
    DEVX_SET(rts2rts_qp_in, in, opcode, MLX5_CMD_OP_RTS2RTS_QP);
    DEVX_SET(rts2rts_qp_in, in, qpn, qp->qp_num);
    DEVX_SET64(rts2rts_qp_in, in, opt_param_mask_95_32,
           MLX5_QPC_OPT_MASK_32_UDP_SPORT);
    DEVX_SET(rts2rts_qp_in, in, qpc.primary_address_path.udp_sport,
         udp_sport);

    ret = mlx5dv_devx_qp_modify(qp, in, sizeof(in), out, sizeof(out));
    // ...
}

适用的QP类型

  • LAG端口修改:支持RAW_PACKET、RC、UC、UD、XRC_SEND和DCI类型的QP
  • UDP源端口修改:仅支持RC和UC类型的QP,并且QP必须处于RTS状态

总结来说,这两个函数虽然都使用底层的QP修改机制,但服务于完全不同的网络功能需求:LAG端口修改关注物理端口的选择和高可用性,而UDP源端口修改关注网络层的负载均衡。

mlx5dv 接口家族

https://github.com/linux-rdma/rdma-core/tree/master/providers/mlx5/man

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------|
| CMakeLists.txt | mlx5: Introduce mlx5dv_get_data_direct_sysfs_path() API | last year |
| mlx5dv.7 | mlx5: Add mlx5dv_is_supported() | 7 years ago |
| mlx5dv_alloc_dm.3.md | mlx5: Add new DM type, encap-sw | 2 years ago |
| mlx5dv_alloc_var.3.md | mlx5: Expose VAR direct verbs | 6 years ago |
| mlx5dv_create_cq.3.md | mlx5: CQE size control | 7 years ago |
| mlx5dv_create_flow.3.md | mlx5: Add support for bulk flow counters in mlx5dv_create_flow | 2 months ago |
| mlx5dv_create_flow_action_modify_header.3.md | mlx5: Fix man page of mlx5dv_create_flow_action_modify_header() | 6 years ago |
| mlx5dv_create_flow_action_packet_reformat.3.md | Fix typos found by lintian | 7 years ago |
| mlx5dv_create_flow_matcher.3.md | mlx5: Extend mlx5dv_create_flow_matcher() to support new flow table t... | 7 months ago |
| mlx5dv_create_mkey.3.md | mlx5: Extend mkey creation to add remote invalidate option | 3 years ago |
| mlx5dv_create_qp.3.md | mlx5: Support OOO RX WQE consumption | 11 months ago |
| mlx5dv_create_steering_anchor.3.md | Fix grammar mistake of "allow doing" | 3 years ago |
| mlx5dv_crypto_login.3.md | mlx5: Add crypto login DV API | 4 years ago |
| mlx5dv_crypto_login_create.3.md | mlx5: Add new crypto login APIs | 3 years ago |
| mlx5dv_dci_stream_id_reset.3.md | mlx5: Add DCS modify QP support | 4 years ago |
| mlx5dv_dek_create.3.md | mlx5: Add support for plaintext DEKs | 3 years ago |
| mlx5dv_devx_alloc_msi_vector.3.md | mlx5: Introduce devx APIs to allocate and free msi vectors | 3 years ago |
| mlx5dv_devx_alloc_uar.3.md | mlx5: Add support for allocating a dedicated NC UAR | 2 years ago |
| mlx5dv_devx_create_cmd_comp.3.md | mlx5: Introduce DEVX API to get async command completion | 7 years ago |
| mlx5dv_devx_create_eq.3.md | mlx5: Update DEVX man pages to describe the EREMOTEIO return code | 3 years ago |
| mlx5dv_devx_create_event_channel.3.md | mlx5: Introduce DEVX APIs to create and destroy asynchronous event ch... | 6 years ago |
| mlx5dv_devx_get_event.3.md | mlx5: Expose DEVX API to read asynchronous event | 6 years ago |
| mlx5dv_devx_obj_modify/mlx5dv_devx_obj_create.3.md | mlx5: Update DEVX man pages to describe the EREMOTEIO return code | 3 years ago |
| mlx5dv_devx_qp_modify.3.md | mlx5: Update DEVX man pages to describe the EREMOTEIO return code | 3 years ago |
| mlx5dv_devx_query_eqn.3.md | mlx5: Add DEVX API to query EQN | 7 years ago |
| mlx5dv_devx_subscribe_devx_event.3.md | mlx5: Introduce DEX APIs to subscribe for asynchronous events | 6 years ago |
| mlx5dv_devx_umem_reg.3.md | mlx5: Support MLX5_IB_ATTR_DEVX_UMEM_REG_DMABUF_FD | 3 years ago |
| mlx5dv_dm_map_op_addr.3.md | mlx5: Add support for operations in memic | 4 years ago |
| mlx5dv_dr_flow.3.md | mlx5: DR, add jump to root dest table | 3 years ago |
| mlx5dv_dump.3.md | mlx5: Add support for dr_domain to the steering dump API | 5 years ago |
| mlx5dv_flow_action_esp.3.md | Fix bad whatis entries in man pages | 7 years ago |
| mlx5dv_get_clock_info.3 | mlx5: Add direct verbs support for query clock info | 8 years ago |
| mlx5dv_get_data_direct_sysfs_path.3.md | mlx5: Introduce mlx5dv_get_data_direct_sysfs_path() API | last year |
| mlx5dv_get_vfio_device_list.3.md | mlx5: Introduce mlx5dv_get_vfio_device_list() | 4 years ago |
| mlx5dv_init_obj.3 | mlx5: Extend mlx5dv_init_obj() API for devx object | last year |
| mlx5dv_is_supported.3.md | mlx5: Add mlx5dv_is_supported() | 7 years ago |
| mlx5dv_map_ah_to_qp.3.md | mlx5: Add a DV API to map between AH to QP | 4 years ago |
| mlx5dv_mkey_check.3.md | mlx5: Enhance the mlx5dv_mkey_check man page | 3 years ago |
| mlx5dv_modify_qp_lag_port.3.md | mlx5: Enable modifying QP's lag tx_affinity port | 5 years ago |
| mlx5dv_modify_qp_sched_elem.3.md | mlx5: Support connect an IB QP to a scheduling element | 5 years ago |
| mlx5dv_modify_qp_udp_sport.3.md | mlx5: Add support for modify UDP source port | 5 years ago |
| mlx5dv_open_device.3.md | mlx5: Add file descriptor array attribute support in mlx5dv_open_device | 7 months ago |
| mlx5dv_pp_alloc.3.md | mlx5: Expose packet pacing DV APIs | 5 years ago |
| mlx5dv_qp_cancel_posted_send_wrs.3.md | mlx5: Allow to cancel posted send work requests | 4 years ago |
| mlx5dv_query_device.3 | mlx5: Expose BlueFlame capability | 4 months ago |
| mlx5dv_query_port.3.md | mlx5: Add a DV query port | 4 years ago |
| mlx5dv_query_qp_lag_port.3.md | mlx5: Enable querying QP's configured and active lag port | 5 years ago |
| mlx5dv_reg_dmabuf_mr.3.md | mlx5: Introduce mlx5dv_reg_dmabuf_mr() API | last year |
| mlx5dv_reserved_qpn_alloc.3.md | mlx5: Add reserved_qpn allocation/deallocation support | 5 years ago |
| mlx5dv_sched_node_create.3.md | mlx5: Add QoS scheduling element support | 5 years ago |
| mlx5dv_ts_to_ns.3 | mlx5: Add direct verb to translate device timestamp to nanoseconds | 8 years ago |
| mlx5dv_vfio_get_events_fd.3.md | mlx5: Introduce vfio APIs to process events | 4 years ago |
| mlx5dv_vfio_process_events.3.md | mlx5: Introduce vfio APIs to process events | 4 years ago |
| mlx5dv_wr_mkey_configure.3.md | mlx5: update mkey configuration doc for readability | 11 months ago |
| mlx5dv_wr_post.3.md | mlx5: Introduce mlx5dv_wr_memcpy builder | 4 years ago |
| mlx5dv_wr_set_mkey_crypto.3.md | mlx5: Add new crypto login APIs | 3 years ago |
| mlx5dv_wr_set_mkey_sig_block.3.md | mlx5: update set_mkey_sig_block doc for readability | 9 months ago |

相关推荐
漫谈网络1 个月前
InfiniBand 深度解析
网络·rdma·infiniband·roce v2
apple_ttt1 个月前
范式革命:RDMA 如何让网络成为 “分布式内存总线”
网络·计算机网络·数据中心·rdma·数据中心网络
apple_ttt1 个月前
InfiniBand技术解析(2):为什么它是高性能计算的 “超级血管”?
网络·rdma·infiniband·异构计算·数据中心网络
tiantianuser4 个月前
RDMA over RoCE V2设计2:系统框架设计考虑
单片机·嵌入式硬件·fpga开发·axi4·rdma·高速传输·roce v2
tiantianuser5 个月前
RDMA简介7之RoCE v2可靠传输
服务器·fpga开发·verilog·xilinx·rdma·可编程逻辑
tiantianuser5 个月前
RDMA简介5之RoCE v2队列
fpga开发·verilog·fpga·rdma·高速传输·rocev2
tiantianuser5 个月前
RDMA简介3之四种子协议对比
verilog·fpga·vivado·rdma·高速传输
m0_594526306 个月前
SPDK NVMe of RDMA 部署
log4j·rdma·spdk
caodongwang6 个月前
【NCCL】transport建立(一)
p2p·rdma·nccl·transport