xprtrdma: Reduce max_frwr_depth
[linux] / net / sunrpc / xprtrdma / frwr_ops.c
index f587e44..16976b0 100644 (file)
@@ -193,10 +193,17 @@ frwr_op_open(struct rpcrdma_ia *ia, struct rpcrdma_ep *ep,
        if (attrs->device_cap_flags & IB_DEVICE_SG_GAPS_REG)
                ia->ri_mrtype = IB_MR_TYPE_SG_GAPS;
 
-       ia->ri_max_frwr_depth =
-                       min_t(unsigned int, RPCRDMA_MAX_DATA_SEGS,
-                             attrs->max_fast_reg_page_list_len);
-       dprintk("RPC:       %s: device's max FR page list len = %u\n",
+       /* Quirk: Some devices advertise a large max_fast_reg_page_list_len
+        * capability, but perform optimally when the MRs are not larger
+        * than a page.
+        */
+       if (attrs->max_sge_rd > 1)
+               ia->ri_max_frwr_depth = attrs->max_sge_rd;
+       else
+               ia->ri_max_frwr_depth = attrs->max_fast_reg_page_list_len;
+       if (ia->ri_max_frwr_depth > RPCRDMA_MAX_DATA_SEGS)
+               ia->ri_max_frwr_depth = RPCRDMA_MAX_DATA_SEGS;
+       dprintk("RPC:       %s: max FR page list depth = %u\n",
                __func__, ia->ri_max_frwr_depth);
 
        /* Add room for frwr register and invalidate WRs.