私は、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 と等しいため、転送は成功したと思います。私は何か間違ったことをしましたか?