|
@@ -491,33 +491,32 @@ rpcrdma_ia_open(struct rpcrdma_xprt *xprt, struct sockaddr *addr, int memreg)
|
|
|
ia->ri_dma_lkey = ia->ri_id->device->local_dma_lkey;
|
|
|
}
|
|
|
|
|
|
- switch (memreg) {
|
|
|
- case RPCRDMA_MTHCAFMR:
|
|
|
- if (!ia->ri_id->device->alloc_fmr) {
|
|
|
- dprintk("RPC: %s: MTHCAFMR registration "
|
|
|
- "specified but not supported by adapter, "
|
|
|
- "using riskier RPCRDMA_ALLPHYSICAL\n",
|
|
|
- __func__);
|
|
|
- memreg = RPCRDMA_ALLPHYSICAL;
|
|
|
- }
|
|
|
- break;
|
|
|
- case RPCRDMA_FRMR:
|
|
|
+ if (memreg == RPCRDMA_FRMR) {
|
|
|
/* Requires both frmr reg and local dma lkey */
|
|
|
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)) {
|
|
|
dprintk("RPC: %s: FRMR registration "
|
|
|
- "specified but not supported by adapter, "
|
|
|
- "using riskier RPCRDMA_ALLPHYSICAL\n",
|
|
|
- __func__);
|
|
|
- memreg = RPCRDMA_ALLPHYSICAL;
|
|
|
+ "not supported by HCA\n", __func__);
|
|
|
+ memreg = RPCRDMA_MTHCAFMR;
|
|
|
} else {
|
|
|
/* Mind the ia limit on FRMR page list depth */
|
|
|
ia->ri_max_frmr_depth = min_t(unsigned int,
|
|
|
RPCRDMA_MAX_DATA_SEGS,
|
|
|
devattr.max_fast_reg_page_list_len);
|
|
|
}
|
|
|
- break;
|
|
|
+ }
|
|
|
+ if (memreg == RPCRDMA_MTHCAFMR) {
|
|
|
+ if (!ia->ri_id->device->alloc_fmr) {
|
|
|
+ dprintk("RPC: %s: MTHCAFMR registration "
|
|
|
+ "not supported by HCA\n", __func__);
|
|
|
+#if RPCRDMA_PERSISTENT_REGISTRATION
|
|
|
+ memreg = RPCRDMA_ALLPHYSICAL;
|
|
|
+#else
|
|
|
+ rc = -EINVAL;
|
|
|
+ goto out2;
|
|
|
+#endif
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/*
|