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

diff --git a/meta b/meta
index e1dc3e50da24c00f26883a77ff9491a2bd4d0593..50367c899bcc28c02b7f2c83c1dd5d1e9b552d0e 100644 (file)
--- a/meta
+++ b/meta
@@ -1,11 +1,12 @@
 Version: 1
-Previous: f1b0b772fe7fe9a44c0ea2f6606fb6f0071dd7d7
-Head: 0b26f0861db82da1458125921f1a6cf57d438ab8
+Previous: e509b95526999096b8bf1109f9e745ef761d107e
+Head: 2f33e3b27447a71889836a14329da06ed5adca65
 Applied:
   real-close: 3409f8d6af187d25c63a5d1f8ee8bff5f14555e2
   dup2: ca5813e7cf95dee5933fc417e4a34d26f2b01824
   oobinline: ac51c1095f505373a6ec54b8f1d990259fb34d97
   fork-connect: 0b26f0861db82da1458125921f1a6cf57d438ab8
+  refresh-temp: 2f33e3b27447a71889836a14329da06ed5adca65
 Unapplied:
   dbg-out: 04273ee712db4d53efb390462c1b738bb54a57df
   fstat: a62c653906870422edef5f6388dac9f76c953e35
diff --git a/patches/refresh-temp b/patches/refresh-temp
new file mode 100644 (file)
index 0000000..67ad2a0
--- /dev/null
@@ -0,0 +1,75 @@
+Bottom: 64baa18c546931a07eef988a8d6bdef26a73feab
+Top:    8e79723d04b7d3effe0d91fe456426c68892b6bb
+Author: Sean Hefty <sean.hefty@intel.com>
+Date:   2012-08-10 22:26:38 -0700
+
+Refresh of fork-connect
+
+---
+
+diff --git a/src/preload.c b/src/preload.c
+index e5d3fcb..9bc6c13 100644
+--- a/src/preload.c
++++ b/src/preload.c
+@@ -486,8 +486,7 @@ int accept(int socket, struct sockaddr *addr, socklen_t *addrlen)
+  * We can't fork RDMA connections and pass them from the parent to the child
+  * process.  Instead, we need to establish the RDMA connection after calling
+  * fork.  To do this, we delay establishing the RDMA connection until we try
+- * to send/receive on the server side.  On the client side, we don't expect
+- * to fork, so we switch from a TCP connection to an rsocket when connecting.
++ * to send/receive on the server side.
+  */
+ static int fork_active(int socket, const struct sockaddr *addr, socklen_t addrlen)
+ {
+@@ -498,9 +497,12 @@ static int fork_active(int socket, const struct sockaddr *addr, socklen_t addrle
+       fd = fd_getd(socket);
+       flags = real.fcntl(fd, F_GETFL);
+       real.fcntl(fd, F_SETFL, 0);
+-      ret = real.connect(fd, addr, addrlen);
+-      if (ret)
+-              return ret;
++
++      if (!(flags & O_NONBLOCK)) {
++              ret = real.connect(fd, addr, addrlen);
++              if (ret)
++                      return ret;
++      }
+       ret = real.recv(fd, &msg, sizeof msg, MSG_PEEK);
+       if ((ret != sizeof msg) || msg) {
+@@ -598,7 +600,7 @@ static inline enum fd_type fd_fork_get(int index, int *fd)
+               if (fdi->type == fd_fork_passive)
+                       fork_passive(index);
+               else if (fdi->type == fd_fork_active)
+-                      fork_active(index);
++                      fork_active(index); /* NEED addr, addrlen */
+               *fd = fdi->fd;
+               return fdi->type;
+@@ -611,6 +613,7 @@ static inline enum fd_type fd_fork_get(int index, int *fd)
+ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen)
+ {
+       int fd, ret;
++      long flags;
+       if (fd_get(socket, &fd) == fd_rsocket) {
+               ret = rconnect(fd, addr, addrlen);
+@@ -623,10 +626,15 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen)
+               rclose(fd);
+               fd = ret;
+-      } else {
+-              /* Set state to fork_active if nonblocking.  if blocking fork_active */
+-              return real.connect(fd, addr, addrlen);
++      } else if (fd_gets(socket) == fd_fork) {
++              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);
+       }
++
++      return real.connect(fd, addr, addrlen);
+ }
+ ssize_t recv(int socket, void *buf, size_t len, int flags)