]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
librdmacm: allow user to specify max rdma resources
authorSean Hefty <sean.hefty@intel.com>
Fri, 13 Aug 2010 22:35:07 +0000 (15:35 -0700)
committerSean Hefty <sean.hefty@intel.com>
Fri, 13 Aug 2010 22:35:07 +0000 (15:35 -0700)
trunk/ulp/librdmacm/include/rdma/rdma_cma.h
trunk/ulp/librdmacm/src/cma.cpp

index 16f7f211f3c6e759716413addf5869be0500fb74..294a75b0c0be0282bf44b293a43eda2b04da49cc 100644 (file)
@@ -146,6 +146,11 @@ struct rdma_cm_id
        struct ibv_cq                           *recv_cq;\r
 };\r
 \r
+enum {\r
+       RDMA_MAX_RESP_RES = 0xFF,\r
+       RDMA_MAX_INIT_DEPTH = 0xFF\r
+};\r
+\r
 struct rdma_conn_param\r
 {\r
        const void *private_data;\r
index 0d6e6f55d66596bd978c645dd05f8578d2c7b589..d8ba0bea110c8c0ff984d8606f99ca70d43bc7d3 100644 (file)
@@ -74,6 +74,8 @@ struct cma_id_private
        int                                                     index;\r
        volatile LONG                           refcnt;\r
        struct rdma_cm_id                       **req_list;\r
+       uint8_t                                         initiator_depth;\r
+       uint8_t                                         responder_resources;\r
 };\r
 \r
 struct cma_device\r
@@ -737,15 +739,19 @@ void rdma_destroy_qp(struct rdma_cm_id *id)
 }\r
 \r
 static int ucma_valid_param(struct cma_id_private *id_priv,\r
-                                                       struct rdma_conn_param *conn_param)\r
+                                                       struct rdma_conn_param *param)\r
 {\r
        if (id_priv->id.ps != RDMA_PS_TCP) {\r
                return 0;\r
        }\r
 \r
-       if ((conn_param->responder_resources > id_priv->cma_dev->max_responder_resources) ||\r
-               (conn_param->initiator_depth > id_priv->cma_dev->max_initiator_depth)) {\r
-               return -1;\r
+       if ((param->responder_resources != RDMA_MAX_RESP_RES) &&\r
+               (param->responder_resources > id_priv->cma_dev->max_responder_resources)) {\r
+               return rdma_seterrno(EINVAL);\r
+               \r
+       if ((param->initiator_depth != RDMA_MAX_INIT_DEPTH) &&\r
+               (param->initiator_depth > id_priv->cma_dev->max_initiator_depth)) {\r
+               return rdma_seterrno(EINVAL);\r
        }\r
 \r
        return 0;\r
@@ -765,9 +771,14 @@ int rdma_connect(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)
                return ret;\r
        }\r
 \r
+       id_priv->responder_resources = min(conn_param->responder_resources,\r
+                                                                          id_priv->cma_dev->responder_resources);\r
+       id_priv->initiator_depth = min(conn_param->initiator_depth,\r
+                                                                  id_priv->cma_dev->initiator_depth);\r
+\r
        RtlZeroMemory(&attr, sizeof attr);\r
-       attr.ResponderResources = conn_param->responder_resources;\r
-       attr.InitiatorDepth = conn_param->initiator_depth;\r
+       attr.ResponderResources = id_priv->responder_resources;\r
+       attr.InitiatorDepth = id_priv->initiator_depth;\r
        attr.RetryCount = conn_param->retry_count;\r
        attr.RnrRetryCount = conn_param->rnr_retry_count;\r
        if ((attr.DataLength = conn_param->private_data_len)) {\r
@@ -892,9 +903,22 @@ int rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)
                return ret;\r
        }\r
 \r
+       if (conn_param->initiator_depth == RDMA_MAX_INIT_DEPTH) {\r
+               id_priv->initiator_depth = min(id_priv->initiator_depth,\r
+                                                                          id_priv->cma_dev->max_initiator_depth);\r
+       } else {\r
+               id_priv->initiator_depth = conn_param->initiator_depth;\r
+       }\r
+       if (conn_param->responder_resources == RDMA_MAX_RESP_RES) {\r
+               id_priv->responder_resources = min(id_priv->responder_resources,\r
+                                                                                  id_priv->cma_dev->max_responder_resources);\r
+       } else {\r
+               id_priv->responder_resources = conn_param->responder_resources;\r
+       }\r
+\r
        RtlZeroMemory(&attr, sizeof attr);\r
-       attr.ResponderResources = conn_param->responder_resources;\r
-       attr.InitiatorDepth = conn_param->initiator_depth;\r
+       attr.ResponderResources = id_priv->responder_resources;\r
+       attr.InitiatorDepth = id_priv->initiator_depth;\r
        attr.RetryCount = conn_param->retry_count;\r
        attr.RnrRetryCount = conn_param->rnr_retry_count;\r
        if ((attr.DataLength = conn_param->private_data_len)) {\r
@@ -1004,6 +1028,8 @@ static int ucma_process_conn_req(struct cma_event *event)
        event->event.event = RDMA_CM_EVENT_CONNECT_REQUEST;\r
        id_priv->state = cma_passive_connect;\r
        event->event.listen_id = &listen->id;\r
+       id_priv->initiator_depth = event->event.param.conn.initiator_depth;\r
+       id_priv->responder_resources = event->event.param.conn.responder_resources;\r
 \r
        return 0;\r
 \r