From 9079801a64f2313e2d48a27b87b285d7a267a56a Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Tue, 21 Aug 2012 13:49:59 -0700 Subject: [PATCH] debug fork issue --- src/preload.c | 12 +++++++++++- src/rsocket.c | 9 +++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/preload.c b/src/preload.c index 0645f6dd..b5a67cb7 100644 --- a/src/preload.c +++ b/src/preload.c @@ -34,6 +34,7 @@ #if HAVE_CONFIG_H # include #endif /* HAVE_CONFIG_H */ +#include #include #include @@ -239,7 +240,7 @@ void getenv_options(void) if (var) sq_inline = atoi(var); - var = getenv("RDMAV_FORK_SAFE"); + var = getenv("RS_FORK_SUPPORT"); if (var) fork_support = atoi(var); } @@ -413,11 +414,14 @@ int socket(int domain, int type, int protocol) return index; recursive = 1; +printf("skipping rsocket call\n"); +goto realsock; ret = rsocket(domain, type, protocol); recursive = 0; if (ret >= 0) { if (fork_support) { rclose(ret); +realsock: ret = real.socket(domain, type, protocol); if (ret < 0) return ret; @@ -502,6 +506,7 @@ static void fork_active(int socket) uint32_t msg; long flags; + printf("fork_active\n"); sfd = fd_getd(socket); flags = real.fcntl(sfd, F_GETFL); @@ -516,10 +521,12 @@ static void fork_active(int socket) if (ret) goto err1; + printf("fork_active - create rsocket\n"); dfd = rsocket(addr.ss_family, SOCK_STREAM, 0); if (dfd < 0) goto err1; + printf("fork_active - rconnect\n"); ret = rconnect(dfd, (struct sockaddr *) &addr, len); if (ret) goto err2; @@ -551,6 +558,7 @@ static void fork_passive(int socket) socklen_t len; uint32_t msg; + printf("fork_passive\n"); sfd = fd_getd(socket); len = sizeof sin6; @@ -566,6 +574,7 @@ static void fork_passive(int socket) ret = -1; goto out; } + printf("fork_passive - create rsocket\n"); lfd = rsocket(sin6.sin6_family, SOCK_STREAM, 0); if (lfd < 0) { @@ -589,6 +598,7 @@ static void fork_passive(int socket) len = real.write(sfd, &msg, sizeof msg); if (len != sizeof msg) goto lclose; + printf("fork_passive - raccept\n"); dfd = raccept(lfd, NULL, NULL); if (dfd < 0) { diff --git a/src/rsocket.c b/src/rsocket.c index 4c4821bc..52476a27 100644 --- a/src/rsocket.c +++ b/src/rsocket.c @@ -156,6 +156,10 @@ struct rsocket { fastlock_t cq_lock; fastlock_t cq_wait_lock; + struct rs_msg last_ctrl; + uint64_t bytes_sent; + uint64_t bytes_received; + int opts; long fd_flags; uint64_t so_opts; @@ -816,6 +820,7 @@ static void rs_send_credits(struct rsocket *rs) rs->ctrl_avail--; rs->rseq_comp = rs->rseq_no + (rs->rq_size >> 1); + rs->last_ctrl.op = rs->rseq_no + rs->rq_size; if (rs->rbuf_bytes_avail >= (rs->rbuf_size >> 1)) { if (!(rs->opts & RS_OPT_SWAP_SGL)) { sge.addr = (uintptr_t) &rs->rbuf[rs->rbuf_free_offset]; @@ -830,6 +835,7 @@ static void rs_send_credits(struct rsocket *rs) ibsge.addr = (uintptr_t) &sge; ibsge.lkey = 0; ibsge.length = sizeof(sge); + rs->last_ctrl.data = sge.length; rs_post_write(rs, &ibsge, 1, rs_msg_set(RS_OP_SGL, rs->rseq_no + rs->rq_size), @@ -845,6 +851,7 @@ static void rs_send_credits(struct rsocket *rs) if (++rs->remote_sge == rs->remote_sgl.length) rs->remote_sge = 0; } else { + rs->last_ctrl.data = 0; rs_post_write(rs, NULL, 0, rs_msg_set(RS_OP_SGL, rs->rseq_no + rs->rq_size), 0, 0, 0); } @@ -1173,6 +1180,7 @@ ssize_t rrecv(int socket, void *buf, size_t len, int flags) } while (left && (flags & MSG_WAITALL) && (rs->state & rs_connect_rd)); + rs->bytes_received += (len - left); fastlock_release(&rs->rlock); return ret ? ret : len - left; } @@ -1289,6 +1297,7 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags) if (ret) break; } + rs->bytes_sent += (len - left); fastlock_release(&rs->slock); return (ret && left == len) ? ret : len - left; -- 2.45.2