[ofw] [PATCH 4/11] librdmacm: make cq parameters optional

Hefty, Sean sean.hefty at intel.com
Mon Aug 16 16:17:47 PDT 2010


From: Sean Hefty <sean.hefty at intel.com>
---
 trunk/ulp/librdmacm/include/rdma/rdma_cma.h |    4 ++
 trunk/ulp/librdmacm/src/cma.cpp             |   64 ++++++++++++++++++++++++++-
 2 files changed, 65 insertions(+), 3 deletions(-)

diff --git a/trunk/ulp/librdmacm/include/rdma/rdma_cma.h b/trunk/ulp/librdmacm/include/rdma/rdma_cma.h
index 3836483..16f7f21 100644
--- a/trunk/ulp/librdmacm/include/rdma/rdma_cma.h
+++ b/trunk/ulp/librdmacm/include/rdma/rdma_cma.h
@@ -140,6 +140,10 @@ struct rdma_cm_id
 	}	ep;
 
 	struct rdma_cm_event		*event;
+	struct ibv_comp_channel		*send_cq_channel;
+	struct ibv_cq				*send_cq;
+	struct ibv_comp_channel		*recv_cq_channel;
+	struct ibv_cq				*recv_cq;
 };
 
 struct rdma_conn_param
diff --git a/trunk/ulp/librdmacm/src/cma.cpp b/trunk/ulp/librdmacm/src/cma.cpp
index 3c7bed2..0d6e6f5 100644
--- a/trunk/ulp/librdmacm/src/cma.cpp
+++ b/trunk/ulp/librdmacm/src/cma.cpp
@@ -636,6 +636,55 @@ static int ucma_init_ud_qp(struct cma_id_private *id_priv, struct ibv_qp *qp)
 						 (IBV_QP_STATE | IBV_QP_SQ_PSN));
 }
 
+static void ucma_destroy_cqs(struct rdma_cm_id *id)
+{
+	if (id->recv_cq)
+		ibv_destroy_cq(id->recv_cq);
+
+	if (id->recv_cq_channel)
+		ibv_destroy_comp_channel(id->recv_cq_channel);
+
+	if (id->send_cq)
+		ibv_destroy_cq(id->send_cq);
+
+	if (id->send_cq_channel)
+		ibv_destroy_comp_channel(id->send_cq_channel);
+}
+
+static int ucma_create_cqs(struct rdma_cm_id *id, struct ibv_qp_init_attr *attr)
+{
+	if (!attr->recv_cq) {
+		id->recv_cq_channel = ibv_create_comp_channel(id->verbs);
+		if (!id->recv_cq_channel)
+			goto err;
+
+		id->recv_cq = ibv_create_cq(id->verbs, attr->cap.max_recv_wr,
+					    id, id->recv_cq_channel, 0);
+		if (!id->recv_cq)
+			goto err;
+
+		attr->recv_cq = id->recv_cq;
+	}
+
+	if (!attr->send_cq) {
+		id->send_cq_channel = ibv_create_comp_channel(id->verbs);
+		if (!id->send_cq_channel)
+			goto err;
+
+		id->send_cq = ibv_create_cq(id->verbs, attr->cap.max_send_wr,
+					    id, id->send_cq_channel, 0);
+		if (!id->send_cq)
+			goto err;
+
+		attr->send_cq = id->send_cq;
+	}
+
+	return 0;
+err:
+	ucma_destroy_cqs(id);
+	return rdma_seterrno(ENOMEM);
+}
+
 __declspec(dllexport)
 int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd *pd,
 				   struct ibv_qp_init_attr *qp_init_attr)
@@ -651,9 +700,15 @@ int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd *pd,
 		return rdma_seterrno(EINVAL);
 	}
 
+	ret = ucma_create_cqs(id, qp_init_attr);
+	if (ret) {
+		return ret;
+	}
+
 	qp = ibv_create_qp(pd, qp_init_attr);
 	if (!qp) {
-		return -1;
+		ret = rdma_seterrno(ENOMEM);
+		goto err1;
 	}
 
 	if (id->ps == RDMA_PS_TCP) {
@@ -662,13 +717,15 @@ int rdma_create_qp(struct rdma_cm_id *id, struct ibv_pd *pd,
 		ret = ucma_init_ud_qp(id_priv, qp);
 	}
 	if (ret) {
-		goto err;
+		goto err2;
 	}
 
 	id->qp = qp;
 	return 0;
-err:
+err2:
 	ibv_destroy_qp(qp);
+err1:
+	ucma_destroy_cqs(id);
 	return ret;
 }
 
@@ -676,6 +733,7 @@ __declspec(dllexport)
 void rdma_destroy_qp(struct rdma_cm_id *id)
 {
 	ibv_destroy_qp(id->qp);
+	ucma_destroy_cqs(id);
 }
 
 static int ucma_valid_param(struct cma_id_private *id_priv,




More information about the ofw mailing list