From: Sean Hefty <[email protected]>
---
 trunk/ulp/librdmacm/include/rdma/rdma_cma.h |   10 +++++-----
 trunk/ulp/librdmacm/src/cma.cpp             |   20 ++++++++++++++++----
 2 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/trunk/ulp/librdmacm/include/rdma/rdma_cma.h 
b/trunk/ulp/librdmacm/include/rdma/rdma_cma.h
index 4604560..3836483 100644
--- a/trunk/ulp/librdmacm/include/rdma/rdma_cma.h
+++ b/trunk/ulp/librdmacm/include/rdma/rdma_cma.h
@@ -74,15 +74,15 @@ enum rdma_cm_event_type
 enum rdma_port_space
 {
        RDMA_PS_IPOIB   = 0x0002,
-       RDMA_PS_IB              = 0x0003,
+       RDMA_PS_IB              = 0x0003,
        RDMA_PS_TCP             = 0x0106,
        RDMA_PS_UDP             = 0x0111,
 };
 
-#define RDMA_IB_IP_PS_MASK   0xFFFFFFFFFFFF0000ULL
-#define RDMA_IB_IP_PORT_MASK 0x000000000000FFFFULL
-#define RDMA_IB_IP_PS_TCP    0x0000000001060000ULL
-#define RDMA_IB_IP_PS_UDP    0x0000000001110000ULL
+#define RDMA_IB_IP_PS_MASK   0xFFFFFFFFFFFF0000ULL
+#define RDMA_IB_IP_PORT_MASK 0x000000000000FFFFULL
+#define RDMA_IB_IP_PS_TCP    0x0000000001060000ULL
+#define RDMA_IB_IP_PS_UDP    0x0000000001110000ULL
 
 /*
  * Global qkey value for UDP QPs and multicast groups created via the 
diff --git a/trunk/ulp/librdmacm/src/cma.cpp b/trunk/ulp/librdmacm/src/cma.cpp
index 2698bde..3c7bed2 100644
--- a/trunk/ulp/librdmacm/src/cma.cpp
+++ b/trunk/ulp/librdmacm/src/cma.cpp
@@ -79,6 +79,7 @@ struct cma_id_private
 struct cma_device
 {
        struct ibv_context      *verbs;
+       struct ibv_pd           *pd;
        uint64_t                        guid;
        int                                     port_cnt;
        uint8_t                         max_initiator_depth;
@@ -134,6 +135,13 @@ static int ucma_acquire(void)
                        goto err4;
                }
 
+               cma_dev->pd = ibv_alloc_pd(cma_dev->verbs);
+               if (cma_dev->pd == NULL) {
+                       ibv_close_device(cma_dev->verbs);
+                       ret = -1;
+                       goto err4;
+               }
+
                ++i;
                ret = ibv_query_device(cma_dev->verbs, &attr);
                if (ret) {
@@ -151,8 +159,9 @@ out:
        return 0;
 
 err4:
-       while (i) {
-               ibv_close_device(cma_dev_array[--i].verbs);
+       while (i--) {
+               ibv_dealloc_pd(cma_dev_array[i].pd);
+               ibv_close_device(cma_dev_array[i].verbs);
        }
        delete cma_dev_array;
 err3:
@@ -172,6 +181,7 @@ void ucma_release(void)
        EnterCriticalSection(&lock);
        if (--ref == 0) {
                for (i = 0; i < cma_dev_cnt; i++) {
+                       ibv_dealloc_pd(cma_dev_array[i].pd);
                        ibv_close_device(cma_dev_array[i].verbs);
                }
                delete cma_dev_array;
@@ -635,8 +645,10 @@ int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd 
*pd,
        int ret;
 
        id_priv = CONTAINING_RECORD(id, struct cma_id_private, id);
-       if (id->verbs != pd->context) {
-               return -1;
+       if (!pd) {
+               pd = id_priv->cma_dev->pd;
+       } else if (id->verbs != pd->context) {
+               return rdma_seterrno(EINVAL);
        }
 
        qp = ibv_create_qp(pd, qp_init_attr);

_______________________________________________
ofw mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw

Reply via email to