我是在 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。我做错什么了吗?