]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
refresh (create temporary patch)
authorSean Hefty <sean.hefty@intel.com>
Mon, 13 Aug 2012 21:43:11 +0000 (14:43 -0700)
committerSean Hefty <sean.hefty@intel.com>
Mon, 13 Aug 2012 21:43:11 +0000 (14:43 -0700)
meta
patches/refresh-temp [new file with mode: 0644]

diff --git a/meta b/meta
index 686ceb63bc2245d0f954bf72aca41dcfcf1a4aaf..e85d4850ba82719936ea743c32a2cab70be0033a 100644 (file)
--- a/meta
+++ b/meta
@@ -1,11 +1,12 @@
 Version: 1
-Previous: d63ea5ece0312cdddcb9e1e8b072bf6166beb535
-Head: 88050a624781407f5f83e4494897bb1dd482699c
+Previous: 00af8cc96d50146cc6767fbbf0e9cc0161d3180a
+Head: a1b220168dfcc2cf8faf7a7b85ca0e614c5d6bf6
 Applied:
   real-close: 3409f8d6af187d25c63a5d1f8ee8bff5f14555e2
   dup2: ca5813e7cf95dee5933fc417e4a34d26f2b01824
   oobinline: ac51c1095f505373a6ec54b8f1d990259fb34d97
   fork-connect: 88050a624781407f5f83e4494897bb1dd482699c
+  refresh-temp: a1b220168dfcc2cf8faf7a7b85ca0e614c5d6bf6
 Unapplied:
   dbg-out: 04273ee712db4d53efb390462c1b738bb54a57df
   fstat: a62c653906870422edef5f6388dac9f76c953e35
diff --git a/patches/refresh-temp b/patches/refresh-temp
new file mode 100644 (file)
index 0000000..9ae5fc2
--- /dev/null
@@ -0,0 +1,134 @@
+Bottom: da811bd45f316fb30abd2a28fca7900d8b0f8de6
+Top:    e5851de376df609d0644456f8a89570a86a723f0
+Author: Sean Hefty <sean.hefty@intel.com>
+Date:   2012-08-13 14:43:11 -0700
+
+Refresh of fork-connect
+
+---
+
+diff --git a/src/preload.c b/src/preload.c
+index b4c319f..2830f14 100644
+--- a/src/preload.c
++++ b/src/preload.c
+@@ -488,35 +488,47 @@ int accept(int socket, struct sockaddr *addr, socklen_t *addrlen)
+  * fork.  To do this, we delay establishing the RDMA connection until we try
+  * to send/receive on the server side.
+  */
+-static int fork_active(int socket, const struct sockaddr *addr, socklen_t addrlen)
++static void fork_active(int socket)
+ {
+-      int fd, ret;
++      struct sockaddr_storage addr;
++      int sfd, dfd, ret;
++      socklen_t len;
+       uint32_t msg;
+       long flags;
+-      fd = fd_getd(socket);
+-      flags = real.fcntl(fd, F_GETFL);
+-      real.fcntl(fd, F_SETFL, 0);
++      sfd = fd_getd(socket);
+-      if (!(flags & O_NONBLOCK) && addr && addrlen) {
+-              ret = real.connect(fd, addr, addrlen);
+-              if (ret)
+-                      return ret;
+-      }
++      len = sizeof addr;
++      ret = real.getpeername(sfd, (struct sockaddr *) &addr, &len);
++      if (ret)
++              goto err1;
+-      ret = real.recv(fd, &msg, sizeof msg, MSG_PEEK);
+-      if ((ret != sizeof msg) || msg) {
+-              fd_store(socket, fd, fd_normal, fd_ready);
+-              return 0;
+-      }
++      dfd = rsocket(addr.ss_family, SOCK_STREAM, 0);
++      if (dfd < 0)
++              goto err1;
+-      real.fcntl(fd, F_SETFL, flags);
+-      ret = transpose_socket(socket, fd_rsocket);
+-      if (ret < 0)
+-              return ret;
++      flags = real.fcntl(sfd, F_GETFL);
++      real.fcntl(sfd, F_SETFL, 0);
++      ret = real.recv(sfd, &msg, sizeof msg, MSG_PEEK);
++      real.fcntl(sfd, F_SETFL, flags);
++      if ((ret != sizeof msg) || msg)
++              goto err2;
+-      real.close(fd);
+-      return rconnect(ret, addr, addrlen);
++      ret = rconnect(ret, &sin6, len);
++      if (ret)
++              goto err2;
++
++      set_rsocket_options(dfd);
++      copysockopts(dfd, sfd, &rs, &real);
++      real.shutdown(sfd, SHUT_RDWR);
++      real.close(sfd);
++      fd_store(socket, dfd, fd_rsocket, fd_ready);
++      return;
++
++err2:
++      rclose(dfd);
++err1:
++      fd_store(socket, sfd, fd_normal, fd_ready);
+ }
+ static void fork_passive(int socket)
+@@ -527,7 +539,7 @@ static void fork_passive(int socket)
+       socklen_t len;
+       uint32_t msg;
+-      fd_get(socket, &sfd);
++      sfd = fd_getd(socket);
+       len = sizeof sin6;
+       ret = real.getsockname(sfd, (struct sockaddr *) &sin6, &len);
+@@ -545,7 +557,7 @@ static void fork_passive(int socket)
+       lfd = rsocket(sin6.sin6_family, SOCK_STREAM, 0);
+       if (lfd < 0) {
+-              ret  = lfd;
++              ret = lfd;
+               goto sclose;
+       }
+@@ -562,7 +574,7 @@ static void fork_passive(int socket)
+               goto lclose;
+       msg = 0;
+-      len = real.write(sfd, &msg, sizeof msg);
++      len = real.send(sfd, &msg, sizeof msg, MSG_NODELAY);
+       if (len != sizeof msg)
+               goto lclose;
+@@ -572,10 +584,7 @@ static void fork_passive(int socket)
+               goto lclose;
+       }
+-      param = 1;
+-      rsetsockopt(dfd, IPPROTO_TCP, TCP_NODELAY, &param, sizeof param);
+       set_rsocket_options(dfd);
+-
+       copysockopts(dfd, sfd, &rs, &real);
+       real.shutdown(sfd, SHUT_RDWR);
+       real.close(sfd);
+@@ -627,10 +636,10 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen)
+               rclose(fd);
+               fd = ret;
+       } else if (fd_gets(socket) == fd_fork) {
+-              flags = real.fcntl(fd, F_GETFL);
+-              if (!(flags & O_NONBLOCK))
+-                      return fork_active(socket, addr, addrlen);
+-
++//            flags = real.fcntl(fd, F_GETFL);
++//            if (!(flags & O_NONBLOCK))
++//                    return fork_active(socket, addr, addrlen);
++//
+               fd_store(socket, fd, fd_normal, fd_fork_active);
+       }