From: Sean Hefty Date: Tue, 26 Jun 2012 23:39:40 +0000 (-0700) Subject: refresh X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=1826e9bcc6c3d13793c49012fe8b9b5cddaca5dd;p=~shefty%2Flibrdmacm.git refresh --- diff --git a/meta b/meta index 6b6efad4..5d7dec51 100644 --- a/meta +++ b/meta @@ -1,11 +1,10 @@ Version: 1 -Previous: 846d8392cdd17070222deba9a593d819525f94f8 -Head: ee6157aea4612de8e15bf5cb91e48d97eb884f63 +Previous: fa7ae7d3fd0ce1718b97fd90d97e4f6baaff2ec6 +Head: 1b1163ede00a5161a9790cbc1e23cf15737dc2e3 Applied: v6only: 36dbcc6dd62fc62a0bb8bc3cc82869eb4242fd4f rselect: 1fdb8dc1bff60f2748e148a081aae55b7fa80034 - shut_wr: b2e126ceaf31025bbd15a22f4abc0fb22d21d4ab - refresh-temp: ee6157aea4612de8e15bf5cb91e48d97eb884f63 + shut_wr: 1b1163ede00a5161a9790cbc1e23cf15737dc2e3 Unapplied: rs-1sge: 8ec392829399dec7ed5c608b8697a482e5faa2de ip6-opt: 7e43a759255e9890d1e41f1edf71792836f53941 diff --git a/patches/refresh-temp b/patches/refresh-temp deleted file mode 100644 index 55e4b25e..00000000 --- a/patches/refresh-temp +++ /dev/null @@ -1,287 +0,0 @@ -Bottom: 2ddb5fbcef7548a1d1c87870ef237d187fba4f30 -Top: 628bde79ad910c1eec4036abc1f102ef7b304bc8 -Author: Sean Hefty -Date: 2012-06-26 16:39:39 -0700 - -Refresh of shut_wr - ---- - -diff --git a/src/rsocket.c b/src/rsocket.c -index 5dfec0b..8e8a9d9 100644 ---- a/src/rsocket.c -+++ b/src/rsocket.c -@@ -96,7 +96,8 @@ enum { - #define rs_msg_data(imm_data) (imm_data & 0x1FFFFFFF) - - enum { -- RS_CTRL_DISCONNECT -+ RS_CTRL_DISCONNECT, -+ RS_CTRL_SHUTDOWN - }; - - struct rs_msg { -@@ -131,6 +132,9 @@ union rs_wr_id { - }; - }; - -+/* -+ * rsocket states are ordered as passive, connecting, connected, disconnected. -+ */ - enum rs_state { - rs_init, - rs_bound = 0x0001, -@@ -143,9 +147,9 @@ enum rs_state { - rs_connected = 0x0100, - rs_connect_wr = rs_connected | 0x0200, - rs_connect_rd = rs_connected | 0x0400, -- rs_disconnected = 0x0800, -- rs_error = 0x1000, -- rs_connect_error = rs_error | 0x2000 -+ rs_connect_error = 0x0800, -+ rs_disconnected = 0x1000, -+ rs_error = 0x2000, - }; - - #define RS_OPT_SWAP_SGL 1 -@@ -701,9 +705,9 @@ do_connect: - if (!ret) - goto connected; - if (errno == EAGAIN || errno == EWOULDBLOCK) -- rs->state = rs_active_connect; -+ rs->state = rs_connecting; - break; -- case rs_active_connect: -+ case rs_connecting: - ret = ucma_complete(rs->cm_id); - if (ret) - break; -@@ -852,7 +856,7 @@ static int rs_give_credits(struct rsocket *rs) - { - return ((rs->rbuf_bytes_avail >= (rs->rbuf_size >> 1)) || - ((short) ((short) rs->rseq_no - (short) rs->rseq_comp) >= 0)) && -- rs->ctrl_avail && (rs->state == rs_connected); -+ rs->ctrl_avail && (rs->state & rs_connected); - } - - static void rs_update_credits(struct rsocket *rs) -@@ -900,14 +904,14 @@ static int rs_poll_cq(struct rsocket *rs) - } else { - rs->ctrl_avail++; - } -- if (wc.status != IBV_WC_SUCCESS && rs->state == rs_connected) { -+ if (wc.status != IBV_WC_SUCCESS && (rs->state & rs_connected)) { - rs->state = rs_error; - rs->err = EIO; - } - } - } - -- if (rs->state != rs_error) { -+ if (rs->state & rs_connected) { - while (!ret && rcnt--) - ret = rdma_post_recvv(rs->cm_id, NULL, NULL, 0); - -@@ -1043,7 +1047,7 @@ static int rs_can_send(struct rsocket *rs) - - static int rs_conn_can_send(struct rsocket *rs) - { -- return rs_can_send(rs) || (rs->state != rs_connected); -+ return rs_can_send(rs) || !(rs->state & rs_connect_wr); - } - - static int rs_can_send_ctrl(struct rsocket *rs) -@@ -1058,7 +1062,7 @@ static int rs_have_rdata(struct rsocket *rs) - - static int rs_conn_have_rdata(struct rsocket *rs) - { -- return rs_have_rdata(rs) || (rs->state != rs_connected); -+ return rs_have_rdata(rs) || !(rs->state & rs_connect_rd); - } - - static int rs_all_sends_done(struct rsocket *rs) -@@ -1111,7 +1115,7 @@ ssize_t rrecv(int socket, void *buf, size_t len, int flags) - int ret; - - rs = idm_at(&idm, socket); -- if (rs->state < rs_connected) { -+ if (rs->state & rs_opening) { - ret = rs_do_connect(rs); - if (ret) { - if (errno == EINPROGRESS) -@@ -1213,7 +1217,7 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags) - int ret = 0; - - rs = idm_at(&idm, socket); -- if (rs->state < rs_connected) { -+ if (rs->state & rs_opening) { - ret = rs_do_connect(rs); - if (ret) { - if (errno == EINPROGRESS) -@@ -1229,7 +1233,7 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags) - rs_conn_can_send); - if (ret) - break; -- if (rs->state != rs_connected) { -+ if (!(rs->state & rs_connect_wr)) { - ret = ERR(ECONNRESET); - break; - } -@@ -1322,7 +1326,7 @@ static ssize_t rsendv(int socket, const struct iovec *iov, int iovcnt, int flags - int i, ret = 0; - - rs = idm_at(&idm, socket); -- if (rs->state < rs_connected) { -+ if (rs->state & rs_opening) { - ret = rs_do_connect(rs); - if (ret) { - if (errno == EINPROGRESS) -@@ -1343,7 +1347,7 @@ static ssize_t rsendv(int socket, const struct iovec *iov, int iovcnt, int flags - rs_conn_can_send); - if (ret) - break; -- if (rs->state != rs_connected) { -+ if (!(rs->state & rs_connect_wr)) { - ret = ERR(ECONNRESET); - break; - } -@@ -1435,17 +1439,35 @@ static int rs_poll_rs(struct rsocket *rs, int events, - short revents; - int ret; - -- switch (rs->state) { -- case rs_listening: -+check_cq: -+ if ((rs->state & rs_connected) || (rs->state == rs_disconnected) || -+ (rs->state & rs_error)) { -+ rs_process_cq(rs, nonblock, test); -+ -+ revents = 0; -+ if ((events & POLLIN) && rs_have_rdata(rs)) -+ revents |= POLLIN; -+ if ((events & POLLOUT) && rs_can_send(rs)) -+ revents |= POLLOUT; -+ if (!(rs->state & rs_connected)) { -+ if (rs->state == rs_disconnected) -+ revents |= POLLHUP; -+ else -+ revents |= POLLERR; -+ } -+ -+ return revents; -+ } -+ -+ if (rs->state == rs_listening) { - fds.fd = rs->cm_id->channel->fd; - fds.events = events; - fds.revents = 0; - poll(&fds, 1, 0); - return fds.revents; -- case rs_resolving_addr: -- case rs_resolving_route: -- case rs_active_connect: -- case rs_accepting: -+ } -+ -+ if (rs->state & rs_opening) { - ret = rs_do_connect(rs); - if (ret) { - if (errno == EINPROGRESS) { -@@ -1455,30 +1477,13 @@ static int rs_poll_rs(struct rsocket *rs, int events, - return POLLOUT; - } - } -- /* fall through */ -- case rs_connected: -- case rs_disconnected: -- case rs_error: -- rs_process_cq(rs, nonblock, test); -- -- revents = 0; -- if ((events & POLLIN) && rs_have_rdata(rs)) -- revents |= POLLIN; -- if ((events & POLLOUT) && rs_can_send(rs)) -- revents |= POLLOUT; -- if (rs->state > rs_connected) { -- if (rs->state == rs_error) -- revents |= POLLERR; -- else -- revents |= POLLHUP; -- } -+ goto check_cq; -+ } - -- return revents; -- case rs_connect_error: -+ if (rs->state == rs_connect_error) - return (rs->err && events & POLLOUT) ? POLLOUT : 0; -- default: -- return 0; -- } -+ -+ return 0; - } - - static int rs_poll_check(struct pollfd *fds, nfds_t nfds) -@@ -1690,18 +1695,27 @@ int rselect(int nfds, fd_set *readfds, fd_set *writefds, - int rshutdown(int socket, int how) - { - struct rsocket *rs; -- int ret = 0; -+ int ctrl, ret = 0; - -- if (how == SHUT_RD) -+ rs = idm_at(&idm, socket); -+ if (how == SHUT_RD) { -+ rs->state &= ~rs_connect_rd; -+ if (rs->state == rs_connected) -+ rs->state = rs_disconnected; - return 0; -+ } - -- rs = idm_at(&idm, socket); - if (rs->fd_flags & O_NONBLOCK) - rs_set_nonblocking(rs, 0); - -- if (rs->state == rs_connected) { -- if (how == SHUT_RDWR) -+ if (rs->state & rs_connected) { -+ if (how == SHUT_RDWR) { -+ ctrl = RS_CTRL_DISCONNECT; - rs->state = rs_disconnected; -+ } else { -+ ctrl = RS_CTRL_SHUTDOWN; -+ rs->state &= ~rs_connect_wr; -+ } - if (!rs_can_send_ctrl(rs)) { - ret = rs_process_cq(rs, 0, rs_can_send_ctrl); - if (ret) -@@ -1710,7 +1724,7 @@ int rshutdown(int socket, int how) - - rs->ctrl_avail--; - ret = rs_post_write(rs, 0, NULL, 0, -- rs_msg_set(RS_OP_CTRL, RS_CTRL_DISCONNECT), -+ rs_msg_set(RS_OP_CTRL, ctrl), - 0, 0, 0); - } - -@@ -1728,7 +1742,7 @@ int rclose(int socket) - struct rsocket *rs; - - rs = idm_at(&idm, socket); -- if (rs->state == rs_connected) -+ if (rs->state & rs_connected) - rshutdown(socket, SHUT_RDWR); - - rs_free(rs); -@@ -1839,8 +1853,9 @@ int rsetsockopt(int socket, int level, int optname, - default: - break; - } -+ break; - case SOL_RDMA: -- if (rs->state > rs_listening) { -+ if (rs->state >= rs_opening) { - ret = ERR(EINVAL); - break; - } diff --git a/patches/shut_wr b/patches/shut_wr index fd115fbb..42fbd9be 100644 --- a/patches/shut_wr +++ b/patches/shut_wr @@ -1,5 +1,5 @@ Bottom: 938168c7141b54196d5a134aca1fe7c88dcfb3b5 -Top: 2ddb5fbcef7548a1d1c87870ef237d187fba4f30 +Top: 628bde79ad910c1eec4036abc1f102ef7b304bc8 Author: Sean Hefty Date: 2012-06-25 14:19:54 -0700 @@ -11,16 +11,21 @@ Signed-off-by: Sean Hefty --- diff --git a/src/rsocket.c b/src/rsocket.c -index ed994fe..5dfec0b 100644 +index ed994fe..8e8a9d9 100644 --- a/src/rsocket.c +++ b/src/rsocket.c -@@ -131,21 +131,21 @@ union rs_wr_id { - }; +@@ -96,7 +96,8 @@ enum { + #define rs_msg_data(imm_data) (imm_data & 0x1FFFFFFF) + + enum { +- RS_CTRL_DISCONNECT ++ RS_CTRL_DISCONNECT, ++ RS_CTRL_SHUTDOWN }; --/* -- * rsocket states are ordered as passive, connecting, connected, disconnected. -- */ + struct rs_msg { +@@ -136,16 +137,19 @@ union rs_wr_id { + */ enum rs_state { rs_init, - rs_bound, @@ -43,13 +48,13 @@ index ed994fe..5dfec0b 100644 + rs_connected = 0x0100, + rs_connect_wr = rs_connected | 0x0200, + rs_connect_rd = rs_connected | 0x0400, -+ rs_disconnected = 0x0800, -+ rs_error = 0x1000, -+ rs_connect_error = rs_error | 0x2000 ++ rs_connect_error = 0x0800, ++ rs_disconnected = 0x1000, ++ rs_error = 0x2000, }; #define RS_OPT_SWAP_SGL 1 -@@ -321,7 +321,7 @@ static int rs_set_nonblocking(struct rsocket *rs, long arg) +@@ -321,7 +325,7 @@ static int rs_set_nonblocking(struct rsocket *rs, long arg) if (rs->cm_id->recv_cq_channel) ret = fcntl(rs->cm_id->recv_cq_channel->fd, F_SETFL, arg); @@ -58,28 +63,33 @@ index ed994fe..5dfec0b 100644 ret = fcntl(rs->cm_id->channel->fd, F_SETFL, arg); return ret; -@@ -701,9 +701,9 @@ do_connect: - if (!ret) - goto connected; - if (errno == EAGAIN || errno == EWOULDBLOCK) -- rs->state = rs_connecting; -+ rs->state = rs_active_connect; - break; -- case rs_connecting: -+ case rs_active_connect: - ret = ucma_complete(rs->cm_id); - if (ret) - break; -@@ -907,7 +907,7 @@ static int rs_poll_cq(struct rsocket *rs) +@@ -852,7 +856,7 @@ static int rs_give_credits(struct rsocket *rs) + { + return ((rs->rbuf_bytes_avail >= (rs->rbuf_size >> 1)) || + ((short) ((short) rs->rseq_no - (short) rs->rseq_comp) >= 0)) && +- rs->ctrl_avail && (rs->state == rs_connected); ++ rs->ctrl_avail && (rs->state & rs_connected); + } + + static void rs_update_credits(struct rsocket *rs) +@@ -900,14 +904,14 @@ static int rs_poll_cq(struct rsocket *rs) + } else { + rs->ctrl_avail++; + } +- if (wc.status != IBV_WC_SUCCESS && rs->state == rs_connected) { ++ if (wc.status != IBV_WC_SUCCESS && (rs->state & rs_connected)) { + rs->state = rs_error; + rs->err = EIO; + } } } - if (rs->state == rs_connected) { -+ if (rs->state != rs_error) { ++ if (rs->state & rs_connected) { while (!ret && rcnt--) ret = rdma_post_recvv(rs->cm_id, NULL, NULL, 0); -@@ -932,7 +932,7 @@ static int rs_get_cq_event(struct rsocket *rs) +@@ -932,7 +936,7 @@ static int rs_get_cq_event(struct rsocket *rs) if (!ret) { ibv_ack_cq_events(rs->cm_id->recv_cq, 1); rs->cq_armed = 0; @@ -88,51 +98,185 @@ index ed994fe..5dfec0b 100644 rs->state = rs_error; } -@@ -1444,7 +1444,7 @@ static int rs_poll_rs(struct rsocket *rs, int events, +@@ -1043,7 +1047,7 @@ static int rs_can_send(struct rsocket *rs) + + static int rs_conn_can_send(struct rsocket *rs) + { +- return rs_can_send(rs) || (rs->state != rs_connected); ++ return rs_can_send(rs) || !(rs->state & rs_connect_wr); + } + + static int rs_can_send_ctrl(struct rsocket *rs) +@@ -1058,7 +1062,7 @@ static int rs_have_rdata(struct rsocket *rs) + + static int rs_conn_have_rdata(struct rsocket *rs) + { +- return rs_have_rdata(rs) || (rs->state != rs_connected); ++ return rs_have_rdata(rs) || !(rs->state & rs_connect_rd); + } + + static int rs_all_sends_done(struct rsocket *rs) +@@ -1111,7 +1115,7 @@ ssize_t rrecv(int socket, void *buf, size_t len, int flags) + int ret; + + rs = idm_at(&idm, socket); +- if (rs->state < rs_connected) { ++ if (rs->state & rs_opening) { + ret = rs_do_connect(rs); + if (ret) { + if (errno == EINPROGRESS) +@@ -1213,7 +1217,7 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags) + int ret = 0; + + rs = idm_at(&idm, socket); +- if (rs->state < rs_connected) { ++ if (rs->state & rs_opening) { + ret = rs_do_connect(rs); + if (ret) { + if (errno == EINPROGRESS) +@@ -1229,7 +1233,7 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags) + rs_conn_can_send); + if (ret) + break; +- if (rs->state != rs_connected) { ++ if (!(rs->state & rs_connect_wr)) { + ret = ERR(ECONNRESET); + break; + } +@@ -1322,7 +1326,7 @@ static ssize_t rsendv(int socket, const struct iovec *iov, int iovcnt, int flags + int i, ret = 0; + + rs = idm_at(&idm, socket); +- if (rs->state < rs_connected) { ++ if (rs->state & rs_opening) { + ret = rs_do_connect(rs); + if (ret) { + if (errno == EINPROGRESS) +@@ -1343,7 +1347,7 @@ static ssize_t rsendv(int socket, const struct iovec *iov, int iovcnt, int flags + rs_conn_can_send); + if (ret) + break; +- if (rs->state != rs_connected) { ++ if (!(rs->state & rs_connect_wr)) { + ret = ERR(ECONNRESET); + break; + } +@@ -1435,17 +1439,35 @@ static int rs_poll_rs(struct rsocket *rs, int events, + short revents; + int ret; + +- switch (rs->state) { +- case rs_listening: ++check_cq: ++ if ((rs->state & rs_connected) || (rs->state == rs_disconnected) || ++ (rs->state & rs_error)) { ++ rs_process_cq(rs, nonblock, test); ++ ++ revents = 0; ++ if ((events & POLLIN) && rs_have_rdata(rs)) ++ revents |= POLLIN; ++ if ((events & POLLOUT) && rs_can_send(rs)) ++ revents |= POLLOUT; ++ if (!(rs->state & rs_connected)) { ++ if (rs->state == rs_disconnected) ++ revents |= POLLHUP; ++ else ++ revents |= POLLERR; ++ } ++ ++ return revents; ++ } ++ ++ if (rs->state == rs_listening) { + fds.fd = rs->cm_id->channel->fd; + fds.events = events; + fds.revents = 0; + poll(&fds, 1, 0); return fds.revents; - case rs_resolving_addr: - case rs_resolving_route: +- case rs_resolving_addr: +- case rs_resolving_route: - case rs_connecting: -+ case rs_active_connect: - case rs_accepting: +- case rs_accepting: ++ } ++ ++ if (rs->state & rs_opening) { ret = rs_do_connect(rs); if (ret) { -@@ -1466,10 +1466,12 @@ static int rs_poll_rs(struct rsocket *rs, int events, - revents |= POLLIN; - if ((events & POLLOUT) && rs_can_send(rs)) - revents |= POLLOUT; + if (errno == EINPROGRESS) { +@@ -1455,28 +1477,13 @@ static int rs_poll_rs(struct rsocket *rs, int events, + return POLLOUT; + } + } +- /* fall through */ +- case rs_connected: +- case rs_disconnected: +- case rs_error: +- rs_process_cq(rs, nonblock, test); +- +- revents = 0; +- if ((events & POLLIN) && rs_have_rdata(rs)) +- revents |= POLLIN; +- if ((events & POLLOUT) && rs_can_send(rs)) +- revents |= POLLOUT; - if (rs->state == rs_disconnected) - revents |= POLLHUP; - else if (rs->state == rs_error) - revents |= POLLERR; -+ if (rs->state > rs_connected) { -+ if (rs->state == rs_error) -+ revents |= POLLERR; -+ else -+ revents |= POLLHUP; -+ } ++ goto check_cq; ++ } + +- return revents; +- case rs_connect_error: ++ if (rs->state == rs_connect_error) + return (rs->err && events & POLLOUT) ? POLLOUT : 0; +- default: +- return 0; +- } ++ ++ return 0; + } - return revents; - case rs_connect_error: -@@ -1690,12 +1692,16 @@ int rshutdown(int socket, int how) + static int rs_poll_check(struct pollfd *fds, nfds_t nfds) +@@ -1688,14 +1695,27 @@ int rselect(int nfds, fd_set *readfds, fd_set *writefds, + int rshutdown(int socket, int how) + { struct rsocket *rs; - int ret = 0; +- int ret = 0; ++ int ctrl, ret = 0; -+ if (how == SHUT_RD) + rs = idm_at(&idm, socket); ++ if (how == SHUT_RD) { ++ rs->state &= ~rs_connect_rd; ++ if (rs->state == rs_connected) ++ rs->state = rs_disconnected; + return 0; ++ } + - rs = idm_at(&idm, socket); if (rs->fd_flags & O_NONBLOCK) rs_set_nonblocking(rs, 0); - if (rs->state == rs_connected) { +- if (rs->state == rs_connected) { - rs->state = rs_disconnected; -+ if (how == SHUT_RDWR) ++ if (rs->state & rs_connected) { ++ if (how == SHUT_RDWR) { ++ ctrl = RS_CTRL_DISCONNECT; + rs->state = rs_disconnected; ++ } else { ++ ctrl = RS_CTRL_SHUTDOWN; ++ rs->state &= ~rs_connect_wr; ++ } if (!rs_can_send_ctrl(rs)) { ret = rs_process_cq(rs, 0, rs_can_send_ctrl); if (ret) -@@ -1711,6 +1717,9 @@ int rshutdown(int socket, int how) +@@ -1704,13 +1724,16 @@ int rshutdown(int socket, int how) + + rs->ctrl_avail--; + ret = rs_post_write(rs, 0, NULL, 0, +- rs_msg_set(RS_OP_CTRL, RS_CTRL_DISCONNECT), ++ rs_msg_set(RS_OP_CTRL, ctrl), + 0, 0, 0); + } + if (!rs_all_sends_done(rs) && rs->state != rs_error) rs_process_cq(rs, 0, rs_all_sends_done); @@ -141,3 +285,24 @@ index ed994fe..5dfec0b 100644 + return 0; } + +@@ -1719,7 +1742,7 @@ int rclose(int socket) + struct rsocket *rs; + + rs = idm_at(&idm, socket); +- if (rs->state == rs_connected) ++ if (rs->state & rs_connected) + rshutdown(socket, SHUT_RDWR); + + rs_free(rs); +@@ -1830,8 +1853,9 @@ int rsetsockopt(int socket, int level, int optname, + default: + break; + } ++ break; + case SOL_RDMA: +- if (rs->state > rs_listening) { ++ if (rs->state >= rs_opening) { + ret = ERR(EINVAL); + break; + }