[ofw] [PATCH 05/15] uDAPL v2.0 cma, scm, ucm: allow EP (QP) creation without EVD (CQ)
Davis, Arlin R
arlin.r.davis at intel.com
Mon Apr 23 13:00:55 PDT 2012
Provide ability to create a EP/QP with no EVD/CQ on either the
request or receive queue. The current implementation allows on
receive queue but not request queue. Not all ofa devices support
a null CQ so if necessary create a dummy CQ at the time of
QP creation. Also, if no CQ is specified set appropriate QP
max wr/sge attributes to zero.
Signed-off-by: Arlin Davis <arlin.r.davis at intel.com>
---
dapl/openib_common/qp.c | 41 +++++++++++++++++------------------------
1 files changed, 17 insertions(+), 24 deletions(-)
diff --git a/dapl/openib_common/qp.c b/dapl/openib_common/qp.c
index 94bb1ed..16ce594 100644
--- a/dapl/openib_common/qp.c
+++ b/dapl/openib_common/qp.c
@@ -79,29 +79,30 @@ dapls_ib_qp_alloc(IN DAPL_IA * ia_ptr,
* Create a CQ with zero entries under the covers to support and
* catch any invalid posting.
*/
- if (rcv_evd != DAT_HANDLE_NULL)
- rcv_cq = rcv_evd->ib_cq_handle;
- else if (!ia_ptr->hca_ptr->ib_trans.ib_cq_empty)
- rcv_cq = ia_ptr->hca_ptr->ib_trans.ib_cq_empty;
- else {
+ if ((!rcv_evd || !req_evd) && !ia_ptr->hca_ptr->ib_trans.ib_cq_empty) {
struct ibv_comp_channel *channel;
channel = ibv_create_comp_channel(ia_ptr->hca_ptr->ib_hca_handle);
if (!channel)
- return (dapl_convert_errno(ENOMEM, "create_cq"));
+ return (dapl_convert_errno(ENOMEM, "create_cq_chan"));
/* Call IB verbs to create CQ */
rcv_cq = ibv_create_cq(ia_ptr->hca_ptr->ib_hca_handle,
- 0, NULL, channel, 0);
+ 1, NULL, channel, 0);
if (rcv_cq == IB_INVALID_HANDLE) {
ibv_destroy_comp_channel(channel);
return (dapl_convert_errno(ENOMEM, "create_cq"));
}
-
ia_ptr->hca_ptr->ib_trans.ib_cq_empty = rcv_cq;
}
- if (req_evd != DAT_HANDLE_NULL)
+
+ if (rcv_evd)
+ rcv_cq = rcv_evd->ib_cq_handle;
+ else
+ rcv_cq = ia_ptr->hca_ptr->ib_trans.ib_cq_empty;
+
+ if (req_evd)
req_cq = req_evd->ib_cq_handle;
else
req_cq = ia_ptr->hca_ptr->ib_trans.ib_cq_empty;
@@ -133,9 +134,12 @@ dapls_ib_qp_alloc(IN DAPL_IA * ia_ptr,
#endif
/* Setup attributes and create qp */
dapl_os_memzero((void *)&qp_create, sizeof(qp_create));
+ qp_create.recv_cq = rcv_cq;
+ qp_create.cap.max_recv_wr = rcv_evd ? attr->max_recv_dtos:0;
+ qp_create.cap.max_recv_sge = rcv_evd ? attr->max_recv_iov:0;
qp_create.send_cq = req_cq;
- qp_create.cap.max_send_wr = attr->max_request_dtos;
- qp_create.cap.max_send_sge = attr->max_request_iov;
+ qp_create.cap.max_send_wr = req_evd ? attr->max_request_dtos:0;
+ qp_create.cap.max_send_sge = req_evd ? attr->max_request_iov:0;
qp_create.cap.max_inline_data =
ia_ptr->hca_ptr->ib_trans.max_inline_send;
qp_create.qp_type = IBV_QPT_RC;
@@ -153,17 +157,6 @@ dapls_ib_qp_alloc(IN DAPL_IA * ia_ptr,
}
}
#endif
-
- /* ibv assumes rcv_cq is never NULL, set to req_cq */
- if (rcv_cq == NULL) {
- qp_create.recv_cq = req_cq;
- qp_create.cap.max_recv_wr = 0;
- qp_create.cap.max_recv_sge = 0;
- } else {
- qp_create.recv_cq = rcv_cq;
- qp_create.cap.max_recv_wr = attr->max_recv_dtos;
- qp_create.cap.max_recv_sge = attr->max_recv_iov;
- }
#ifdef _OPENIB_CMA_
if (rdma_create_qp(conn->cm_id, ib_pd_handle, &qp_create)) {
@@ -178,7 +171,7 @@ dapls_ib_qp_alloc(IN DAPL_IA * ia_ptr,
ep_ptr->qp_handle = ibv_create_qp(ib_pd_handle, &qp_create);
if (!ep_ptr->qp_handle)
return (dapl_convert_errno(ENOMEM, "create_qp"));
-
+
/* Setup QP attributes for INIT state on the way out */
if (dapls_modify_qp_state(ep_ptr->qp_handle,
IBV_QPS_INIT, 0, 0, 0) != DAT_SUCCESS) {
@@ -188,7 +181,7 @@ dapls_ib_qp_alloc(IN DAPL_IA * ia_ptr,
}
#endif
dapl_dbg_log(DAPL_DBG_TYPE_EP,
- " qp_alloc: qpn %p type %d sq %d,%d rq %d,%d\n",
+ " qp_alloc: qpn 0x%x type %d sq %d,%d rq %d,%d\n",
ep_ptr->qp_handle->qp_num, ep_ptr->qp_handle->qp_type,
qp_create.cap.max_send_wr, qp_create.cap.max_send_sge,
qp_create.cap.max_recv_wr, qp_create.cap.max_recv_sge);
--
1.7.3
More information about the ofw
mailing list