[ofw] [PATCH 5/11] librdmacm: allow user to specify max rdma resources
Hefty, Sean
sean.hefty at intel.com
Mon Aug 16 16:18:35 PDT 2010
Automatically negotiate the maximum usable RDMA resources if requested
by the user.
From: Sean Hefty <sean.hefty at intel.com>
---
trunk/ulp/librdmacm/include/rdma/rdma_cma.h | 5 +++
trunk/ulp/librdmacm/src/cma.cpp | 43 ++++++++++++++++++++++-----
2 files changed, 40 insertions(+), 8 deletions(-)
diff --git a/trunk/ulp/librdmacm/include/rdma/rdma_cma.h b/trunk/ulp/librdmacm/include/rdma/rdma_cma.h
index 16f7f21..294a75b 100644
--- a/trunk/ulp/librdmacm/include/rdma/rdma_cma.h
+++ b/trunk/ulp/librdmacm/include/rdma/rdma_cma.h
@@ -146,6 +146,11 @@ struct rdma_cm_id
struct ibv_cq *recv_cq;
};
+enum {
+ RDMA_MAX_RESP_RES = 0xFF,
+ RDMA_MAX_INIT_DEPTH = 0xFF
+};
+
struct rdma_conn_param
{
const void *private_data;
diff --git a/trunk/ulp/librdmacm/src/cma.cpp b/trunk/ulp/librdmacm/src/cma.cpp
index 0d6e6f5..05c672d 100644
--- a/trunk/ulp/librdmacm/src/cma.cpp
+++ b/trunk/ulp/librdmacm/src/cma.cpp
@@ -74,6 +74,8 @@ struct cma_id_private
int index;
volatile LONG refcnt;
struct rdma_cm_id **req_list;
+ uint8_t initiator_depth;
+ uint8_t responder_resources;
};
struct cma_device
@@ -737,15 +739,20 @@ void rdma_destroy_qp(struct rdma_cm_id *id)
}
static int ucma_valid_param(struct cma_id_private *id_priv,
- struct rdma_conn_param *conn_param)
+ struct rdma_conn_param *param)
{
if (id_priv->id.ps != RDMA_PS_TCP) {
return 0;
}
- if ((conn_param->responder_resources > id_priv->cma_dev->max_responder_resources) ||
- (conn_param->initiator_depth > id_priv->cma_dev->max_initiator_depth)) {
- return -1;
+ if ((param->responder_resources != RDMA_MAX_RESP_RES) &&
+ (param->responder_resources > id_priv->cma_dev->max_responder_resources)) {
+ return rdma_seterrno(EINVAL);
+ }
+
+ if ((param->initiator_depth != RDMA_MAX_INIT_DEPTH) &&
+ (param->initiator_depth > id_priv->cma_dev->max_initiator_depth)) {
+ return rdma_seterrno(EINVAL);
}
return 0;
@@ -765,9 +772,14 @@ int rdma_connect(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)
return ret;
}
+ id_priv->responder_resources = min(conn_param->responder_resources,
+ id_priv->cma_dev->max_responder_resources);
+ id_priv->initiator_depth = min(conn_param->initiator_depth,
+ id_priv->cma_dev->max_initiator_depth);
+
RtlZeroMemory(&attr, sizeof attr);
- attr.ResponderResources = conn_param->responder_resources;
- attr.InitiatorDepth = conn_param->initiator_depth;
+ attr.ResponderResources = id_priv->responder_resources;
+ attr.InitiatorDepth = id_priv->initiator_depth;
attr.RetryCount = conn_param->retry_count;
attr.RnrRetryCount = conn_param->rnr_retry_count;
if ((attr.DataLength = conn_param->private_data_len)) {
@@ -892,9 +904,22 @@ int rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)
return ret;
}
+ if (conn_param->initiator_depth == RDMA_MAX_INIT_DEPTH) {
+ id_priv->initiator_depth = min(id_priv->initiator_depth,
+ id_priv->cma_dev->max_initiator_depth);
+ } else {
+ id_priv->initiator_depth = conn_param->initiator_depth;
+ }
+ if (conn_param->responder_resources == RDMA_MAX_RESP_RES) {
+ id_priv->responder_resources = min(id_priv->responder_resources,
+ id_priv->cma_dev->max_responder_resources);
+ } else {
+ id_priv->responder_resources = conn_param->responder_resources;
+ }
+
RtlZeroMemory(&attr, sizeof attr);
- attr.ResponderResources = conn_param->responder_resources;
- attr.InitiatorDepth = conn_param->initiator_depth;
+ attr.ResponderResources = id_priv->responder_resources;
+ attr.InitiatorDepth = id_priv->initiator_depth;
attr.RetryCount = conn_param->retry_count;
attr.RnrRetryCount = conn_param->rnr_retry_count;
if ((attr.DataLength = conn_param->private_data_len)) {
@@ -1004,6 +1029,8 @@ static int ucma_process_conn_req(struct cma_event *event)
event->event.event = RDMA_CM_EVENT_CONNECT_REQUEST;
id_priv->state = cma_passive_connect;
event->event.listen_id = &listen->id;
+ id_priv->initiator_depth = event->event.param.conn.initiator_depth;
+ id_priv->responder_resources = event->event.param.conn.responder_resources;
return 0;
More information about the ofw
mailing list