From: Sean Hefty Date: Wed, 18 Jul 2012 16:01:43 +0000 (-0700) Subject: debug fork X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=e6682f3bb964b36c9f5ae12d52d1ff369bf6d0b1;p=~shefty%2Flibrdmacm.git debug fork --- diff --git a/src/preload.c b/src/preload.c index f824af3f..e429ad60 100644 --- a/src/preload.c +++ b/src/preload.c @@ -48,6 +48,7 @@ #include #include #include +#include #include #include @@ -467,14 +468,17 @@ static int connect_fork(int socket, const struct sockaddr *addr, socklen_t addrl uint32_t msg; long flags; + printf("connect_fork\n"); fd = fd_getd(socket); flags = real.fcntl(fd, F_GETFL); real.fcntl(fd, F_SETFL, 0); ret = real.connect(fd, addr, addrlen); + printf("connect_fork - real connect %d %s\n", ret, strerror(errno)); if (ret) return ret; ret = real.recv(fd, &msg, sizeof msg, MSG_PEEK); + printf("connect_fork - real recv %d msg %d\n", ret, msg); if ((ret != sizeof msg) || msg) { fd_store(socket, fd, fd_normal); return 0; @@ -482,6 +486,7 @@ static int connect_fork(int socket, const struct sockaddr *addr, socklen_t addrl real.fcntl(fd, F_SETFL, flags); ret = transpose_socket(socket, fd_rsocket); + printf("connect_fork - transpose socket %d\n", ret); if (ret < 0) return ret; @@ -834,11 +839,15 @@ pid_t fork(void) uint32_t msg; init_preload(); + printf("fork\n"); pid = real.fork(); + printf("fork - pid %d fork_support %d last_accept %d \n", + pid, fork_support, last_accept); if (pid || !fork_support || (last_accept < 0) || (fd_get(last_accept, &sfd) != fd_fork)) goto out; + printf("fork - switching to rsocket\n"); len = sizeof sin6; ret = real.getsockname(sfd, (struct sockaddr *) &sin6, &len); if (ret) @@ -846,33 +855,42 @@ pid_t fork(void) sin6.sin6_flowinfo = sin6.sin6_scope_id = 0; memset(&sin6.sin6_addr, 0, sizeof sin6.sin6_addr); + sem_unlink("/rsocket_fork"); sem = sem_open("/rsocket_fork", O_CREAT | O_RDWR, S_IRWXU | S_IRWXG, 1); + printf("fork - sem_open\n"); + printf("fork - sem value %d\n", sem_getvalue(sem, &ret)); if (sem == SEM_FAILED) goto out; lfd = rsocket(sin6.sin6_family, SOCK_STREAM, 0); + printf("fork - rsocket %d\n", lfd); if (lfd < 0) goto sclose; param = 1; rsetsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, ¶m, sizeof param); + printf("fork - waiting for semaphore\n"); sem_wait(sem); ret = rbind(lfd, (struct sockaddr *) &sin6, sizeof sin6); + printf("fork - rbind %d\n", ret); if (ret) goto lclose; ret = rlisten(lfd, 1); + printf("fork - rlisten %d\n", ret); if (ret) goto lclose; msg = 0; ret = real.write(sfd, &msg, sizeof msg); + printf("fork - real write %d\n", ret); if (ret != sizeof msg) goto lclose; dfd = raccept(lfd, NULL, NULL); + printf("fork - raccept %d %s\n", dfd, strerror(errno)); if (dfd < 0) goto lclose; diff --git a/src/rsocket.c b/src/rsocket.c index ed125b3b..68361f56 100644 --- a/src/rsocket.c +++ b/src/rsocket.c @@ -425,10 +425,12 @@ static int rs_create_ep(struct rsocket *rs) rs_set_qp_size(rs); ret = rs_init_bufs(rs); + printf("rs create ep init bufs %d\n", ret); if (ret) return ret; ret = rs_create_cq(rs); + printf("rs create ep - create cq %d\n", ret); if (ret) return ret; @@ -445,6 +447,7 @@ static int rs_create_ep(struct rsocket *rs) qp_attr.cap.max_inline_data = rs->sq_inline; ret = rdma_create_qp(rs->cm_id, NULL, &qp_attr); + printf("rs create ep - create qp %d\n", ret); if (ret) return ret; @@ -602,16 +605,19 @@ int raccept(int socket, struct sockaddr *addr, socklen_t *addrlen) struct rs_conn_data *creq, cresp; int ret; + printf("raccept %d\n", socket); rs = idm_at(&idm, socket); new_rs = rs_alloc(rs); if (!new_rs) return ERR(ENOMEM); ret = rdma_get_request(rs->cm_id, &new_rs->cm_id); + printf("raccept get request %d\n", ret); if (ret) goto err; ret = rs_insert(new_rs); + printf("raccept insert %d\n", ret); if (ret < 0) goto err; @@ -625,6 +631,7 @@ int raccept(int socket, struct sockaddr *addr, socklen_t *addrlen) rs_set_nonblocking(new_rs, O_NONBLOCK); ret = rs_create_ep(new_rs); + printf("raccept create ep %d\n", ret); if (ret) goto err; @@ -632,6 +639,7 @@ int raccept(int socket, struct sockaddr *addr, socklen_t *addrlen) param = new_rs->cm_id->event->param.conn; rs_set_conn_data(new_rs, ¶m, &cresp); ret = rdma_accept(new_rs->cm_id, ¶m); + printf("raccept rdma accept %d\n", ret); if (!ret) new_rs->state = rs_connect_rdwr; else if (errno == EAGAIN || errno == EWOULDBLOCK)