关于IBV_WR_RDMA_WRITE_WITH_IMM的理解

rdma-post_send这篇文章当中关于这个opcode是IBV_WR_RDMA_WRITE_WITH_IMM的描述是这样的:
IBV_WR_RDMA_WRITE_WITH_IMM -
Same as IBV_WR_RDMA_WRITE, but Receive Request will be consumed from the head of remote QP’s Receive Queue and immediate data will be sent in the message. This value will be available in the Work Completion that will be generated for the consumed Receive Request in the remote QP。

主要区别点有两个,这个是对于接收端而言。
(1)需要下发post_recv,但是下发是post_recv当中的sge的地址可以是空,sge个数可以是0。

    wr.sg_list = NULL;
    wr.num_sge = 0;

(2)可以带即时数据,

wr.imm_data = htonl(len);

并且poll_cq时,有返回,在这篇文章当中对于poll_cq时,
对于IBV_WC_RECV_RDMA_WITH_IMM的描述是这样的,也就是说并不需要sge,所以下发的sge,可以是NULL,个数可以是0。
rdma-poll_cq
IBV_WC_RECV_RDMA_WITH_IMM - RDMA with immediate for a WR that was posted to a Receive Queue (of a QP or to an SRQ). For this opcode, only a Receive Request was consumed and the sg_list of this RR wasn’t used

代码,验证。伪代码,实际的rkey和addr已经通过socket交换。
client

void chat()
{
    memcpy(ib_res.buf, MSG_WRITE, sizeof(MSG_WRITE));
    printf("client: %ld, %d\n", remote_key.remote_addr, remote_key.rkey);
	post_send_write_imm(remote_key, BUFFER_SIZE);
	wait_completions(READ_WRID); //IBV_WC_RDMA_WRITE
}

server

void chat()
{
    post_recv(BUFFER_SIZE);
	wait_completions(RECV_WRID);//IBV_WC_RECV_RDMA_WITH_IMM
    printf("%s\n", (char*)ib_res.buf);
}

报文格式:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值