RDMA/cma: Check that retry count values are in range
authorSean Hefty <sean.hefty@intel.com>
Wed, 3 Oct 2012 23:42:31 +0000 (23:42 +0000)
committerRoland Dreier <roland@purestorage.com>
Fri, 5 Oct 2012 02:11:54 +0000 (19:11 -0700)
The retry_count and rnr_retry_count connection parameters are both
3-bit values.  Check that the values are in range and reduce if
they're not.

This fixes a problem reported by Doug Ledford <dledford@redhat.com>
that resulted in the userspace rping test (part of the librdmacm
samples) failing to run over Intel IB HCAs.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
[ Use min_t() to avoid warnings about type mismatch.  - Roland ]

Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/core/cma.c

index 26b3760..1983adc 100644 (file)
@@ -2648,8 +2648,8 @@ static int cma_connect_ib(struct rdma_id_private *id_priv,
        req.responder_resources = conn_param->responder_resources;
        req.initiator_depth = conn_param->initiator_depth;
        req.flow_control = conn_param->flow_control;
-       req.retry_count = conn_param->retry_count;
-       req.rnr_retry_count = conn_param->rnr_retry_count;
+       req.retry_count = min_t(u8, 7, conn_param->retry_count);
+       req.rnr_retry_count = min_t(u8, 7, conn_param->rnr_retry_count);
        req.remote_cm_response_timeout = CMA_CM_RESPONSE_TIMEOUT;
        req.local_cm_response_timeout = CMA_CM_RESPONSE_TIMEOUT;
        req.max_cm_retries = CMA_MAX_CM_RETRIES;
@@ -2770,7 +2770,7 @@ static int cma_accept_ib(struct rdma_id_private *id_priv,
        rep.initiator_depth = conn_param->initiator_depth;
        rep.failover_accepted = 0;
        rep.flow_control = conn_param->flow_control;
-       rep.rnr_retry_count = conn_param->rnr_retry_count;
+       rep.rnr_retry_count = min_t(u8, 7, conn_param->rnr_retry_count);
        rep.srq = id_priv->srq ? 1 : 0;
 
        ret = ib_send_cm_rep(id_priv->cm_id.ib, &rep);