return rdma_seterrno(ibv_post_send(rs->cm_id->qp, &wr, &bad));
} else {
- /* TODO: adjust sqe_avail and ctrl_avail for extra post */
ret = rs_post_write(rs, sgl, nsge, msg, flags, addr, rkey);
if (!ret)
ret = rs_post_msg(rs, msg);
rs->sseq_no++;
rs->sqe_avail--;
+ if (rs->opts & RS_OPT_MSG_SEND)
+ rs->sqe_avail--;
rs->sbuf_bytes_avail -= length;
addr = rs->target_sgl[rs->target_sge].addr;
rs->sseq_no++;
rs->sqe_avail--;
+ if (rs->opts & RS_OPT_MSG_SEND)
+ rs->sqe_avail--;
rs->sbuf_bytes_avail -= sizeof(struct rs_iomap);
addr = rs->remote_iomap.addr + iomr->index * sizeof(struct rs_iomap);
rs->ctrl_avail--;
rs->rseq_comp = rs->rseq_no + (rs->rq_size >> 1);
if (rs->rbuf_bytes_avail >= (rs->rbuf_size >> 1)) {
+ if (rs->opts & RS_OPT_MSG_SEND)
+ rs->ctrl_avail--;
+
if (!(rs->opts & RS_OPT_SWAP_SGL)) {
sge.addr = (uintptr_t) &rs->rbuf[rs->rbuf_free_offset];
sge.key = rs->rmr->rkey;
static int rs_give_credits(struct rsocket *rs)
{
- return ((rs->rbuf_bytes_avail >= (rs->rbuf_size >> 1)) ||
- ((short) ((short) rs->rseq_no - (short) rs->rseq_comp) >= 0)) &&
- rs->ctrl_avail && (rs->state & rs_connected);
+ if (!(rs->opts & RS_OPT_MSG_SEND)) {
+ return ((rs->rbuf_bytes_avail >= (rs->rbuf_size >> 1)) ||
+ ((short) ((short) rs->rseq_no - (short) rs->rseq_comp) >= 0)) &&
+ rs->ctrl_avail && (rs->state & rs_connected);
+ } else {
+ return ((rs->rbuf_bytes_avail >= (rs->rbuf_size >> 1)) ||
+ ((short) ((short) rs->rseq_no - (short) rs->rseq_comp) >= 0)) &&
+ (rs->ctrl_avail > 1) && (rs->state & rs_connected);
+ }
}
static void rs_update_credits(struct rsocket *rs)