]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
Refresh of rs-iwarp
authorSean Hefty <sean.hefty@intel.com>
Sun, 14 Apr 2013 16:52:05 +0000 (09:52 -0700)
committerSean Hefty <sean.hefty@intel.com>
Sun, 14 Apr 2013 16:52:05 +0000 (09:52 -0700)
src/rsocket.c

index f9c31cd42233e3bdf699ec95213f3b7bf53315bf..79aa53b0d21533e4896b20f6be2c84685868a882 100644 (file)
@@ -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)