From b7faf763fad6edc97f2fa9aab0f2130a88a8c0a5 Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Sun, 20 May 2012 16:20:49 -0700 Subject: [PATCH] refresh --- meta | 7 +- patches/refresh-temp | 232 ------------------------------------------- patches/rs-qpsize | 226 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 227 insertions(+), 238 deletions(-) delete mode 100644 patches/refresh-temp diff --git a/meta b/meta index 080997ff..c3a34b0b 100644 --- a/meta +++ b/meta @@ -1,9 +1,8 @@ Version: 1 -Previous: e14fd986edf6993777469bff457dfe7933924af9 -Head: 2ec76378b3757b05ac1cba32320d0122ca344b7c +Previous: 2c8d5b59c3a3d5415404d225bfae39c0725d1a87 +Head: 01d4813af111f2309583f439a5120be86616dd3e Applied: - rs-qpsize: a75aec6078074006c6ab9242a74901adf11a0e73 - refresh-temp: 2ec76378b3757b05ac1cba32320d0122ca344b7c + rs-qpsize: 01d4813af111f2309583f439a5120be86616dd3e Unapplied: rs-opts: 7c8fbc95903cf8f61422d7f2c58f83ba4f0b8ac4 rs-opt-qpsize: 6b732ff34d98cf8745e2f5d2ff326cef4a3b05a7 diff --git a/patches/refresh-temp b/patches/refresh-temp deleted file mode 100644 index 73277650..00000000 --- a/patches/refresh-temp +++ /dev/null @@ -1,232 +0,0 @@ -Bottom: 6bbc2f526b97dfafc16e7ec34dc8e4e1ce587f40 -Top: b37d006a6372969ddf786ae8c3abe0509cfaef04 -Author: Sean Hefty -Date: 2012-05-20 16:20:49 -0700 - -Refresh of rs-qpsize - ---- - -diff --git a/src/cma.h b/src/cma.h -index 7703fe8..669b681 100644 ---- a/src/cma.h -+++ b/src/cma.h -@@ -67,7 +67,7 @@ static inline uint64_t htonll(uint64_t x) { return x; } - static inline uint64_t ntohll(uint64_t x) { return x; } - #endif - --#define min(a, b) (a < b ? a : b) -+#define min(a, b) ((a) < (b) ? a : b) - - /* - * Fast synchronization for low contention locking. -diff --git a/src/rsocket.c b/src/rsocket.c -index de0ec3e..495c2e3 100644 ---- a/src/rsocket.c -+++ b/src/rsocket.c -@@ -55,6 +55,8 @@ - #define RS_OLAP_START_SIZE 2048 - #define RS_MAX_TRANSFER 65536 - #define RS_QP_SIZE 512 -+#define RS_QP_MAX_SIZE 0xFFFE -+#define RS_QP_MIN_SIZE 8 - #define RS_QP_CTRL_SIZE 4 - #define RS_CONN_RETRIES 6 - #define RS_SGL_SIZE 2 -@@ -160,7 +162,9 @@ struct rsocket { - int sbuf_bytes_avail; - uint16_t sseq_no; - uint16_t sseq_comp; -+ uint16_t sq_size; - -+ uint16_t rq_size; - uint16_t rseq_no; - uint16_t rseq_comp; - int rbuf_bytes_avail; -@@ -168,7 +172,7 @@ struct rsocket { - int rbuf_offset; - int rmsg_head; - int rmsg_tail; -- struct rs_msg rmsg[RS_QP_SIZE + 1]; -+ struct rs_msg *rmsg; - - int remote_sge; - struct rs_sge remote_sgl; -@@ -222,8 +226,17 @@ static struct rsocket *rs_alloc(struct rsocket *inherited_rs) - return NULL; - - rs->index = -1; -- rs->sbuf_size = inherited_rs ? inherited_rs->sbuf_size : RS_BUF_SIZE; -- rs->rbuf_size = inherited_rs ? inherited_rs->rbuf_size : RS_BUF_SIZE; -+ if (inherited_rs) { -+ rs->sbuf_size = inherited_rs->sbuf_size; -+ rs->rbuf_size = inherited_rs->rbuf_size; -+ rs->sq_size = inherited_rs->sq_size; -+ rs->rq_size = inherited_rs->rq_size; -+ rs->ctrl_avail = inherited_rs->ctrl_avail; -+ } else { -+ rs->sbuf_size = rs->rbuf_size = RS_BUF_SIZE; -+ rs->sq_size = rs->rq_size = RS_QP_SIZE; -+ rs->ctrl_avail = RS_QP_CTRL_SIZE; -+ } - fastlock_init(&rs->slock); - fastlock_init(&rs->rlock); - fastlock_init(&rs->cq_lock); -@@ -244,8 +257,27 @@ static int rs_set_nonblocking(struct rsocket *rs, long arg) - return ret; - } - -+static void rs_set_qp_size(struct rsocket *rs) -+{ -+ struct ibv_device_attr attr; -+ uint16_t max_size; -+ -+ attr.max_qp_wr = RS_QP_SIZE; -+ ibv_query_device(rs->cm_id->verbs, &attr); -+ max_size = min(attr.max_qp_wr, RS_QP_MAX_SIZE); -+ -+ if (rs->sq_size > max_size) -+ rs->sq_size = max_size; -+ if (rs->rq_size > max_size) -+ rs->rq_size = max_size; -+} -+ - static int rs_init_bufs(struct rsocket *rs) - { -+ rs->rmsg = calloc(rs->rq_size + 1, sizeof(*rs->rmsg)); -+ if (!rs->rmsg) -+ return -1; -+ - rs->sbuf = calloc(rs->sbuf_size, sizeof(*rs->sbuf)); - if (!rs->sbuf) - return -1; -@@ -273,9 +305,8 @@ 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->ctrl_avail = RS_QP_CTRL_SIZE; -- rs->sqe_avail = RS_QP_SIZE - rs->ctrl_avail; -- rs->rseq_comp = RS_QP_SIZE >> 1; -+ rs->sqe_avail = rs->sq_size - rs->ctrl_avail; -+ rs->rseq_comp = rs->rq_size >> 1; - return 0; - } - -@@ -285,7 +316,7 @@ static int rs_create_cq(struct rsocket *rs) - if (!rs->cm_id->recv_cq_channel) - return -1; - -- rs->cm_id->recv_cq = ibv_create_cq(rs->cm_id->verbs, RS_QP_SIZE * 2, -+ rs->cm_id->recv_cq = ibv_create_cq(rs->cm_id->verbs, rs->sq_size + rs->rq_size, - rs->cm_id, rs->cm_id->recv_cq_channel, 0); - if (!rs->cm_id->recv_cq) - goto err1; -@@ -313,6 +344,7 @@ static int rs_create_ep(struct rsocket *rs) - struct ibv_qp_init_attr qp_attr; - int i, ret; - -+ rs_check_qp_size(rs); - ret = rs_init_bufs(rs); - if (ret) - return ret; -@@ -327,8 +359,8 @@ static int rs_create_ep(struct rsocket *rs) - qp_attr.recv_cq = rs->cm_id->recv_cq; - qp_attr.qp_type = IBV_QPT_RC; - qp_attr.sq_sig_all = 1; -- qp_attr.cap.max_send_wr = RS_QP_SIZE; -- qp_attr.cap.max_recv_wr = RS_QP_SIZE; -+ qp_attr.cap.max_send_wr = rs->sq_size; -+ qp_attr.cap.max_recv_wr = rs->rq_size; - qp_attr.cap.max_send_sge = 2; - qp_attr.cap.max_recv_sge = 1; - qp_attr.cap.max_inline_data = RS_INLINE; -@@ -337,7 +369,7 @@ static int rs_create_ep(struct rsocket *rs) - if (ret) - return ret; - -- for (i = 0; i < RS_QP_SIZE; i++) { -+ for (i = 0; i < rs->rq_size; i++) { - ret = rdma_post_recvv(rs->cm_id, NULL, NULL, 0); - if (ret) - return ret; -@@ -350,6 +382,9 @@ static void rs_free(struct rsocket *rs) - if (rs->index >= 0) - rs_remove(rs); - -+ if (rs->rmsg) -+ free(rs->rmsg); -+ - if (rs->sbuf) { - if (rs->smr) - rdma_dereg_mr(rs->smr); -@@ -386,7 +421,7 @@ static void rs_set_conn_data(struct rsocket *rs, struct rdma_conn_param *param, - { - conn->version = 1; - conn->flags = rs_host_is_net() ? RS_CONN_FLAG_NET : 0; -- conn->credits = htons(RS_QP_SIZE); -+ conn->credits = htons(rs->rq_size); - conn->reserved2 = 0; - - conn->target_sgl.addr = htonll((uintptr_t) rs->target_sgl); -@@ -706,7 +741,7 @@ static void rs_send_credits(struct rsocket *rs) - struct rs_sge sge; - - rs->ctrl_avail--; -- rs->rseq_comp = rs->rseq_no + (RS_QP_SIZE >> 1); -+ rs->rseq_comp = rs->rseq_no + (rs->rq_size >> 1); - if (rs->rbuf_bytes_avail >= (rs->rbuf_size >> 1)) { - if (!(rs->opts & RS_OPT_SWAP_SGL)) { - sge.addr = (uintptr_t) &rs->rbuf[rs->rbuf_free_offset]; -@@ -723,7 +758,7 @@ static void rs_send_credits(struct rsocket *rs) - ibsge.length = sizeof(sge); - - rs_post_write(rs, 0, &ibsge, 1, -- rs_msg_set(RS_OP_SGL, rs->rseq_no + RS_QP_SIZE), -+ rs_msg_set(RS_OP_SGL, rs->rseq_no + rs->rq_size), - IBV_SEND_INLINE, - rs->remote_sgl.addr + - rs->remote_sge * sizeof(struct rs_sge), -@@ -737,7 +772,7 @@ static void rs_send_credits(struct rsocket *rs) - rs->remote_sge = 0; - } else { - rs_post_write(rs, 0, NULL, 0, -- rs_msg_set(RS_OP_SGL, rs->rseq_no + RS_QP_SIZE), 0, 0, 0); -+ rs_msg_set(RS_OP_SGL, rs->rseq_no + rs->rq_size), 0, 0, 0); - } - } - -@@ -781,7 +816,7 @@ static int rs_poll_cq(struct rsocket *rs) - default: - rs->rmsg[rs->rmsg_tail].op = rs_msg_op(imm_data); - rs->rmsg[rs->rmsg_tail].data = rs_msg_data(imm_data); -- if (++rs->rmsg_tail == RS_QP_SIZE + 1) -+ if (++rs->rmsg_tail == rs->rq_size + 1) - rs->rmsg_tail = 0; - break; - } -@@ -923,7 +958,7 @@ static int rs_have_rdata(struct rsocket *rs) - - static int rs_all_sends_done(struct rsocket *rs) - { -- return (rs->sqe_avail + rs->ctrl_avail) == RS_QP_SIZE; -+ return (rs->sqe_avail + rs->ctrl_avail) == rs->sq_size; - } - - static ssize_t rs_peek(struct rsocket *rs, void *buf, size_t len) -@@ -940,7 +975,7 @@ static ssize_t rs_peek(struct rsocket *rs, void *buf, size_t len) - rsize = left; - } else { - rsize = rs->rmsg[rmsg_head].data; -- if (++rmsg_head == RS_QP_SIZE + 1) -+ if (++rmsg_head == rs->rq_size + 1) - rmsg_head = 0; - } - -@@ -1001,7 +1036,7 @@ ssize_t rrecv(int socket, void *buf, size_t len, int flags) - } else { - rs->rseq_no++; - rsize = rs->rmsg[rs->rmsg_head].data; -- if (++rs->rmsg_head == RS_QP_SIZE + 1) -+ if (++rs->rmsg_head == rs->rq_size + 1) - rs->rmsg_head = 0; - } diff --git a/patches/rs-qpsize b/patches/rs-qpsize index 51e3a00e..3e735f9d 100644 --- a/patches/rs-qpsize +++ b/patches/rs-qpsize @@ -1,5 +1,5 @@ Bottom: 6bbc2f526b97dfafc16e7ec34dc8e4e1ce587f40 -Top: 6bbc2f526b97dfafc16e7ec34dc8e4e1ce587f40 +Top: b37d006a6372969ddf786ae8c3abe0509cfaef04 Author: Sean Hefty Date: 2012-05-18 17:07:11 -0700 @@ -15,4 +15,226 @@ Signed-off-by: Sean Hefty --- - +diff --git a/src/cma.h b/src/cma.h +index 7703fe8..669b681 100644 +--- a/src/cma.h ++++ b/src/cma.h +@@ -67,7 +67,7 @@ static inline uint64_t htonll(uint64_t x) { return x; } + static inline uint64_t ntohll(uint64_t x) { return x; } + #endif + +-#define min(a, b) (a < b ? a : b) ++#define min(a, b) ((a) < (b) ? a : b) + + /* + * Fast synchronization for low contention locking. +diff --git a/src/rsocket.c b/src/rsocket.c +index de0ec3e..495c2e3 100644 +--- a/src/rsocket.c ++++ b/src/rsocket.c +@@ -55,6 +55,8 @@ + #define RS_OLAP_START_SIZE 2048 + #define RS_MAX_TRANSFER 65536 + #define RS_QP_SIZE 512 ++#define RS_QP_MAX_SIZE 0xFFFE ++#define RS_QP_MIN_SIZE 8 + #define RS_QP_CTRL_SIZE 4 + #define RS_CONN_RETRIES 6 + #define RS_SGL_SIZE 2 +@@ -160,7 +162,9 @@ struct rsocket { + int sbuf_bytes_avail; + uint16_t sseq_no; + uint16_t sseq_comp; ++ uint16_t sq_size; + ++ uint16_t rq_size; + uint16_t rseq_no; + uint16_t rseq_comp; + int rbuf_bytes_avail; +@@ -168,7 +172,7 @@ struct rsocket { + int rbuf_offset; + int rmsg_head; + int rmsg_tail; +- struct rs_msg rmsg[RS_QP_SIZE + 1]; ++ struct rs_msg *rmsg; + + int remote_sge; + struct rs_sge remote_sgl; +@@ -222,8 +226,17 @@ static struct rsocket *rs_alloc(struct rsocket *inherited_rs) + return NULL; + + rs->index = -1; +- rs->sbuf_size = inherited_rs ? inherited_rs->sbuf_size : RS_BUF_SIZE; +- rs->rbuf_size = inherited_rs ? inherited_rs->rbuf_size : RS_BUF_SIZE; ++ if (inherited_rs) { ++ rs->sbuf_size = inherited_rs->sbuf_size; ++ rs->rbuf_size = inherited_rs->rbuf_size; ++ rs->sq_size = inherited_rs->sq_size; ++ rs->rq_size = inherited_rs->rq_size; ++ rs->ctrl_avail = inherited_rs->ctrl_avail; ++ } else { ++ rs->sbuf_size = rs->rbuf_size = RS_BUF_SIZE; ++ rs->sq_size = rs->rq_size = RS_QP_SIZE; ++ rs->ctrl_avail = RS_QP_CTRL_SIZE; ++ } + fastlock_init(&rs->slock); + fastlock_init(&rs->rlock); + fastlock_init(&rs->cq_lock); +@@ -244,8 +257,27 @@ static int rs_set_nonblocking(struct rsocket *rs, long arg) + return ret; + } + ++static void rs_set_qp_size(struct rsocket *rs) ++{ ++ struct ibv_device_attr attr; ++ uint16_t max_size; ++ ++ attr.max_qp_wr = RS_QP_SIZE; ++ ibv_query_device(rs->cm_id->verbs, &attr); ++ max_size = min(attr.max_qp_wr, RS_QP_MAX_SIZE); ++ ++ if (rs->sq_size > max_size) ++ rs->sq_size = max_size; ++ if (rs->rq_size > max_size) ++ rs->rq_size = max_size; ++} ++ + static int rs_init_bufs(struct rsocket *rs) + { ++ rs->rmsg = calloc(rs->rq_size + 1, sizeof(*rs->rmsg)); ++ if (!rs->rmsg) ++ return -1; ++ + rs->sbuf = calloc(rs->sbuf_size, sizeof(*rs->sbuf)); + if (!rs->sbuf) + return -1; +@@ -273,9 +305,8 @@ 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->ctrl_avail = RS_QP_CTRL_SIZE; +- rs->sqe_avail = RS_QP_SIZE - rs->ctrl_avail; +- rs->rseq_comp = RS_QP_SIZE >> 1; ++ rs->sqe_avail = rs->sq_size - rs->ctrl_avail; ++ rs->rseq_comp = rs->rq_size >> 1; + return 0; + } + +@@ -285,7 +316,7 @@ static int rs_create_cq(struct rsocket *rs) + if (!rs->cm_id->recv_cq_channel) + return -1; + +- rs->cm_id->recv_cq = ibv_create_cq(rs->cm_id->verbs, RS_QP_SIZE * 2, ++ rs->cm_id->recv_cq = ibv_create_cq(rs->cm_id->verbs, rs->sq_size + rs->rq_size, + rs->cm_id, rs->cm_id->recv_cq_channel, 0); + if (!rs->cm_id->recv_cq) + goto err1; +@@ -313,6 +344,7 @@ static int rs_create_ep(struct rsocket *rs) + struct ibv_qp_init_attr qp_attr; + int i, ret; + ++ rs_check_qp_size(rs); + ret = rs_init_bufs(rs); + if (ret) + return ret; +@@ -327,8 +359,8 @@ static int rs_create_ep(struct rsocket *rs) + qp_attr.recv_cq = rs->cm_id->recv_cq; + qp_attr.qp_type = IBV_QPT_RC; + qp_attr.sq_sig_all = 1; +- qp_attr.cap.max_send_wr = RS_QP_SIZE; +- qp_attr.cap.max_recv_wr = RS_QP_SIZE; ++ qp_attr.cap.max_send_wr = rs->sq_size; ++ qp_attr.cap.max_recv_wr = rs->rq_size; + qp_attr.cap.max_send_sge = 2; + qp_attr.cap.max_recv_sge = 1; + qp_attr.cap.max_inline_data = RS_INLINE; +@@ -337,7 +369,7 @@ static int rs_create_ep(struct rsocket *rs) + if (ret) + return ret; + +- for (i = 0; i < RS_QP_SIZE; i++) { ++ for (i = 0; i < rs->rq_size; i++) { + ret = rdma_post_recvv(rs->cm_id, NULL, NULL, 0); + if (ret) + return ret; +@@ -350,6 +382,9 @@ static void rs_free(struct rsocket *rs) + if (rs->index >= 0) + rs_remove(rs); + ++ if (rs->rmsg) ++ free(rs->rmsg); ++ + if (rs->sbuf) { + if (rs->smr) + rdma_dereg_mr(rs->smr); +@@ -386,7 +421,7 @@ static void rs_set_conn_data(struct rsocket *rs, struct rdma_conn_param *param, + { + conn->version = 1; + conn->flags = rs_host_is_net() ? RS_CONN_FLAG_NET : 0; +- conn->credits = htons(RS_QP_SIZE); ++ conn->credits = htons(rs->rq_size); + conn->reserved2 = 0; + + conn->target_sgl.addr = htonll((uintptr_t) rs->target_sgl); +@@ -706,7 +741,7 @@ static void rs_send_credits(struct rsocket *rs) + struct rs_sge sge; + + rs->ctrl_avail--; +- rs->rseq_comp = rs->rseq_no + (RS_QP_SIZE >> 1); ++ rs->rseq_comp = rs->rseq_no + (rs->rq_size >> 1); + if (rs->rbuf_bytes_avail >= (rs->rbuf_size >> 1)) { + if (!(rs->opts & RS_OPT_SWAP_SGL)) { + sge.addr = (uintptr_t) &rs->rbuf[rs->rbuf_free_offset]; +@@ -723,7 +758,7 @@ static void rs_send_credits(struct rsocket *rs) + ibsge.length = sizeof(sge); + + rs_post_write(rs, 0, &ibsge, 1, +- rs_msg_set(RS_OP_SGL, rs->rseq_no + RS_QP_SIZE), ++ rs_msg_set(RS_OP_SGL, rs->rseq_no + rs->rq_size), + IBV_SEND_INLINE, + rs->remote_sgl.addr + + rs->remote_sge * sizeof(struct rs_sge), +@@ -737,7 +772,7 @@ static void rs_send_credits(struct rsocket *rs) + rs->remote_sge = 0; + } else { + rs_post_write(rs, 0, NULL, 0, +- rs_msg_set(RS_OP_SGL, rs->rseq_no + RS_QP_SIZE), 0, 0, 0); ++ rs_msg_set(RS_OP_SGL, rs->rseq_no + rs->rq_size), 0, 0, 0); + } + } + +@@ -781,7 +816,7 @@ static int rs_poll_cq(struct rsocket *rs) + default: + rs->rmsg[rs->rmsg_tail].op = rs_msg_op(imm_data); + rs->rmsg[rs->rmsg_tail].data = rs_msg_data(imm_data); +- if (++rs->rmsg_tail == RS_QP_SIZE + 1) ++ if (++rs->rmsg_tail == rs->rq_size + 1) + rs->rmsg_tail = 0; + break; + } +@@ -923,7 +958,7 @@ static int rs_have_rdata(struct rsocket *rs) + + static int rs_all_sends_done(struct rsocket *rs) + { +- return (rs->sqe_avail + rs->ctrl_avail) == RS_QP_SIZE; ++ return (rs->sqe_avail + rs->ctrl_avail) == rs->sq_size; + } + + static ssize_t rs_peek(struct rsocket *rs, void *buf, size_t len) +@@ -940,7 +975,7 @@ static ssize_t rs_peek(struct rsocket *rs, void *buf, size_t len) + rsize = left; + } else { + rsize = rs->rmsg[rmsg_head].data; +- if (++rmsg_head == RS_QP_SIZE + 1) ++ if (++rmsg_head == rs->rq_size + 1) + rmsg_head = 0; + } + +@@ -1001,7 +1036,7 @@ ssize_t rrecv(int socket, void *buf, size_t len, int flags) + } else { + rs->rseq_no++; + rsize = rs->rmsg[rs->rmsg_head].data; +- if (++rs->rmsg_head == RS_QP_SIZE + 1) ++ if (++rs->rmsg_head == rs->rq_size + 1) + rs->rmsg_head = 0; + } -- 2.41.0