]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
refresh (create temporary patch)
authorSean Hefty <sean.hefty@intel.com>
Thu, 28 Jun 2012 18:19:00 +0000 (11:19 -0700)
committerSean Hefty <sean.hefty@intel.com>
Thu, 28 Jun 2012 18:19:00 +0000 (11:19 -0700)
meta
patches/refresh-temp [new file with mode: 0644]

diff --git a/meta b/meta
index 8ffbf97b10dc7a9575026165434d946deaa94eb7..5c8c4ddef9aa1dbeffec862a98d30b5e24c1e3c1 100644 (file)
--- a/meta
+++ b/meta
@@ -1,9 +1,10 @@
 Version: 1
-Previous: ead3bbda367bf5121379806598c2420007e42e8e
-Head: e676e681549b31596680a5cadb74bc4d9f56af67
+Previous: 64de60ef4649f447a4da2e6fa5b5a0ac4ebaa03d
+Head: e5646b3f279b97c5ebd3ae1c2ab9164a16928989
 Applied:
   rselect: 0680bea236f65373732b82d405787cf979ee5c67
   shut_wr: e676e681549b31596680a5cadb74bc4d9f56af67
+  refresh-temp: e5646b3f279b97c5ebd3ae1c2ab9164a16928989
 Unapplied:
   v6only: 3afce107e2baec86c5541ed0acd992e37bcb992a
   rs-1sge: 8ec392829399dec7ed5c608b8697a482e5faa2de
diff --git a/patches/refresh-temp b/patches/refresh-temp
new file mode 100644 (file)
index 0000000..ce00eb2
--- /dev/null
@@ -0,0 +1,374 @@
+Bottom: af4cc3c64b7827f75b1392c03c0414ad0a869bca
+Top:    1242d5df80aef5749c32bdb6490d768bfdd28ffe
+Author: Sean Hefty <sean.hefty@intel.com>
+Date:   2012-06-28 11:19:00 -0700
+
+Refresh of shut_wr
+
+---
+
+diff --git a/src/rsocket.c b/src/rsocket.c
+index 012bb5e..bdb756f 100644
+--- a/src/rsocket.c
++++ b/src/rsocket.c
+@@ -96,7 +96,8 @@ enum {
+ #define rs_msg_data(imm_data) (imm_data & 0x1FFFFFFF)
+ enum {
+-      RS_CTRL_DISCONNECT
++      RS_CTRL_DISCONNECT,
++      RS_CTRL_SHUTDOWN
+ };
+ struct rs_msg {
+@@ -136,16 +137,20 @@ union rs_wr_id {
+  */
+ enum rs_state {
+       rs_init,
+-      rs_bound,
+-      rs_listening,
+-      rs_resolving_addr,
+-      rs_resolving_route,
+-      rs_connecting,
+-      rs_accepting,
+-      rs_connect_error,
+-      rs_connected,
+-      rs_disconnected,
+-      rs_error
++      rs_bound           =                0x0001,
++      rs_listening       =                0x0002,
++      rs_opening         =                0x0004,
++      rs_resolving_addr  = rs_opening |   0x0010,
++      rs_resolving_route = rs_opening |   0x0020,
++      rs_connecting      = rs_opening |   0x0040,
++      rs_accepting       = rs_opening |   0x0080,
++      rs_connected       =                0x0100,
++      rs_connect_wr      =                0x0200,
++      rs_connect_rd      =                0x0400,
++      rs_connect_rdwr    = rs_connected | rs_connect_rd | rs_connect_wr,
++      rs_connect_error   =                0x0800,
++      rs_disconnected    =                0x1000,
++      rs_error           =                0x2000,
+ };
+ #define RS_OPT_SWAP_SGL 1
+@@ -161,7 +166,7 @@ struct rsocket {
+       long              fd_flags;
+       uint64_t          so_opts;
+       uint64_t          tcp_opts;
+-      enum rs_state     state;
++      int               state;
+       int               cq_armed;
+       int               retries;
+       int               err;
+@@ -320,7 +325,7 @@ static int rs_set_nonblocking(struct rsocket *rs, long arg)
+       if (rs->cm_id->recv_cq_channel)
+               ret = fcntl(rs->cm_id->recv_cq_channel->fd, F_SETFL, arg);
+-      if (!ret && rs->state != rs_connected)
++      if (!ret && rs->state < rs_connected)
+               ret = fcntl(rs->cm_id->channel->fd, F_SETFL, arg);
+       return ret;
+@@ -627,7 +632,7 @@ int raccept(int socket, struct sockaddr *addr, socklen_t *addrlen)
+       rs_set_conn_data(new_rs, &param, &cresp);
+       ret = rdma_accept(new_rs->cm_id, &param);
+       if (!ret)
+-              new_rs->state = rs_connected;
++              new_rs->state = rs_connect_rdwr;
+       else if (errno == EAGAIN || errno == EWOULDBLOCK)
+               new_rs->state = rs_accepting;
+       else
+@@ -714,7 +719,7 @@ connected:
+               }
+               rs_save_conn_data(rs, cresp);
+-              rs->state = rs_connected;
++              rs->state = rs_connect_rdwr;
+               break;
+       case rs_accepting:
+               if (!(rs->fd_flags & O_NONBLOCK))
+@@ -724,7 +729,7 @@ connected:
+               if (ret)
+                       break;
+-              rs->state = rs_connected;
++              rs->state = rs_connect_rdwr;
+               break;
+       default:
+               ret = ERR(EINVAL);
+@@ -751,6 +756,13 @@ int rconnect(int socket, const struct sockaddr *addr, socklen_t addrlen)
+       return rs_do_connect(rs);
+ }
++static void rs_shutdown_state(struct rsocket *rs, int state)
++{
++      rs->state &= ~state;
++      if (rs->state == rs_connected)
++              rs->state = rs_disconnected;
++}
++
+ static int rs_post_write(struct rsocket *rs, uint64_t wr_id,
+                        struct ibv_sge *sgl, int nsge,
+                        uint32_t imm_data, int flags,
+@@ -851,7 +863,7 @@ 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);
++             rs->ctrl_avail && (rs->state & rs_connected);
+ }
+ static void rs_update_credits(struct rsocket *rs)
+@@ -881,7 +893,9 @@ static int rs_poll_cq(struct rsocket *rs)
+                       case RS_OP_CTRL:
+                               if (rs_msg_data(imm_data) == RS_CTRL_DISCONNECT) {
+                                       rs->state = rs_disconnected;
+-                                      return ERR(ECONNRESET);
++                                      return 0;
++                              } else if (rs_msg_data(imm_data) == RS_CTRL_SHUTDOWN) {
++                                      rs_shutdown_state(rs, rs_connect_rd);
+                               }
+                               break;
+                       default:
+@@ -899,14 +913,14 @@ static int rs_poll_cq(struct rsocket *rs)
+                       } else {
+                               rs->ctrl_avail++;
+                       }
+-                      if (wc.status != IBV_WC_SUCCESS && rs->state == rs_connected) {
++                      if (wc.status != IBV_WC_SUCCESS && (rs->state & rs_connected)) {
+                               rs->state = rs_error;
+                               rs->err = EIO;
+                       }
+               }
+       }
+-      if (rs->state == rs_connected) {
++      if (rs->state & rs_connected) {
+               while (!ret && rcnt--)
+                       ret = rdma_post_recvv(rs->cm_id, NULL, NULL, 0);
+@@ -931,7 +945,7 @@ static int rs_get_cq_event(struct rsocket *rs)
+       if (!ret) {
+               ibv_ack_cq_events(rs->cm_id->recv_cq, 1);
+               rs->cq_armed = 0;
+-      } else if (errno != EAGAIN && rs->state == rs_connected) {
++      } else if (errno != EAGAIN) {
+               rs->state = rs_error;
+       }
+@@ -1042,7 +1056,7 @@ static int rs_can_send(struct rsocket *rs)
+ static int rs_conn_can_send(struct rsocket *rs)
+ {
+-      return rs_can_send(rs) || (rs->state != rs_connected);
++      return rs_can_send(rs) || !(rs->state & rs_connect_wr);
+ }
+ static int rs_can_send_ctrl(struct rsocket *rs)
+@@ -1057,7 +1071,7 @@ static int rs_have_rdata(struct rsocket *rs)
+ static int rs_conn_have_rdata(struct rsocket *rs)
+ {
+-      return rs_have_rdata(rs) || (rs->state != rs_connected);
++      return rs_have_rdata(rs) || !(rs->state & rs_connect_rd);
+ }
+ static int rs_all_sends_done(struct rsocket *rs)
+@@ -1110,7 +1124,7 @@ ssize_t rrecv(int socket, void *buf, size_t len, int flags)
+       int ret;
+       rs = idm_at(&idm, socket);
+-      if (rs->state < rs_connected) {
++      if (rs->state & rs_opening) {
+               ret = rs_do_connect(rs);
+               if (ret) {
+                       if (errno == EINPROGRESS)
+@@ -1121,7 +1135,7 @@ ssize_t rrecv(int socket, void *buf, size_t len, int flags)
+       fastlock_acquire(&rs->rlock);
+       if (!rs_have_rdata(rs)) {
+               ret = rs_get_comp(rs, rs_nonblocking(rs, flags), rs_conn_have_rdata);
+-              if (ret && errno != ECONNRESET)
++              if (ret)
+                       goto out;
+       }
+@@ -1212,7 +1226,7 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags)
+       int ret = 0;
+       rs = idm_at(&idm, socket);
+-      if (rs->state < rs_connected) {
++      if (rs->state & rs_opening) {
+               ret = rs_do_connect(rs);
+               if (ret) {
+                       if (errno == EINPROGRESS)
+@@ -1228,7 +1242,7 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags)
+                                         rs_conn_can_send);
+                       if (ret)
+                               break;
+-                      if (rs->state != rs_connected) {
++                      if (!(rs->state & rs_connect_wr)) {
+                               ret = ERR(ECONNRESET);
+                               break;
+                       }
+@@ -1321,7 +1335,7 @@ static ssize_t rsendv(int socket, const struct iovec *iov, int iovcnt, int flags
+       int i, ret = 0;
+       rs = idm_at(&idm, socket);
+-      if (rs->state < rs_connected) {
++      if (rs->state & rs_opening) {
+               ret = rs_do_connect(rs);
+               if (ret) {
+                       if (errno == EINPROGRESS)
+@@ -1342,7 +1356,7 @@ static ssize_t rsendv(int socket, const struct iovec *iov, int iovcnt, int flags
+                                         rs_conn_can_send);
+                       if (ret)
+                               break;
+-                      if (rs->state != rs_connected) {
++                      if (!(rs->state & rs_connect_wr)) {
+                               ret = ERR(ECONNRESET);
+                               break;
+                       }
+@@ -1434,17 +1448,35 @@ static int rs_poll_rs(struct rsocket *rs, int events,
+       short revents;
+       int ret;
+-      switch (rs->state) {
+-      case rs_listening:
++check_cq:
++      if ((rs->state & rs_connected) || (rs->state == rs_disconnected) ||
++          (rs->state & rs_error)) {
++              rs_process_cq(rs, nonblock, test);
++
++              revents = 0;
++              if ((events & POLLIN) && rs_conn_have_rdata(rs))
++                      revents |= POLLIN;
++              if ((events & POLLOUT) && rs_can_send(rs))
++                      revents |= POLLOUT;
++              if (!(rs->state & rs_connected)) {
++                      if (rs->state == rs_disconnected)
++                              revents |= POLLHUP;
++                      else
++                              revents |= POLLERR;
++              }
++
++              return revents;
++      }
++
++      if (rs->state == rs_listening) {
+               fds.fd = rs->cm_id->channel->fd;
+               fds.events = events;
+               fds.revents = 0;
+               poll(&fds, 1, 0);
+               return fds.revents;
+-      case rs_resolving_addr:
+-      case rs_resolving_route:
+-      case rs_connecting:
+-      case rs_accepting:
++      }
++
++      if (rs->state & rs_opening) {
+               ret = rs_do_connect(rs);
+               if (ret) {
+                       if (errno == EINPROGRESS) {
+@@ -1454,28 +1486,13 @@ static int rs_poll_rs(struct rsocket *rs, int events,
+                               return POLLOUT;
+                       }
+               }
+-              /* fall through */
+-      case rs_connected:
+-      case rs_disconnected:
+-      case rs_error:
+-              rs_process_cq(rs, nonblock, test);
+-
+-              revents = 0;
+-              if ((events & POLLIN) && rs_have_rdata(rs))
+-                      revents |= POLLIN;
+-              if ((events & POLLOUT) && rs_can_send(rs))
+-                      revents |= POLLOUT;
+-              if (rs->state == rs_disconnected)
+-                      revents |= POLLHUP;
+-              else if (rs->state == rs_error)
+-                      revents |= POLLERR;
++              goto check_cq;
++      }
+-              return revents;
+-      case rs_connect_error:
++      if (rs->state == rs_connect_error)
+               return (rs->err && events & POLLOUT) ? POLLOUT : 0;
+-      default:
+-              return 0;
+-      }
++
++      return 0;
+ }
+ static int rs_poll_check(struct pollfd *fds, nfds_t nfds)
+@@ -1687,14 +1704,26 @@ int rselect(int nfds, fd_set *readfds, fd_set *writefds,
+ int rshutdown(int socket, int how)
+ {
+       struct rsocket *rs;
+-      int ret = 0;
++      int ctrl, ret = 0;
+       rs = idm_at(&idm, socket);
++      if (how == SHUT_RD) {
++              rs_shutdown_state(rs, rs_connect_rd);
++              return 0;
++      }
++
+       if (rs->fd_flags & O_NONBLOCK)
+               rs_set_nonblocking(rs, 0);
+-      if (rs->state == rs_connected) {
+-              rs->state = rs_disconnected;
++      if (rs->state & rs_connected) {
++              if (how == SHUT_RDWR) {
++                      ctrl = RS_CTRL_DISCONNECT;
++                      rs->state = rs_disconnected;
++              } else {
++                      rs_shutdown_state(rs, rs_connect_wr);
++                      ctrl = (rs->state & rs_connected) ?
++                              RS_CTRL_SHUTDOWN : RS_CTRL_DISCONNECT;
++              }
+               if (!rs_can_send_ctrl(rs)) {
+                       ret = rs_process_cq(rs, 0, rs_can_send_ctrl);
+                       if (ret)
+@@ -1703,13 +1732,16 @@ int rshutdown(int socket, int how)
+               rs->ctrl_avail--;
+               ret = rs_post_write(rs, 0, NULL, 0,
+-                                  rs_msg_set(RS_OP_CTRL, RS_CTRL_DISCONNECT),
++                                  rs_msg_set(RS_OP_CTRL, ctrl),
+                                   0, 0, 0);
+       }
+-      if (!rs_all_sends_done(rs) && rs->state != rs_error)
++      if (!rs_all_sends_done(rs) && !(rs->state & rs_error))
+               rs_process_cq(rs, 0, rs_all_sends_done);
++      if ((rs->fd_flags & O_NONBLOCK) && (rs->state & rs_connected))
++              rs_set_nonblocking(rs, 1);
++
+       return 0;
+ }
+@@ -1718,7 +1750,7 @@ int rclose(int socket)
+       struct rsocket *rs;
+       rs = idm_at(&idm, socket);
+-      if (rs->state == rs_connected)
++      if (rs->state & rs_connected)
+               rshutdown(socket, SHUT_RDWR);
+       rs_free(rs);
+@@ -1818,7 +1850,7 @@ int rsetsockopt(int socket, int level, int optname,
+               }
+               break;
+       case SOL_RDMA:
+-              if (rs->state > rs_listening) {
++              if (rs->state >= rs_opening) {
+                       ret = ERR(EINVAL);
+                       break;
+               }