From: Sean Hefty Date: Mon, 13 Aug 2012 21:43:11 +0000 (-0700) Subject: refresh X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=bd7621ca65d728dce64ea11197d2c3cedd35672f;p=~shefty%2Flibrdmacm.git refresh --- diff --git a/meta b/meta index e85d4850..831c4b3d 100644 --- a/meta +++ b/meta @@ -1,12 +1,11 @@ Version: 1 -Previous: 00af8cc96d50146cc6767fbbf0e9cc0161d3180a -Head: a1b220168dfcc2cf8faf7a7b85ca0e614c5d6bf6 +Previous: 853536fe56092678f43e8004889f171b8b97257a +Head: 9f41de8f49824b574067c97a6cd00b13f3e11e16 Applied: real-close: 3409f8d6af187d25c63a5d1f8ee8bff5f14555e2 dup2: ca5813e7cf95dee5933fc417e4a34d26f2b01824 oobinline: ac51c1095f505373a6ec54b8f1d990259fb34d97 - fork-connect: 88050a624781407f5f83e4494897bb1dd482699c - refresh-temp: a1b220168dfcc2cf8faf7a7b85ca0e614c5d6bf6 + fork-connect: 9f41de8f49824b574067c97a6cd00b13f3e11e16 Unapplied: dbg-out: 04273ee712db4d53efb390462c1b738bb54a57df fstat: a62c653906870422edef5f6388dac9f76c953e35 diff --git a/patches/fork-connect b/patches/fork-connect index 1ad0be4d..138ea962 100644 --- a/patches/fork-connect +++ b/patches/fork-connect @@ -1,5 +1,5 @@ Bottom: 3ea2748a5c41b11a2e7033c56bddd938d2770b6c -Top: da811bd45f316fb30abd2a28fca7900d8b0f8de6 +Top: e5851de376df609d0644456f8a89570a86a723f0 Author: Sean Hefty Date: 2012-08-10 21:44:39 -0700 @@ -28,7 +28,7 @@ Signed-off-by: Sean Hefty --- diff --git a/src/preload.c b/src/preload.c -index b18d310..b4c319f 100644 +index b18d310..2830f14 100644 --- a/src/preload.c +++ b/src/preload.c @@ -99,12 +99,20 @@ static int fork_support; @@ -162,7 +162,7 @@ index b18d310..b4c319f 100644 return index; } else { return real.accept(fd, addr, addrlen); -@@ -453,8 +486,7 @@ int accept(int socket, struct sockaddr *addr, socklen_t *addrlen) +@@ -453,35 +486,49 @@ 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 @@ -170,30 +170,103 @@ index b18d310..b4c319f 100644 - * 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) +-static int fork_active(int socket, const struct sockaddr *addr, socklen_t addrlen) ++static void fork_active(int socket) { -@@ -465,13 +497,16 @@ 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); +- 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); - ret = real.connect(fd, addr, addrlen); -- if (ret) -- return ret; ++ 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) +- return ret; ++ goto err1; - ret = real.recv(fd, &msg, sizeof msg, MSG_PEEK); - if ((ret != sizeof msg) || msg) { +- ret = real.recv(fd, &msg, sizeof msg, MSG_PEEK); +- if ((ret != sizeof msg) || msg) { - fd_store(socket, fd, fd_normal); -+ fd_store(socket, fd, fd_normal, fd_ready); - return 0; +- 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) +@@ -492,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); +@@ -510,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; } -@@ -544,7 +579,7 @@ static void fork_passive(int socket) +@@ -527,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; + +@@ -537,14 +584,11 @@ static void fork_passive(int socket) + goto lclose; + } + +- param = 1; +- rsetsockopt(dfd, IPPROTO_TCP, TCP_NODELAY, ¶m, sizeof param); + set_rsocket_options(dfd); +- copysockopts(dfd, sfd, &rs, &real); real.shutdown(sfd, SHUT_RDWR); real.close(sfd); @@ -202,7 +275,7 @@ index b18d310..b4c319f 100644 lclose: rclose(lfd); -@@ -553,7 +588,7 @@ sclose: +@@ -553,7 +597,7 @@ sclose: sem_close(sem); out: if (ret) @@ -211,7 +284,7 @@ index b18d310..b4c319f 100644 } static inline enum fd_type fd_fork_get(int index, int *fd) -@@ -562,8 +597,10 @@ static inline enum fd_type fd_fork_get(int index, int *fd) +@@ -562,8 +606,10 @@ static inline enum fd_type fd_fork_get(int index, int *fd) fdi = idm_lookup(&idm, index); if (fdi) { @@ -223,7 +296,7 @@ index b18d310..b4c319f 100644 *fd = fdi->fd; return fdi->type; -@@ -576,11 +613,9 @@ static inline enum fd_type fd_fork_get(int index, int *fd) +@@ -576,11 +622,9 @@ 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; @@ -237,7 +310,7 @@ index b18d310..b4c319f 100644 ret = rconnect(fd, addr, addrlen); if (!ret || errno == EINPROGRESS) return ret; -@@ -591,9 +626,12 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen) +@@ -591,9 +635,12 @@ int connect(int socket, const struct sockaddr *addr, socklen_t addrlen) rclose(fd); fd = ret; @@ -245,10 +318,10 @@ index b18d310..b4c319f 100644 - default: - break; + } 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); } diff --git a/patches/refresh-temp b/patches/refresh-temp deleted file mode 100644 index 9ae5fc2f..00000000 --- a/patches/refresh-temp +++ /dev/null @@ -1,134 +0,0 @@ -Bottom: da811bd45f316fb30abd2a28fca7900d8b0f8de6 -Top: e5851de376df609d0644456f8a89570a86a723f0 -Author: Sean Hefty -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, ¶m, 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); - }