diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2015-03-30 14:34:12 -0400 |
---|---|---|
committer | Anna Schumaker <Anna.Schumaker@Netapp.com> | 2015-03-31 09:52:52 -0400 |
commit | 41f97028969e4c88efa5fcf58bc6125210413a6d (patch) | |
tree | 5cd5eb15b2696ed3cd134fb71d63393b65a8dcbf | |
parent | 805272406a980cab0e11742e5423ba97b6f38836 (diff) |
xprtrdma: Prevent infinite loop in rpcrdma_ep_create()
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>
-rw-r--r-- | net/sunrpc/xprtrdma/verbs.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c index 60f3317c90ee..99752b5b7354 100644 --- a/net/sunrpc/xprtrdma/verbs.c +++ b/net/sunrpc/xprtrdma/verbs.c | |||
@@ -618,9 +618,10 @@ rpcrdma_ia_open(struct rpcrdma_xprt *xprt, struct sockaddr *addr, int memreg) | |||
618 | 618 | ||
619 | if (memreg == RPCRDMA_FRMR) { | 619 | if (memreg == RPCRDMA_FRMR) { |
620 | /* Requires both frmr reg and local dma lkey */ | 620 | /* Requires both frmr reg and local dma lkey */ |
621 | if ((devattr->device_cap_flags & | 621 | if (((devattr->device_cap_flags & |
622 | (IB_DEVICE_MEM_MGT_EXTENSIONS|IB_DEVICE_LOCAL_DMA_LKEY)) != | 622 | (IB_DEVICE_MEM_MGT_EXTENSIONS|IB_DEVICE_LOCAL_DMA_LKEY)) != |
623 | (IB_DEVICE_MEM_MGT_EXTENSIONS|IB_DEVICE_LOCAL_DMA_LKEY)) { | 623 | (IB_DEVICE_MEM_MGT_EXTENSIONS|IB_DEVICE_LOCAL_DMA_LKEY)) || |
624 | (devattr->max_fast_reg_page_list_len == 0)) { | ||
624 | dprintk("RPC: %s: FRMR registration " | 625 | dprintk("RPC: %s: FRMR registration " |
625 | "not supported by HCA\n", __func__); | 626 | "not supported by HCA\n", __func__); |
626 | memreg = RPCRDMA_MTHCAFMR; | 627 | memreg = RPCRDMA_MTHCAFMR; |