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
+++ /dev/null
-Bottom: 938168c7141b54196d5a134aca1fe7c88dcfb3b5
-Top: 1ae738a42c25e6d2f1c92e4e79e5653b620de2c4
-Author: Sean Hefty <sean.hefty@intel.com>
-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;
- }
Bottom: 938168c7141b54196d5a134aca1fe7c88dcfb3b5
-Top: 938168c7141b54196d5a134aca1fe7c88dcfb3b5
+Top: 1ae738a42c25e6d2f1c92e4e79e5653b620de2c4
Author: Sean Hefty <sean.hefty@intel.com>
Date: 2012-06-25 14:19:54 -0700
---
-
+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;
+ }