0

我是在 Mellanox Infiniband 硬件上玩 RDMA 的 Infiniband/RDMA 新手。我在这里使用了源代码。乍一看,程序运行很正常:服务器使用 RDMA_WRITE 操作将一些字节写入客户端内存。但是,我后来发现,写入完成结构(ibv_wc)表示的传输字节数与我放入ibv_send_wr结构的数据量不匹配。这是 rdma_write() 中 ibv_send_wr 初始化的代码:

ctx->sge_list.addr = (uintptr_t)ctx->buf;
ctx->sge_list.length = ctx->size; //which is 65536
ctx->sge_list.lkey = ctx->mr->lkey;
ctx->wr.wr.rdma.remote_addr = data->remote_connection->vaddr;
ctx->wr.wr_id = RDMA_WRID;
ctx->wr.sg_list = &ctx->sge_list;
ctx->wr_num_sge = 1;
ctx->wr.opcode = IBV_WR_RDMA_WRITE;
ctx->wr.send_flags = IBV_SEND_SIGNALED;
ctx->wr.next = NULL;

然后我在写完成队列中得到一个写完成条目后读取 ibv_wc.byte_len 。它显示随机数:32537、32743、32533。我假设传输成功,因为 ibv_wc.status 等于 IBV_WC_SUCCESS。我做错什么了吗?

4

1 回答 1

0

根据RDMAMojo博客上的ibv_poll_cq()页面,该字段仅对一小部分操作有效,因此在发送队列上的 RDMA 写操作的情况下,该字段未初始化。byte_len

byte_len:传输的字节数。与传入发送或 RDMA 写入的接收队列与立即操作相关。该值不包括直接数据的长度(如果存在)。与 RDMA 读取和原子操作的发送队列相关。

于 2015-10-06T06:12:35.783 回答