From c2abbcc6def2f1e260049a29a341581d90110657 Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Wed, 16 Apr 2014 23:51:45 -0700 Subject: [PATCH] refresh (create temporary patch) --- meta | 5 +- patches/refresh-temp | 170 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 patches/refresh-temp diff --git a/meta b/meta index d9780427..19d3ed08 100644 --- a/meta +++ b/meta @@ -1,10 +1,11 @@ Version: 1 -Previous: 6acb8e79633642c32fd914a3360a1709b193abfa -Head: 55ef5a0c96d9820e61f220a403479e3119a32eaf +Previous: 3fb33cdfd69e070eb184e38e1f0d1e907dbe55c6 +Head: 6a3cacf2b029a6a6000765da6c8946dc4800e30f Applied: lazy-init: f306625fe8cafef70e3d60fddd7e685bc0696047 rs-inline: de52ebed743b5b7ef300586b4f7cb875dfd77792 rs-ctrl: 55ef5a0c96d9820e61f220a403479e3119a32eaf + refresh-temp: 6a3cacf2b029a6a6000765da6c8946dc4800e30f Unapplied: inline0: f187212a28d15ba2fed172e2428c4fb777cf8a09 old-af-ib: aaa0d9ca917c8c361a978e5a116963c2cceac5ba diff --git a/patches/refresh-temp b/patches/refresh-temp new file mode 100644 index 00000000..f95a89af --- /dev/null +++ b/patches/refresh-temp @@ -0,0 +1,170 @@ +Bottom: 55ffa8849cf2c6e18856f1e9d278573786bcb7f0 +Top: 4c69a188a96268f07c5d7461565f8d0bf08ae799 +Author: Sean Hefty +Date: 2014-04-16 23:51:45 -0700 + +Refresh of rs-ctrl + +--- + +diff --git a/src/rsocket.c b/src/rsocket.c +index 8325edf..3af60c4 100644 +--- a/src/rsocket.c ++++ b/src/rsocket.c +@@ -307,7 +307,8 @@ struct rsocket { + uint64_t tcp_opts; + unsigned int keepalive_time; + +- int ctrl_avail; ++ unsigned int ctrl_seqno; ++ unsigned int ctrl_max_seqno; + uint16_t sseq_no; + uint16_t sseq_comp; + uint16_t rseq_no; +@@ -562,6 +563,7 @@ static void rs_remove(struct rsocket *rs) + pthread_mutex_unlock(&mut); + } + ++/* We only inherit from listening sockets */ + static struct rsocket *rs_alloc(struct rsocket *inherited_rs, int type) + { + struct rsocket *rs; +@@ -584,7 +586,7 @@ static struct rsocket *rs_alloc(struct rsocket *inherited_rs, int type) + rs->sq_size = inherited_rs->sq_size; + rs->rq_size = inherited_rs->rq_size; + if (type == SOCK_STREAM) { +- rs->ctrl_avail = inherited_rs->ctrl_avail; ++ rs->ctrl_max_seqno = inherited_rs->ctrl_max_seqno; + rs->target_iomap_size = inherited_rs->target_iomap_size; + } + } else { +@@ -594,7 +596,7 @@ static struct rsocket *rs_alloc(struct rsocket *inherited_rs, int type) + rs->sq_size = def_sqsize; + rs->rq_size = def_rqsize; + if (type == SOCK_STREAM) { +- rs->ctrl_avail = RS_QP_CTRL_SIZE; ++ rs->ctrl_max_seqno = RS_QP_CTRL_SIZE; + rs->target_iomap_size = def_iomap_size; + } + } +@@ -645,7 +647,7 @@ static void rs_set_qp_size(struct rsocket *rs) + else if (rs->sq_size < 4) + rs->sq_size = 4; + if (rs->sq_size <= (RS_QP_CTRL_SIZE << 2)) +- rs->ctrl_avail = 2; ++ rs->ctrl_max_seqno = 2; + + if (rs->rq_size > max_size) + rs->rq_size = max_size; +@@ -724,7 +726,7 @@ static int rs_init_bufs(struct rsocket *rs) + + rs->rbuf_free_offset = rs->rbuf_size >> 1; + rs->rbuf_bytes_avail = rs->rbuf_size >> 1; +- rs->sqe_avail = rs->sq_size - rs->ctrl_avail; ++ rs->sqe_avail = rs->sq_size - rs->ctrl_max_seqno; + rs->rseq_comp = rs->rq_size >> 1; + return 0; + } +@@ -1787,11 +1789,11 @@ static void rs_send_credits(struct rsocket *rs) + struct ibv_sge ibsge; + struct rs_sge sge; + +- rs->ctrl_avail--; ++ rs->ctrl_seqno++; + rs->rseq_comp = rs->rseq_no + (rs->rq_size >> 1); + if (rs->rbuf_bytes_avail >= (rs->rbuf_size >> 1)) { + if (rs->opts & RS_OPT_MSG_SEND) +- rs->ctrl_avail--; ++ rs->ctrl_seqno++; + + if (!(rs->opts & RS_OPT_SWAP_SGL)) { + sge.addr = (uintptr_t) &rs->rbuf[rs->rbuf_free_offset]; +@@ -1825,16 +1827,27 @@ static void rs_send_credits(struct rsocket *rs) + } + } + ++static inline int rs_ctrl_avail(struct rsocket *rs) ++{ ++ return rs->ctrl_seqno != rs->ctrl_max_seqno; ++} ++ ++/* Protocols that do not support RDMA write with immediate may require 2 msgs */ ++static inline int rs_2ctrl_avail(struct rsocket *rs) ++{ ++ return (int)((rs->ctrl_seqno + 1) - rs->ctrl_max_seqno) < 0; ++} ++ + static int rs_give_credits(struct rsocket *rs) + { + if (!(rs->opts & RS_OPT_MSG_SEND)) { + 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) && (rs->state & rs_connected); + } else { + return ((rs->rbuf_bytes_avail >= (rs->rbuf_size >> 1)) || + ((short) ((short) rs->rseq_no - (short) rs->rseq_comp) >= 0)) && +- (rs->ctrl_avail > 1) && (rs->state & rs_connected); ++ rs_2ctrl_avail(rs) && (rs->state & rs_connected); + } + } + +@@ -1896,10 +1909,10 @@ static int rs_poll_cq(struct rsocket *rs) + } else { + switch (rs_msg_op(rs_wr_data(wc.wr_id))) { + case RS_OP_SGL: +- rs->ctrl_avail++; ++ rs->ctrl_max_seqno++; + break; + case RS_OP_CTRL: +- rs->ctrl_avail++; ++ rs->ctrl_max_seqno++; + if (rs_msg_data(rs_wr_data(wc.wr_id)) == RS_CTRL_DISCONNECT) + rs->state = rs_disconnected; + break; +@@ -2238,7 +2251,7 @@ static int rs_conn_can_send(struct rsocket *rs) + + static int rs_conn_can_send_ctrl(struct rsocket *rs) + { +- return rs->ctrl_avail || !(rs->state & rs_connected); ++ return rs_ctrl_avail(rs) || !(rs->state & rs_connected); + } + + static int rs_have_rdata(struct rsocket *rs) +@@ -2253,7 +2266,8 @@ static int rs_conn_have_rdata(struct rsocket *rs) + + static int rs_conn_all_sends_done(struct rsocket *rs) + { +- return ((rs->sqe_avail + rs->ctrl_avail) == rs->sq_size) || ++ return ((((int) rs->ctrl_max_seqno) - ((int) rs->ctrl_seqno)) + ++ rs->sqe_avail == rs->sq_size) || + !(rs->state & rs_connected); + } + +@@ -3190,14 +3204,14 @@ int rshutdown(int socket, int how) + goto out; + ctrl = RS_CTRL_DISCONNECT; + } +- if (!rs->ctrl_avail) { ++ if (!rs_ctrl_avail(rs)) { + ret = rs_process_cq(rs, 0, rs_conn_can_send_ctrl); + if (ret) + goto out; + } + +- if ((rs->state & rs_connected) && rs->ctrl_avail) { +- rs->ctrl_avail--; ++ if ((rs->state & rs_connected) && rs_ctrl_avail(rs)) { ++ rs->ctrl_seqno++; + ret = rs_post_msg(rs, rs_msg_set(RS_OP_CTRL, ctrl)); + } + } +@@ -4159,7 +4173,7 @@ static void tcp_svc_process_sock(struct rs_svc *svc) + static void tcp_svc_send_keepalive(struct rsocket *rs) + { + fastlock_acquire(&rs->cq_lock); +- if ((rs->ctrl_avail > 1) && (rs->state & rs_connected)) ++ if (rs_2ctrl_avail(rs) && (rs->state & rs_connected)) + rs_send_credits(rs); + fastlock_release(&rs->cq_lock); + } -- 2.41.0