当前位置: 首页 > news >正文

【RDMA】mlx5dev mlx5dv_devx 接口

目录

mlx5dev和mlx5dv_devx的关系

mlx5dev

mlx5dv_devx

mlx5dv_modify_qp_lag_port 和 mlx5dv_modify_qp_udp_sport 的区别是?

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 源端口号。

技术实现区别

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

http://www.dtcms.com/a/548616.html

相关文章:

  • 【墨铺网教程】一台电脑加入多个局域网,让电脑做上传下载主力又当存储盘
  • 变身智能车载台,AORO P9000U三防平板赋能工业数字化升级
  • 安全登录多人共用的机密电脑:基于动态凭证与会话隔离的解决方案
  • 全球首款卷轴屏电脑发布!ToDesk+扩展屏成平替方案
  • 在Lua用luasql-sqlite3库访问SQLite数据库
  • 代码随想录第51 52天 | 图论-岛屿问题汇总
  • 分布式存储:Ceph、GlusterFS、MinIO架构与部署
  • 机械外协加工网最新订单移动网站如何优化排名
  • 11 种方法解决小米/米手机无法通过 USB 连接电脑的问题
  • Ubuntu:设置程序开机自启动
  • 化妆品品牌网站如何做wordpress pdf文章
  • vue 网站导航栏
  • 如何提高 IPA 安全性 多工具组合打造可复用的 iOS 加固与反编译防护体系(IPA 安全 iOS 加固 无源码混淆 Ipa Guard 实战)
  • 上海市工程建设交易中心网站深圳公司广告片制作
  • FreeRTOS 学习:(三)HAL库、标准库 和 FreeRTOS 的关联性,简述
  • 使用 Tauri + Rust 构建跨平台桌面应用:前端技术的新边界
  • 如何录屏?【图文详解】免费录屏软件?电脑如何录屏?电脑怎么录屏?
  • 深入Rust:Box、Rc、Arc智能指针机制解析与实践指南
  • 【项目实践】公寓租赁项目(十):基于SpringBoot登录管理接口开发
  • Java1030 abstract 继承
  • 第六部分:VTK进阶(第180章 重采样与插值)
  • 聊城做网站推广哪家好android sdk
  • 时间序列早期分类中的置信度累积问题:从ECE-C到时序依赖建模
  • Rust + WebAssembly + Svelte + TypeScript + Zod 全栈开发深度指南
  • 【android bluetooth 协议分析 18】【PBAP详解 2】【车机为何不显示电话号码为空的联系人信息】
  • MacPro2012升级Monterey终极解决方案
  • 软件项目管理工具
  • Actix Web适合什么类型的Web应用?可以部署 Java 或 .NET 的应用程序?
  • Android PDF 操作 - AndroidPdfViewer 弹出框显示 PDF
  • 做新零售这些注册网站和找货源6内蒙古网站建设流程