]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
xprtrdma: Prevent infinite loop in rpcrdma_ep_create()
authorChuck Lever <chuck.lever@oracle.com>
Mon, 30 Mar 2015 18:34:12 +0000 (14:34 -0400)
committerLuis Henriques <luis.henriques@canonical.com>
Wed, 6 May 2015 10:33:03 +0000 (11:33 +0100)
commit 41f97028969e4c88efa5fcf58bc6125210413a6d upstream.

If a provider advertizes a zero max_fast_reg_page_list_len, FRWR
depth detection loops forever. Instead of just failing the mount,
try other memory registration modes.

Fixes: 0fc6c4e7bb28 ("xprtrdma: mind the device's max fast . . .")
Reported-by: Devesh Sharma <Devesh.Sharma@Emulex.Com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Tested-by: Devesh Sharma <Devesh.Sharma@Emulex.Com>
Tested-by: Meghana Cheripady <Meghana.Cheripady@Emulex.Com>
Tested-by: Veeresh U. Kokatnur <veereshuk@chelsio.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
[ luis: backported to 3.16:
  - devattr struct isn't a pointer ]
Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
net/sunrpc/xprtrdma/verbs.c

index 13dbd1c389ff07b02c6fa362ebbbf5fd5b6662d7..9ec12f834c431ddcf9f64d6fced44be13e4e42f7 100644 (file)
@@ -541,9 +541,10 @@ rpcrdma_ia_open(struct rpcrdma_xprt *xprt, struct sockaddr *addr, int memreg)
 
        if (memreg == RPCRDMA_FRMR) {
                /* Requires both frmr reg and local dma lkey */
-               if ((devattr.device_cap_flags &
+               if (((devattr.device_cap_flags &
                     (IB_DEVICE_MEM_MGT_EXTENSIONS|IB_DEVICE_LOCAL_DMA_LKEY)) !=
-                   (IB_DEVICE_MEM_MGT_EXTENSIONS|IB_DEVICE_LOCAL_DMA_LKEY)) {
+                   (IB_DEVICE_MEM_MGT_EXTENSIONS|IB_DEVICE_LOCAL_DMA_LKEY)) ||
+                     (devattr.max_fast_reg_page_list_len == 0)) {
                        dprintk("RPC:       %s: FRMR registration "
                                "not supported by HCA\n", __func__);
                        memreg = RPCRDMA_MTHCAFMR;