]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
refresh
authorSean Hefty <sean.hefty@intel.com>
Sat, 13 Apr 2013 19:22:55 +0000 (12:22 -0700)
committerSean Hefty <sean.hefty@intel.com>
Sat, 13 Apr 2013 19:22:55 +0000 (12:22 -0700)
meta
patches/refresh-temp [deleted file]
patches/rs-iwarp

diff --git a/meta b/meta
index 142ae73487752b3f4785c4df7ef5cc95d734da0d..950797bc4243d1dd2be3a6b57ccfef9cb787b5ff 100644 (file)
--- a/meta
+++ b/meta
@@ -1,10 +1,9 @@
 Version: 1
-Previous: 8e9f4e919d8a5b2c897f79bf679b2f3098e35cf1
-Head: a4d1c071e5f69a269ae028c53cd2d5c8330886f4
+Previous: 4976584233e3548176f96305eeabc62d9494ffa8
+Head: 62723583607b2e94b9dbc54f4c7a9e651dd088e5
 Applied:
   rs_wrid: 0d6ca1300d88377ae7f9162457e64c541a4630eb
-  rs-iwarp: df52fcc2a58ab1921e8c965cc3385e387bfd9004
-  refresh-temp: a4d1c071e5f69a269ae028c53cd2d5c8330886f4
+  rs-iwarp: 62723583607b2e94b9dbc54f4c7a9e651dd088e5
 Unapplied:
   clisvr: 0db572abcf3d78374a5ea0f91b709136948809cc
   af_ib: e755d041f218772a8323936176c8f10e2024ae0f
diff --git a/patches/refresh-temp b/patches/refresh-temp
deleted file mode 100644 (file)
index 464ea3c..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-Bottom: cb13e6cd851f8f4575498a9c544ff53a15b46db6
-Top:    a44edddc396d1994c73398a43b9fef91c0a5125f
-Author: Sean Hefty <sean.hefty@intel.com>
-Date:   2013-04-13 12:22:55 -0700
-
-Refresh of rs-iwarp
-
----
-
-diff --git a/src/rsocket.c b/src/rsocket.c
-index de15f58..4b3505a 100644
---- a/src/rsocket.c
-+++ b/src/rsocket.c
-@@ -123,6 +123,7 @@ enum {
- #define rs_msg_set(op, data)  ((op << 29) | (uint32_t) (data))
- #define rs_msg_op(imm_data)   (imm_data >> 29)
- #define rs_msg_data(imm_data) (imm_data & 0x1FFFFFFF)
-+#define RS_MSG_SIZE         sizeof(uint32_t)
- #define RS_WR_ID_FLAG_RECV (((uint64_t) 1) << 63)
- #define rs_send_wr_id(data) ((uint64_t) data)
-@@ -751,24 +752,22 @@ static inline int rs_post_recv(struct rsocket *rs)
-       struct ibv_recv_wr wr, *bad;
-       struct ibv_sge sge;
--      wr.wr_id = rs_recv_wr_id(0);
-       wr.next = NULL;
-       if (!(rs->opts & RS_OPT_MSG_SEND)) {
-+              wr.wr_id = rs_recv_wr_id(0);
-               wr.sg_list = NULL;
-               wr.num_sge = 0;
-       } else {
-+              wr.wr_id = rs_recv_wr_id(rs->rbuf_msg_index);
-               sge.addr = (uintptr_t) rs->rbuf + rs->rbuf_size +
-                          (rs->rbuf_msg_index * RS_MSG_SIZE);
--              sge.length = sizeof(uint32_t);
-+              sge.length = RS_MSG_SIZE;
-               sge.lkey = rs->rmr->lkey;
-               wr.sg_list = &sge;
-               wr.num_sge = 1;
-               if(++rs->rbuf_msg_index == rs->rq_size)
-                       rs->rbuf_msg_index = 0;
--              /* TODO we need wr_id to reference back to receive buffer, so we can
--               * retrieve the incoming message from the buffer
--               */
-       }
-       return rdma_seterrno(ibv_post_recv(rs->cm_id->qp, &wr, &bad));
-@@ -800,7 +799,7 @@ static int rs_create_ep(struct rsocket *rs)
-       int i, ret;
-       rs_set_qp_size(rs);
--      if (rs->cm_id->context->device->transport_type == IBV_TRANSPORT_IWARP)
-+      if (rs->cm_id->verbs->device->transport_type == IBV_TRANSPORT_IWARP)
-               rs->opts |= RS_OPT_MSG_SEND;
-       ret = rs_init_bufs(rs);
-       if (ret)
-@@ -1535,6 +1534,21 @@ int rconnect(int socket, const struct sockaddr *addr, socklen_t addrlen)
-       return ret;
- }
-+/*
-+TODO:
-+if MSG_SEND opt is set
-+      if !sgl
-+              post send with imm_data inline
-+      else
-+              post rdma write
-+              pst send with imm_data inline
-+else
-+      existing code flow - rdma write with immediate
-+
-+post_write - rdma write only
-+post msg - immediate data or send only
-+post write msg - rdma write with msg (imm or send after)
-+*/
- static int rs_post_write_msg(struct rsocket *rs,
-                        struct ibv_sge *sgl, int nsge,
-                        uint32_t imm_data, int flags,
-@@ -1555,6 +1569,29 @@ static int rs_post_write_msg(struct rsocket *rs,
-       return rdma_seterrno(ibv_post_send(rs->cm_id->qp, &wr, &bad));
- }
-+static int rs_post_msg(struct rsocket *rs, uint32_t msg)
-+{
-+      struct ibv_send_wr wr, *bad;
-+      struct ibv_sge sge;
-+
-+      wr.wr_id = rs_send_wr_id(msg);
-+      wr.next = NULL;
-+      if (rs->opts & RS_OPT_MSG_SEND) {
-+              wr.sg_list = &sge;
-+              wr.num_sge = 1;
-+              wr.opcode = IBV_WR_SEND;
-+              wr.send_flags = IBV_SEND_INLINE;
-+      } else {
-+              wr.sg_list = NULL;
-+              wr.num_sge = 0;
-+              wr.opcode = IBV_WR_RDMA_WRITE_WITH_IMM;
-+              wr.send_flags = flags;
-+              wr.imm_data = htonl(imm_data);
-+      }
-+
-+      return rdma_seterrno(ibv_post_send(rs->cm_id->qp, &wr, &bad));
-+}
-+
- static int rs_post_write(struct rsocket *rs,
-                        struct ibv_sge *sgl, int nsge,
-                        uint32_t wr_data, int flags,
-@@ -1713,7 +1750,7 @@ static void rs_update_credits(struct rsocket *rs)
- static int rs_poll_cq(struct rsocket *rs)
- {
-       struct ibv_wc wc;
--      uint32_t imm_data;
-+      uint32_t msg;
-       int ret, rcnt = 0;
-       while ((ret = ibv_poll_cq(rs->cm_id->recv_cq, 1, &wc)) > 0) {
-@@ -1722,19 +1759,25 @@ static int rs_poll_cq(struct rsocket *rs)
-                               continue;
-                       rcnt++;
--                      imm_data = ntohl(wc.imm_data);
--                      switch (rs_msg_op(imm_data)) {
-+                      if (wc.wc_flags & IBV_WC_WITH_IMM) {
-+                              msg = ntohl(wc.imm_data);
-+                      } else {
-+                              msg = ((uint32_t *) rs->rbuf + rs->rbuf_size)
-+                                      [rs_wr_data(wc.wr_id)];
-+
-+                      }
-+                      switch (rs_msg_op(msg)) {
-                       case RS_OP_SGL:
--                              rs->sseq_comp = (uint16_t) rs_msg_data(imm_data);
-+                              rs->sseq_comp = (uint16_t) rs_msg_data(msg);
-                               break;
-                       case RS_OP_IOMAP_SGL:
-                               /* The iomap was updated, that's nice to know. */
-                               break;
-                       case RS_OP_CTRL:
--                              if (rs_msg_data(imm_data) == RS_CTRL_DISCONNECT) {
-+                              if (rs_msg_data(msg) == RS_CTRL_DISCONNECT) {
-                                       rs->state = rs_disconnected;
-                                       return 0;
--                              } else if (rs_msg_data(imm_data) == RS_CTRL_SHUTDOWN) {
-+                              } else if (rs_msg_data(msg) == RS_CTRL_SHUTDOWN) {
-                                       rs->state &= ~rs_readable;
-                               }
-                               break;
-@@ -1742,8 +1785,8 @@ static int rs_poll_cq(struct rsocket *rs)
-                               /* We really shouldn't be here. */
-                               break;
-                       default:
--                              rs->rmsg[rs->rmsg_tail].op = rs_msg_op(imm_data);
--                              rs->rmsg[rs->rmsg_tail].data = rs_msg_data(imm_data);
-+                              rs->rmsg[rs->rmsg_tail].op = rs_msg_op(msg);
-+                              rs->rmsg[rs->rmsg_tail].data = rs_msg_data(msg);
-                               if (++rs->rmsg_tail == rs->rq_size + 1)
-                                       rs->rmsg_tail = 0;
-                               break;
-@@ -2064,6 +2107,11 @@ static int rs_poll_all(struct rsocket *rs)
-  */
- static int rs_can_send(struct rsocket *rs)
- {
-+      if (rs->opts & RS_OPT_MSG_SEND) {
-+              return (rs->sqe_avail >= 2) && (rs->sbuf_bytes_avail >= RS_SNDLOWAT) &&
-+                     (rs->sseq_no != rs->sseq_comp) &&
-+                     (rs->target_sgl[rs->target_sge].length != 0);
-+      }
-       return rs->sqe_avail && (rs->sbuf_bytes_avail >= RS_SNDLOWAT) &&
-              (rs->sseq_no != rs->sseq_comp) &&
-              (rs->target_sgl[rs->target_sge].length != 0);
index 4fa2a102ed2596a2f1fe35162a910659f0e86873..590dbffedf6f1a6a9479fd89446033287e265574 100644 (file)
@@ -1,5 +1,5 @@
 Bottom: e8c026d3862906d30200710fcc27654d4fb2d580
-Top:    cb13e6cd851f8f4575498a9c544ff53a15b46db6
+Top:    a44edddc396d1994c73398a43b9fef91c0a5125f
 Author: Sean Hefty <sean.hefty@intel.com>
 Date:   2013-04-11 10:05:29 -0700
 
@@ -15,10 +15,18 @@ Signed-off-by: Sean Hefty <sean.hefty@intel.com>
 ---
 
 diff --git a/src/rsocket.c b/src/rsocket.c
-index ca77116..de15f58 100644
+index ca77116..4b3505a 100644
 --- a/src/rsocket.c
 +++ b/src/rsocket.c
-@@ -207,7 +207,12 @@ enum rs_state {
+@@ -123,6 +123,7 @@ enum {
+ #define rs_msg_set(op, data)  ((op << 29) | (uint32_t) (data))
+ #define rs_msg_op(imm_data)   (imm_data >> 29)
+ #define rs_msg_data(imm_data) (imm_data & 0x1FFFFFFF)
++#define RS_MSG_SIZE         sizeof(uint32_t)
+ #define RS_WR_ID_FLAG_RECV (((uint64_t) 1) << 63)
+ #define rs_send_wr_id(data) ((uint64_t) data)
+@@ -207,7 +208,12 @@ enum rs_state {
        rs_error           =                0x2000,
  };
  
@@ -32,7 +40,7 @@ index ca77116..de15f58 100644
  
  union socket_addr {
        struct sockaddr         sa;
-@@ -284,6 +289,7 @@ struct rsocket {
+@@ -284,6 +290,7 @@ struct rsocket {
                        volatile struct rs_sge    *target_sgl;
                        struct rs_iomap   *target_iomap;
  
@@ -40,7 +48,7 @@ index ca77116..de15f58 100644
                        int               rbuf_bytes_avail;
                        int               rbuf_free_offset;
                        int               rbuf_offset;
-@@ -635,6 +641,7 @@ static void ds_set_qp_size(struct rsocket *rs)
+@@ -635,6 +642,7 @@ static void ds_set_qp_size(struct rsocket *rs)
  
  static int rs_init_bufs(struct rsocket *rs)
  {
@@ -48,7 +56,7 @@ index ca77116..de15f58 100644
        size_t len;
  
        rs->rmsg = calloc(rs->rq_size + 1, sizeof(*rs->rmsg));
-@@ -664,11 +671,14 @@ static int rs_init_bufs(struct rsocket *rs)
+@@ -664,11 +672,14 @@ static int rs_init_bufs(struct rsocket *rs)
        if (rs->target_iomap_size)
                rs->target_iomap = (struct rs_iomap *) (rs->target_sgl + RS_SGL_SIZE);
  
@@ -65,7 +73,7 @@ index ca77116..de15f58 100644
        if (!rs->rmr)
                return -1;
  
-@@ -685,8 +695,7 @@ static int rs_init_bufs(struct rsocket *rs)
+@@ -685,8 +696,7 @@ static int rs_init_bufs(struct rsocket *rs)
  
  static int ds_init_bufs(struct ds_qp *qp)
  {
@@ -75,42 +83,156 @@ index ca77116..de15f58 100644
        if (!qp->rbuf)
                return ERR(ENOMEM);
  
-@@ -740,11 +749,27 @@ err1:
+@@ -740,11 +750,25 @@ err1:
  static inline int rs_post_recv(struct rsocket *rs)
  {
        struct ibv_recv_wr wr, *bad;
 +      struct ibv_sge sge;
  
-       wr.wr_id = rs_recv_wr_id(0);
+-      wr.wr_id = rs_recv_wr_id(0);
        wr.next = NULL;
 -      wr.sg_list = NULL;
 -      wr.num_sge = 0;
 +      if (!(rs->opts & RS_OPT_MSG_SEND)) {
++              wr.wr_id = rs_recv_wr_id(0);
 +              wr.sg_list = NULL;
 +              wr.num_sge = 0;
 +      } else {
++              wr.wr_id = rs_recv_wr_id(rs->rbuf_msg_index);
 +              sge.addr = (uintptr_t) rs->rbuf + rs->rbuf_size +
 +                         (rs->rbuf_msg_index * RS_MSG_SIZE);
-+              sge.length = sizeof(uint32_t);
++              sge.length = RS_MSG_SIZE;
 +              sge.lkey = rs->rmr->lkey;
 +
 +              wr.sg_list = &sge;
 +              wr.num_sge = 1;
 +              if(++rs->rbuf_msg_index == rs->rq_size)
 +                      rs->rbuf_msg_index = 0;
-+              /* TODO we need wr_id to reference back to receive buffer, so we can
-+               * retrieve the incoming message from the buffer
-+               */
 +      }
  
        return rdma_seterrno(ibv_post_recv(rs->cm_id->qp, &wr, &bad));
  }
-@@ -775,6 +800,8 @@ static int rs_create_ep(struct rsocket *rs)
+@@ -775,6 +799,8 @@ static int rs_create_ep(struct rsocket *rs)
        int i, ret;
  
        rs_set_qp_size(rs);
-+      if (rs->cm_id->context->device->transport_type == IBV_TRANSPORT_IWARP)
++      if (rs->cm_id->verbs->device->transport_type == IBV_TRANSPORT_IWARP)
 +              rs->opts |= RS_OPT_MSG_SEND;
        ret = rs_init_bufs(rs);
        if (ret)
                return ret;
+@@ -1508,6 +1534,21 @@ int rconnect(int socket, const struct sockaddr *addr, socklen_t addrlen)
+       return ret;
+ }
++/*
++TODO:
++if MSG_SEND opt is set
++      if !sgl
++              post send with imm_data inline
++      else
++              post rdma write
++              pst send with imm_data inline
++else
++      existing code flow - rdma write with immediate
++
++post_write - rdma write only
++post msg - immediate data or send only
++post write msg - rdma write with msg (imm or send after)
++*/
+ static int rs_post_write_msg(struct rsocket *rs,
+                        struct ibv_sge *sgl, int nsge,
+                        uint32_t imm_data, int flags,
+@@ -1528,6 +1569,29 @@ static int rs_post_write_msg(struct rsocket *rs,
+       return rdma_seterrno(ibv_post_send(rs->cm_id->qp, &wr, &bad));
+ }
++static int rs_post_msg(struct rsocket *rs, uint32_t msg)
++{
++      struct ibv_send_wr wr, *bad;
++      struct ibv_sge sge;
++
++      wr.wr_id = rs_send_wr_id(msg);
++      wr.next = NULL;
++      if (rs->opts & RS_OPT_MSG_SEND) {
++              wr.sg_list = &sge;
++              wr.num_sge = 1;
++              wr.opcode = IBV_WR_SEND;
++              wr.send_flags = IBV_SEND_INLINE;
++      } else {
++              wr.sg_list = NULL;
++              wr.num_sge = 0;
++              wr.opcode = IBV_WR_RDMA_WRITE_WITH_IMM;
++              wr.send_flags = flags;
++              wr.imm_data = htonl(imm_data);
++      }
++
++      return rdma_seterrno(ibv_post_send(rs->cm_id->qp, &wr, &bad));
++}
++
+ static int rs_post_write(struct rsocket *rs,
+                        struct ibv_sge *sgl, int nsge,
+                        uint32_t wr_data, int flags,
+@@ -1686,7 +1750,7 @@ static void rs_update_credits(struct rsocket *rs)
+ static int rs_poll_cq(struct rsocket *rs)
+ {
+       struct ibv_wc wc;
+-      uint32_t imm_data;
++      uint32_t msg;
+       int ret, rcnt = 0;
+       while ((ret = ibv_poll_cq(rs->cm_id->recv_cq, 1, &wc)) > 0) {
+@@ -1695,19 +1759,25 @@ static int rs_poll_cq(struct rsocket *rs)
+                               continue;
+                       rcnt++;
+-                      imm_data = ntohl(wc.imm_data);
+-                      switch (rs_msg_op(imm_data)) {
++                      if (wc.wc_flags & IBV_WC_WITH_IMM) {
++                              msg = ntohl(wc.imm_data);
++                      } else {
++                              msg = ((uint32_t *) rs->rbuf + rs->rbuf_size)
++                                      [rs_wr_data(wc.wr_id)];
++
++                      }
++                      switch (rs_msg_op(msg)) {
+                       case RS_OP_SGL:
+-                              rs->sseq_comp = (uint16_t) rs_msg_data(imm_data);
++                              rs->sseq_comp = (uint16_t) rs_msg_data(msg);
+                               break;
+                       case RS_OP_IOMAP_SGL:
+                               /* The iomap was updated, that's nice to know. */
+                               break;
+                       case RS_OP_CTRL:
+-                              if (rs_msg_data(imm_data) == RS_CTRL_DISCONNECT) {
++                              if (rs_msg_data(msg) == RS_CTRL_DISCONNECT) {
+                                       rs->state = rs_disconnected;
+                                       return 0;
+-                              } else if (rs_msg_data(imm_data) == RS_CTRL_SHUTDOWN) {
++                              } else if (rs_msg_data(msg) == RS_CTRL_SHUTDOWN) {
+                                       rs->state &= ~rs_readable;
+                               }
+                               break;
+@@ -1715,8 +1785,8 @@ static int rs_poll_cq(struct rsocket *rs)
+                               /* We really shouldn't be here. */
+                               break;
+                       default:
+-                              rs->rmsg[rs->rmsg_tail].op = rs_msg_op(imm_data);
+-                              rs->rmsg[rs->rmsg_tail].data = rs_msg_data(imm_data);
++                              rs->rmsg[rs->rmsg_tail].op = rs_msg_op(msg);
++                              rs->rmsg[rs->rmsg_tail].data = rs_msg_data(msg);
+                               if (++rs->rmsg_tail == rs->rq_size + 1)
+                                       rs->rmsg_tail = 0;
+                               break;
+@@ -2037,6 +2107,11 @@ static int rs_poll_all(struct rsocket *rs)
+  */
+ static int rs_can_send(struct rsocket *rs)
+ {
++      if (rs->opts & RS_OPT_MSG_SEND) {
++              return (rs->sqe_avail >= 2) && (rs->sbuf_bytes_avail >= RS_SNDLOWAT) &&
++                     (rs->sseq_no != rs->sseq_comp) &&
++                     (rs->target_sgl[rs->target_sge].length != 0);
++      }
+       return rs->sqe_avail && (rs->sbuf_bytes_avail >= RS_SNDLOWAT) &&
+              (rs->sseq_no != rs->sseq_comp) &&
+              (rs->target_sgl[rs->target_sge].length != 0);