From: Sean Hefty <[email protected]>

XRC QPs and SRQs are associated by an XRC domain.  Provide a
call to allocate an XRCD, similar to how the rdmacm allocates
a PD for the user.

Signed-off-by: Sean Hefty <[email protected]>
---
 src/cma.c |   22 +++++++++++++++++++++-
 1 files changed, 21 insertions(+), 1 deletions(-)

diff --git a/src/cma.c b/src/cma.c
index 192d9ed..52d81ff 100644
--- a/src/cma.c
+++ b/src/cma.c
@@ -76,6 +76,7 @@ do {                                          \
 struct cma_device {
        struct ibv_context *verbs;
        struct ibv_pd      *pd;
+       struct ibv_xrcd    *xrcd;
        uint64_t            guid;
        int                 port_cnt;
        int                 refcnt;
@@ -439,9 +440,28 @@ out:
 static void ucma_put_device(struct cma_device *cma_dev)
 {
        pthread_mutex_lock(&mut);
-       if (!--cma_dev->refcnt)
+       if (!--cma_dev->refcnt) {
                ibv_dealloc_pd(cma_dev->pd);
+               if (cma_dev->xrcd)
+                       ibv_close_xrcd(cma_dev->xrcd);
+       }
+       pthread_mutex_unlock(&mut);
+}
+
+static struct ibv_xrcd *ucma_get_xrcd(struct cma_device *cma_dev)
+{
+       struct ibv_xrcd_init_attr attr;
+
+       pthread_mutex_lock(&mut);
+       if (!cma_dev->xrcd) {
+               memset(&attr, 0, sizeof attr);
+               attr.comp_mask = IBV_XRCD_INIT_ATTR_FD | 
IBV_XRCD_INIT_ATTR_OFLAGS;
+               attr.fd = -1;
+               attr.oflags = O_CREAT;
+               cma_dev->xrcd = ibv_open_xrcd(cma_dev->verbs, &attr);
+       }
        pthread_mutex_unlock(&mut);
+       return cma_dev->xrcd;
 }
 
 static void ucma_insert_id(struct cma_id_private *id_priv)
-- 
1.7.3

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to