阅读源码的时候,发现一些陌生 api,如ibv_wr_send。搜索后才发现是一些dev的api
/ testing / libibverbs-dev / ibv_wr_send(3)
源文:ibv_wr_send(3) — libibverbs-dev — Debian testing — Debian Manpages
描述
verbs API (ibv_wr_*) 允许使用函数调用而不是基于结构的 ibv_post_send() 方案将工作高效地发布到发送队列。这种方法旨在最大限度地减少发布过程中的 CPU 分支和锁定。
此 API 旨在用于访问 ibv_post_send() 提供的功能之外的其他功能。
ibv_post_send() 的 WR 批次和此 API WR 批次可以交织在一起,只要它们不在彼此的关键区域内发布。 (此 API 中的一个关键区由 ibv_wr_start() 和 ibv_wr_complete()/ibv_wr_abort() 界定)
用法
要使用这些 API,必须使用 ibv_create_qp_ex() 创建 QP,它允许在 comp_mask 中设置 IBV_QP_INIT_ATTR_SEND_OPS_FLAGS。 send_ops_flags 应设置为将发布到 QP 的工作请求类型的 OR。
如果 QP 不支持所有请求的工作请求类型,则 QP 创建将失败。
向 QP 发布工作请求是在 ibv_wr_start() 和 ibv_wr_complete()/ibv_wr_abort() 形成的关键区域内完成的(参见下面的 CONCURRENCY)。
每个工作请求都是通过调用 WR 构建器函数(请参阅下面的表列 WR 构建器)来开始创建工作请求,然后是下面描述的允许/必需的 setter 函数来创建的。
可以多次调用 WR builder 和 setter 组合以在单个关键区域内有效地发布多个工作请求。
每个 WR builder 都会使用 struct ibv_qp_ex 的 wr_id 成员来设置完成中要返回的值。某些操作还将使用 wr_flags 成员来影响操作(请参阅下面的标志)。这些值
qpx->wr_id = 1;
ibv_wr_send(qpx);
ibv_wr_set_sge(qpx, lkey, &data, sizeof(data));
工作请求部分详细描述了各种 WR 构建器和设置器。
发布工作通过调用 ibv_wr_complete() 或 ibv_wr_abort() 完成。在 ibv_wr_complete() 返回成功之前,不会对队列执行任何工作。 ibv_wr_abort() 将丢弃自 ibv_wr_start() 以来准备的所有工作。
WORK REQUESTS
Operation | WR builder | QP Type Supported | setters |
ATOMIC_CMP_AND_SWP | ibv_wr_atomic_cmp_swp() | RC, XRC_SEND | DATA, QP |
ATOMIC_FETCH_AND_ADD | ibv_wr_atomic_fetch_add() | RC, XRC_SEND | DATA, QP |
BIND_MW | ibv_wr_bind_mw() | UC, RC, XRC_SEND | NONE |
LOCAL_INV | ibv_wr_local_inv() | UC, RC, XRC_SEND | NONE |
RDMA_READ | ibv_wr_rdma_read() | RC, XRC_SEND | DATA, QP |
RDMA_WRITE | ibv_wr_rdma_write() | UC, RC, XRC_SEND | DATA, QP |
RDMA_WRITE_WITH_IMM | ibv_wr_rdma_write_imm() | UC, RC, XRC_SEND | DATA, QP |
SEND | ibv_wr_send() | UD, UC, RC, XRC_SEND, RAW_PACKET | DATA, QP |
SEND_WITH_IMM | ibv_wr_send_imm() | UD, UC, RC, SRC SEND | DATA, QP |
SEND_WITH_INV | ibv_wr_send_inv() | UC, RC, XRC_SEND | DATA, QP |
TSO | ibv_wr_send_ts |