]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
rdmacm: Add support for XRC QPs
authorSean Hefty <sean.hefty@intel.com>
Wed, 2 Jul 2014 00:47:22 +0000 (17:47 -0700)
committerSean Hefty <sean.hefty@intel.com>
Wed, 2 Jul 2014 05:48:07 +0000 (22:48 -0700)
Export a new extended create QP call.  Add support for XRC
QPs.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
include/rdma/rdma_cma.h
src/cma.c
src/librdmacm.map

index 4c4a057eaec530d0768ec8e352ed2e60e439b18f..4826c0304b0b4c9f3ba794952b9b723368d5fe5a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2005 Voltaire Inc.  All rights reserved.
- * Copyright (c) 2005-2012 Intel Corporation.  All rights reserved.
+ * Copyright (c) 2005-2014 Intel Corporation.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * 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);
  */
 int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd *pd,
                   struct ibv_qp_init_attr *qp_init_attr);
+int rdma_create_qp_ex(struct rdma_cm_id *id,
+                     struct ibv_qp_init_attr_ex *qp_init_attr);
 
 /**
  * rdma_destroy_qp - Deallocate a QP.
index 8c9ea95867e5569f0e3e54b0c4ae45b12a983e2b..749140ecbfd98db074ff303b501bb5dec2a51f21 100644 (file)
--- a/src/cma.c
+++ b/src/cma.c
@@ -1333,8 +1333,8 @@ void rdma_destroy_srq(struct rdma_cm_id *id)
        ucma_destroy_cqs(id);
 }
 
-int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd *pd,
-                  struct ibv_qp_init_attr *qp_init_attr)
+int rdma_create_qp_ex(struct rdma_cm_id *id,
+                     struct ibv_qp_init_attr_ex *attr)
 {
        struct cma_id_private *id_priv;
        struct ibv_qp *qp;
@@ -1344,23 +1344,37 @@ int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd *pd,
                return ERR(EINVAL);
 
        id_priv = container_of(id, struct cma_id_private, id);
-       if (!pd)
-               pd = id->pd;
-       else if (id->verbs != pd->context)
+       if (!(attr->comp_mask & IBV_QP_INIT_ATTR_PD) || !attr->pd) {
+               attr->comp_mask |= IBV_QP_INIT_ATTR_PD;
+               attr->pd = id->pd;
+       } else if (id->verbs != attr->pd->context)
+               return ERR(EINVAL);
+
+       if ((id->recv_cq && attr->recv_cq && id->recv_cq != attr->recv_cq) ||
+           (id->send_cq && attr->send_cq && id->send_cq != attr->send_cq))
                return ERR(EINVAL);
 
-       ret = ucma_create_cqs(id, qp_init_attr->send_cq ? 0 : qp_init_attr->cap.max_send_wr,
-                             qp_init_attr->recv_cq ? 0 : qp_init_attr->cap.max_recv_wr);
+       if (id->qp_type == IBV_QPT_XRC_RECV) {
+               if (!(attr->comp_mask & IBV_QP_INIT_ATTR_XRCD) || !attr->xrcd) {
+                       attr->xrcd = ucma_get_xrcd(id_priv->cma_dev);
+                       if (!attr->xrcd)
+                               return -1;
+                       attr->comp_mask |= IBV_QP_INIT_ATTR_XRCD;
+               }
+       }
+
+       ret = ucma_create_cqs(id, attr->send_cq || id->send_cq ? 0 : attr->cap.max_send_wr,
+                                 attr->recv_cq || id->recv_cq ? 0 : attr->cap.max_recv_wr);
        if (ret)
                return ret;
 
-       if (!qp_init_attr->send_cq)
-               qp_init_attr->send_cq = id->send_cq;
-       if (!qp_init_attr->recv_cq)
-               qp_init_attr->recv_cq = id->recv_cq;
-       if (id->srq && !qp_init_attr->srq)
-               qp_init_attr->srq = id->srq;
-       qp = ibv_create_qp(pd, qp_init_attr);
+       if (!attr->send_cq)
+               attr->send_cq = id->send_cq;
+       if (!attr->recv_cq)
+               attr->recv_cq = id->recv_cq;
+       if (id->srq && !attr->srq)
+               attr->srq = id->srq;
+       qp = ibv_create_qp_ex(id->verbs, attr);
        if (!qp) {
                ret = ERR(ENOMEM);
                goto err1;
@@ -1373,7 +1387,7 @@ int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd *pd,
        if (ret)
                goto err2;
 
-       id->pd = pd;
+       id->pd = qp->pd;
        id->qp = qp;
        return 0;
 err2:
@@ -1383,6 +1397,20 @@ err1:
        return ret;
 }
 
+int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd *pd,
+                  struct ibv_qp_init_attr *qp_init_attr)
+{
+       struct ibv_qp_init_attr_ex attr_ex;
+       int ret;
+
+       memcpy(&attr_ex, qp_init_attr, sizeof *qp_init_attr);
+       attr_ex.comp_mask = IBV_QP_INIT_ATTR_PD;
+       attr_ex.pd = pd ? pd : id->pd;
+       ret = rdma_create_qp_ex(id, &attr_ex);
+       memcpy(qp_init_attr, &attr_ex, sizeof *qp_init_attr);
+       return ret;
+}
+
 void rdma_destroy_qp(struct rdma_cm_id *id)
 {
        ibv_destroy_qp(id->qp);
index bf0b3e0da0580513b488d2bff701d8e2c8eca1f1..ffbd199d3119b14908656c625b7d93dca9441166 100644 (file)
@@ -67,5 +67,6 @@ RDMACM_1.0 {
                riounmap;
                riowrite;
                rdma_create_srq_ex;
+               rdma_create_qp_ex;
        local: *;
 };