From: Sean Hefty Date: Tue, 26 Jun 2012 00:11:41 +0000 (-0700) Subject: refresh (create temporary patch) X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=58693ba03ae52c3a41239338dca50425d0a4c757;p=~shefty%2Flibrdmacm.git refresh (create temporary patch) --- diff --git a/meta b/meta index 213742bb..f4a80690 100644 --- a/meta +++ b/meta @@ -1,10 +1,11 @@ Version: 1 -Previous: 4fbdc85e23511080f0dded4ca56caba3bf462f6e -Head: a77f0e02ab60b1b1746c2a17038d515c6db7500d +Previous: 0db511ddf21a5fce70b3eab5f7f8d78afa30c375 +Head: d363fe91691a296f6a2253bf1346ea113558b9fd Applied: v6only: 36dbcc6dd62fc62a0bb8bc3cc82869eb4242fd4f rselect: 1fdb8dc1bff60f2748e148a081aae55b7fa80034 shut_wr: a77f0e02ab60b1b1746c2a17038d515c6db7500d + refresh-temp: d363fe91691a296f6a2253bf1346ea113558b9fd Unapplied: rs-1sge: 8ec392829399dec7ed5c608b8697a482e5faa2de ip6-opt: 7e43a759255e9890d1e41f1edf71792836f53941 diff --git a/patches/refresh-temp b/patches/refresh-temp new file mode 100644 index 00000000..46e5bef7 --- /dev/null +++ b/patches/refresh-temp @@ -0,0 +1,112 @@ +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; + }