]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
rdmacm: Add functionality to allocate an XRCD
authorSean Hefty <sean.hefty@intel.com>
Tue, 1 Jul 2014 23:46:34 +0000 (16:46 -0700)
committerSean Hefty <sean.hefty@intel.com>
Tue, 1 Jul 2014 23:46:34 +0000 (16:46 -0700)
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 <sean.hefty@intel.com>
src/cma.c

index 192d9ed436777349c091b335bf0c27b2ed66cfdc..52d81ffae659bbae662a2366502d1a8901aacf1e 100644 (file)
--- 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)