Skip to content

Commit 995eb0c

Browse files
committed
rdmacm: Add support for XRC QPs
Export a new extended create QP call. Add support for XRC QPs. Signed-off-by: Sean Hefty <[email protected]>
1 parent 05eabc5 commit 995eb0c

File tree

3 files changed

+47
-16
lines changed

3 files changed

+47
-16
lines changed

include/rdma/rdma_cma.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* Copyright (c) 2005 Voltaire Inc. All rights reserved.
3-
* Copyright (c) 2005-2012 Intel Corporation. All rights reserved.
3+
* Copyright (c) 2005-2014 Intel Corporation. All rights reserved.
44
*
55
* This software is available to you under a choice of one of two
66
* licenses. You may choose to be licensed under the terms of the GNU
@@ -384,6 +384,8 @@ int rdma_resolve_route(struct rdma_cm_id *id, int timeout_ms);
384384
*/
385385
int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd *pd,
386386
struct ibv_qp_init_attr *qp_init_attr);
387+
int rdma_create_qp_ex(struct rdma_cm_id *id,
388+
struct ibv_qp_init_attr_ex *qp_init_attr);
387389

388390
/**
389391
* rdma_destroy_qp - Deallocate a QP.

src/cma.c

+43-15
Original file line numberDiff line numberDiff line change
@@ -1333,8 +1333,8 @@ void rdma_destroy_srq(struct rdma_cm_id *id)
13331333
ucma_destroy_cqs(id);
13341334
}
13351335

1336-
int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd *pd,
1337-
struct ibv_qp_init_attr *qp_init_attr)
1336+
int rdma_create_qp_ex(struct rdma_cm_id *id,
1337+
struct ibv_qp_init_attr_ex *attr)
13381338
{
13391339
struct cma_id_private *id_priv;
13401340
struct ibv_qp *qp;
@@ -1344,23 +1344,37 @@ int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd *pd,
13441344
return ERR(EINVAL);
13451345

13461346
id_priv = container_of(id, struct cma_id_private, id);
1347-
if (!pd)
1348-
pd = id->pd;
1349-
else if (id->verbs != pd->context)
1347+
if (!(attr->comp_mask & IBV_QP_INIT_ATTR_PD) || !attr->pd) {
1348+
attr->comp_mask |= IBV_QP_INIT_ATTR_PD;
1349+
attr->pd = id->pd;
1350+
} else if (id->verbs != attr->pd->context)
1351+
return ERR(EINVAL);
1352+
1353+
if ((id->recv_cq && attr->recv_cq && id->recv_cq != attr->recv_cq) ||
1354+
(id->send_cq && attr->send_cq && id->send_cq != attr->send_cq))
13501355
return ERR(EINVAL);
13511356

1352-
ret = ucma_create_cqs(id, qp_init_attr->send_cq ? 0 : qp_init_attr->cap.max_send_wr,
1353-
qp_init_attr->recv_cq ? 0 : qp_init_attr->cap.max_recv_wr);
1357+
if (id->qp_type == IBV_QPT_XRC_RECV) {
1358+
if (!(attr->comp_mask & IBV_QP_INIT_ATTR_XRCD) || !attr->xrcd) {
1359+
attr->xrcd = ucma_get_xrcd(id_priv->cma_dev);
1360+
if (!attr->xrcd)
1361+
return -1;
1362+
attr->comp_mask |= IBV_QP_INIT_ATTR_XRCD;
1363+
}
1364+
}
1365+
1366+
ret = ucma_create_cqs(id, attr->send_cq || id->send_cq ? 0 : attr->cap.max_send_wr,
1367+
attr->recv_cq || id->recv_cq ? 0 : attr->cap.max_recv_wr);
13541368
if (ret)
13551369
return ret;
13561370

1357-
if (!qp_init_attr->send_cq)
1358-
qp_init_attr->send_cq = id->send_cq;
1359-
if (!qp_init_attr->recv_cq)
1360-
qp_init_attr->recv_cq = id->recv_cq;
1361-
if (id->srq && !qp_init_attr->srq)
1362-
qp_init_attr->srq = id->srq;
1363-
qp = ibv_create_qp(pd, qp_init_attr);
1371+
if (!attr->send_cq)
1372+
attr->send_cq = id->send_cq;
1373+
if (!attr->recv_cq)
1374+
attr->recv_cq = id->recv_cq;
1375+
if (id->srq && !attr->srq)
1376+
attr->srq = id->srq;
1377+
qp = ibv_create_qp_ex(id->verbs, attr);
13641378
if (!qp) {
13651379
ret = ERR(ENOMEM);
13661380
goto err1;
@@ -1373,7 +1387,7 @@ int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd *pd,
13731387
if (ret)
13741388
goto err2;
13751389

1376-
id->pd = pd;
1390+
id->pd = qp->pd;
13771391
id->qp = qp;
13781392
return 0;
13791393
err2:
@@ -1383,6 +1397,20 @@ int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd *pd,
13831397
return ret;
13841398
}
13851399

1400+
int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd *pd,
1401+
struct ibv_qp_init_attr *qp_init_attr)
1402+
{
1403+
struct ibv_qp_init_attr_ex attr_ex;
1404+
int ret;
1405+
1406+
memcpy(&attr_ex, qp_init_attr, sizeof *qp_init_attr);
1407+
attr_ex.comp_mask = IBV_QP_INIT_ATTR_PD;
1408+
attr_ex.pd = pd ? pd : id->pd;
1409+
ret = rdma_create_qp_ex(id, &attr_ex);
1410+
memcpy(qp_init_attr, &attr_ex, sizeof *qp_init_attr);
1411+
return ret;
1412+
}
1413+
13861414
void rdma_destroy_qp(struct rdma_cm_id *id)
13871415
{
13881416
ibv_destroy_qp(id->qp);

src/librdmacm.map

+1
Original file line numberDiff line numberDiff line change
@@ -67,5 +67,6 @@ RDMACM_1.0 {
6767
riounmap;
6868
riowrite;
6969
rdma_create_srq_ex;
70+
rdma_create_qp_ex;
7071
local: *;
7172
};

0 commit comments

Comments
 (0)