From 266384e046984f0d8a4c244d4dcae2ebf74bee9a Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Mon, 25 Jun 2012 17:11:41 -0700 Subject: [PATCH] refresh --- meta | 7 ++- patches/refresh-temp | 112 ------------------------------------------- patches/shut_wr | 106 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 107 insertions(+), 118 deletions(-) delete mode 100644 patches/refresh-temp diff --git a/meta b/meta index f4a80690..49dc2185 100644 --- a/meta +++ b/meta @@ -1,11 +1,10 @@ Version: 1 -Previous: 0db511ddf21a5fce70b3eab5f7f8d78afa30c375 -Head: d363fe91691a296f6a2253bf1346ea113558b9fd +Previous: d7a2b3a030db2e35e040656453c50b0895016dc5 +Head: 84bdc5da587b58be831799eac853c7db9886a22d Applied: v6only: 36dbcc6dd62fc62a0bb8bc3cc82869eb4242fd4f rselect: 1fdb8dc1bff60f2748e148a081aae55b7fa80034 - shut_wr: a77f0e02ab60b1b1746c2a17038d515c6db7500d - refresh-temp: d363fe91691a296f6a2253bf1346ea113558b9fd + shut_wr: 84bdc5da587b58be831799eac853c7db9886a22d Unapplied: rs-1sge: 8ec392829399dec7ed5c608b8697a482e5faa2de ip6-opt: 7e43a759255e9890d1e41f1edf71792836f53941 diff --git a/patches/refresh-temp b/patches/refresh-temp deleted file mode 100644 index 46e5bef7..00000000 --- a/patches/refresh-temp +++ /dev/null @@ -1,112 +0,0 @@ -Bottom: 938168c7141b54196d5a134aca1fe7c88dcfb3b5 -Top: 1ae738a42c25e6d2f1c92e4e79e5653b620de2c4 -Author: Sean Hefty -Date: 2012-06-25 17:11:41 -0700 - -Refresh of shut_wr - ---- - -diff --git a/src/rsocket.c b/src/rsocket.c -index ed994fe..63bf03e 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 { -@@ -321,7 +322,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); - -- if (!ret && rs->state != rs_connected) -+ if (!ret && rs->state < rs_connected) - ret = fcntl(rs->cm_id->channel->fd, F_SETFL, arg); - - return ret; -@@ -883,6 +884,8 @@ static int rs_poll_cq(struct rsocket *rs) - if (rs_msg_data(imm_data) == RS_CTRL_DISCONNECT) { - rs->state = rs_disconnected; - return ERR(ECONNRESET); -+ } else if (rs_msg_data(imm_data) == RS_CTRL_SHUTDOWN) { -+ rs->state = rs_shutdown_rd; - } - break; - default: -@@ -907,7 +910,7 @@ static int rs_poll_cq(struct rsocket *rs) - } - } - -- if (rs->state == rs_connected) { -+ if (rs->state != rs_error) { - while (!ret && rcnt--) - ret = rdma_post_recvv(rs->cm_id, NULL, NULL, 0); - -@@ -932,7 +935,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; -- } else if (errno != EAGAIN && rs->state == rs_connected) { -+ } else if (errno != EAGAIN) { - rs->state = rs_error; - } - -@@ -1457,6 +1460,8 @@ static int rs_poll_rs(struct rsocket *rs, int events, - } - /* fall through */ - case rs_connected: -+ case rs_shutdown_rd: -+ case rs_shutdown_wr: - case rs_disconnected: - case rs_error: - rs_process_cq(rs, nonblock, test); -@@ -1466,10 +1471,12 @@ static int rs_poll_rs(struct rsocket *rs, int events, - 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; -+ } - - return revents; - case rs_connect_error: -@@ -1690,12 +1697,16 @@ int rshutdown(int socket, int how) - struct rsocket *rs; - int ret = 0; - -+ if (how == SHUT_RD) -+ return 0; -+ - rs = idm_at(&idm, socket); - if (rs->fd_flags & O_NONBLOCK) - rs_set_nonblocking(rs, 0); - - if (rs->state == rs_connected) { -- rs->state = rs_disconnected; -+ if (how == SHUT_RDWR) -+ rs->state = rs_disconnected; - if (!rs_can_send_ctrl(rs)) { - ret = rs_process_cq(rs, 0, rs_can_send_ctrl); - if (ret) -@@ -1711,6 +1722,9 @@ int rshutdown(int socket, int how) - if (!rs_all_sends_done(rs) && rs->state != rs_error) - rs_process_cq(rs, 0, rs_all_sends_done); - -+ if ((rs->fd_flags & O_NONBLOCK) && (how == SHUT_WR)) -+ rs_set_nonblocking(rs, 1); -+ - return 0; - } diff --git a/patches/shut_wr b/patches/shut_wr index 49f3ab9e..0ff742d5 100644 --- a/patches/shut_wr +++ b/patches/shut_wr @@ -1,5 +1,5 @@ Bottom: 938168c7141b54196d5a134aca1fe7c88dcfb3b5 -Top: 938168c7141b54196d5a134aca1fe7c88dcfb3b5 +Top: 1ae738a42c25e6d2f1c92e4e79e5653b620de2c4 Author: Sean Hefty Date: 2012-06-25 14:19:54 -0700 @@ -10,4 +10,106 @@ Signed-off-by: Sean Hefty --- - +diff --git a/src/rsocket.c b/src/rsocket.c +index ed994fe..63bf03e 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 { +@@ -321,7 +322,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); + +- if (!ret && rs->state != rs_connected) ++ if (!ret && rs->state < rs_connected) + ret = fcntl(rs->cm_id->channel->fd, F_SETFL, arg); + + return ret; +@@ -883,6 +884,8 @@ static int rs_poll_cq(struct rsocket *rs) + if (rs_msg_data(imm_data) == RS_CTRL_DISCONNECT) { + rs->state = rs_disconnected; + return ERR(ECONNRESET); ++ } else if (rs_msg_data(imm_data) == RS_CTRL_SHUTDOWN) { ++ rs->state = rs_shutdown_rd; + } + break; + default: +@@ -907,7 +910,7 @@ static int rs_poll_cq(struct rsocket *rs) + } + } + +- if (rs->state == rs_connected) { ++ if (rs->state != rs_error) { + while (!ret && rcnt--) + ret = rdma_post_recvv(rs->cm_id, NULL, NULL, 0); + +@@ -932,7 +935,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; +- } else if (errno != EAGAIN && rs->state == rs_connected) { ++ } else if (errno != EAGAIN) { + rs->state = rs_error; + } + +@@ -1457,6 +1460,8 @@ static int rs_poll_rs(struct rsocket *rs, int events, + } + /* fall through */ + case rs_connected: ++ case rs_shutdown_rd: ++ case rs_shutdown_wr: + case rs_disconnected: + case rs_error: + rs_process_cq(rs, nonblock, test); +@@ -1466,10 +1471,12 @@ static int rs_poll_rs(struct rsocket *rs, int events, + 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; ++ } + + return revents; + case rs_connect_error: +@@ -1690,12 +1697,16 @@ int rshutdown(int socket, int how) + struct rsocket *rs; + int ret = 0; + ++ if (how == SHUT_RD) ++ return 0; ++ + rs = idm_at(&idm, socket); + if (rs->fd_flags & O_NONBLOCK) + rs_set_nonblocking(rs, 0); + + if (rs->state == rs_connected) { +- rs->state = rs_disconnected; ++ if (how == SHUT_RDWR) ++ rs->state = rs_disconnected; + if (!rs_can_send_ctrl(rs)) { + ret = rs_process_cq(rs, 0, rs_can_send_ctrl); + if (ret) +@@ -1711,6 +1722,9 @@ int rshutdown(int socket, int how) + if (!rs_all_sends_done(rs) && rs->state != rs_error) + rs_process_cq(rs, 0, rs_all_sends_done); + ++ if ((rs->fd_flags & O_NONBLOCK) && (how == SHUT_WR)) ++ rs_set_nonblocking(rs, 1); ++ + return 0; + } -- 2.41.0