From 03f60aaed54dd5ac00976eb47bea09919931a235 Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Sun, 14 Apr 2013 09:52:05 -0700 Subject: [PATCH] Refresh of rs-iwarp --- src/rsocket.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/rsocket.c b/src/rsocket.c index f9c31cd4..79aa53b0 100644 --- a/src/rsocket.c +++ b/src/rsocket.c @@ -1597,7 +1597,6 @@ static int rs_post_write_msg(struct rsocket *rs, 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); @@ -1636,6 +1635,8 @@ static int rs_write_data(struct rsocket *rs, 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; @@ -1673,6 +1674,8 @@ static int rs_write_iomap(struct rsocket *rs, struct rs_iomap_mr *iomr, 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); @@ -1694,6 +1697,9 @@ static void rs_send_credits(struct rsocket *rs) 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; @@ -1728,9 +1734,15 @@ static void rs_send_credits(struct rsocket *rs) 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) -- 2.41.0