@@ -51,6 +51,8 @@ DECLARE_DRV_CMD(urxe_create_qp_ex, IB_USER_VERBS_EX_CMD_CREATE_QP,
empty, rxe_create_qp_resp);
DECLARE_DRV_CMD(urxe_create_srq, IB_USER_VERBS_CMD_CREATE_SRQ,
empty, rxe_create_srq_resp);
+DECLARE_DRV_CMD(urxe_create_srq_ex, IB_USER_VERBS_CMD_CREATE_XSRQ,
+ empty, rxe_create_srq_resp);
DECLARE_DRV_CMD(urxe_modify_srq, IB_USER_VERBS_CMD_MODIFY_SRQ,
rxe_modify_srq_cmd, empty);
DECLARE_DRV_CMD(urxe_resize_cq, IB_USER_VERBS_CMD_RESIZE_CQ,
@@ -636,7 +636,7 @@ static struct ibv_srq *rxe_create_srq(struct ibv_pd *pd,
if (srq == NULL)
return NULL;
- ret = ibv_cmd_create_srq(pd, &srq->ibv_srq, attr, &cmd, sizeof(cmd),
+ ret = ibv_cmd_create_srq(pd, &srq->vsrq.srq, attr, &cmd, sizeof(cmd),
&resp.ibv_resp, sizeof(resp));
if (ret) {
free(srq);
@@ -647,7 +647,7 @@ static struct ibv_srq *rxe_create_srq(struct ibv_pd *pd,
PROT_READ | PROT_WRITE, MAP_SHARED,
pd->context->cmd_fd, resp.mi.offset);
if ((void *)srq->rq.queue == MAP_FAILED) {
- ibv_cmd_destroy_srq(&srq->ibv_srq);
+ ibv_cmd_destroy_srq(&srq->vsrq.srq);
free(srq);
return NULL;
}
@@ -656,7 +656,44 @@ static struct ibv_srq *rxe_create_srq(struct ibv_pd *pd,
srq->rq.max_sge = attr->attr.max_sge;
pthread_spin_init(&srq->rq.lock, PTHREAD_PROCESS_PRIVATE);
- return &srq->ibv_srq;
+ return &srq->vsrq.srq;
+}
+
+static struct ibv_srq *rxe_create_srq_ex(struct ibv_context *context,
+ struct ibv_srq_init_attr_ex *attr_ex)
+{
+ struct rxe_srq *srq;
+ struct ibv_create_xsrq cmd = {};
+ size_t cmd_size = sizeof(cmd);
+ struct urxe_create_srq_ex_resp resp = {};
+ size_t resp_size = sizeof(resp);
+ int ret;
+
+ srq = calloc(1, sizeof(*srq));
+ if (!srq)
+ return NULL;
+
+ ret = ibv_cmd_create_srq_ex(context, &srq->vsrq, attr_ex,
+ &cmd, cmd_size, &resp.ibv_resp, resp_size);
+ if (ret) {
+ free(srq);
+ return NULL;
+ }
+
+ srq->rq.queue = mmap(NULL, resp.mi.size,
+ PROT_READ | PROT_WRITE, MAP_SHARED,
+ context->cmd_fd, resp.mi.offset);
+ if ((void *)srq->rq.queue == MAP_FAILED) {
+ ibv_cmd_destroy_srq(&srq->vsrq.srq);
+ free(srq);
+ return NULL;
+ }
+
+ srq->mmap_info = resp.mi;
+ srq->rq.max_sge = attr_ex->attr.max_sge;
+ pthread_spin_init(&srq->rq.lock, PTHREAD_PROCESS_PRIVATE);
+
+ return &srq->vsrq.srq;
}
static int rxe_modify_srq(struct ibv_srq *ibsrq,
@@ -708,13 +745,13 @@ static int rxe_query_srq(struct ibv_srq *srq, struct ibv_srq_attr *attr)
return ibv_cmd_query_srq(srq, attr, &cmd, sizeof(cmd));
}
-static int rxe_destroy_srq(struct ibv_srq *ibvsrq)
+static int rxe_destroy_srq(struct ibv_srq *ibsrq)
{
int ret;
- struct rxe_srq *srq = to_rsrq(ibvsrq);
+ struct rxe_srq *srq = to_rsrq(ibsrq);
struct rxe_queue_buf *q = srq->rq.queue;
- ret = ibv_cmd_destroy_srq(ibvsrq);
+ ret = ibv_cmd_destroy_srq(ibsrq);
if (!ret) {
if (srq->mmap_info.size)
munmap(q, srq->mmap_info.size);
@@ -765,11 +802,11 @@ out:
return rc;
}
-static int rxe_post_srq_recv(struct ibv_srq *ibvsrq,
+static int rxe_post_srq_recv(struct ibv_srq *ibsrq,
struct ibv_recv_wr *recv_wr,
struct ibv_recv_wr **bad_recv_wr)
{
- struct rxe_srq *srq = to_rsrq(ibvsrq);
+ struct rxe_srq *srq = to_rsrq(ibsrq);
int rc = 0;
pthread_spin_lock(&srq->rq.lock);
@@ -1794,6 +1831,7 @@ static const struct verbs_context_ops rxe_ctx_ops = {
.resize_cq = rxe_resize_cq,
.destroy_cq = rxe_destroy_cq,
.create_srq = rxe_create_srq,
+ .create_srq_ex = rxe_create_srq_ex,
.modify_srq = rxe_modify_srq,
.query_srq = rxe_query_srq,
.destroy_srq = rxe_destroy_srq,
@@ -91,10 +91,9 @@ struct rxe_qp {
};
struct rxe_srq {
- struct ibv_srq ibv_srq;
+ struct verbs_srq vsrq;
struct mminfo mmap_info;
struct rxe_wq rq;
- uint32_t srq_num;
};
#define to_rxxx(xxx, type) container_of(ib##xxx, struct rxe_##type, ibv_##xxx)
@@ -121,7 +120,7 @@ static inline struct rxe_qp *to_rqp(struct ibv_qp *ibqp)
static inline struct rxe_srq *to_rsrq(struct ibv_srq *ibsrq)
{
- return to_rxxx(srq, srq);
+ return container_of(ibsrq, struct rxe_srq, vsrq.srq);
}
static inline struct rxe_ah *to_rah(struct ibv_ah *ibah)
Add support for the ibv_create_srq_ex verb. Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com> --- providers/rxe/rxe-abi.h | 2 ++ providers/rxe/rxe.c | 54 +++++++++++++++++++++++++++++++++++------ providers/rxe/rxe.h | 5 ++-- 3 files changed, 50 insertions(+), 11 deletions(-)