aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/xprtrdma
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2014-05-28 10:32:51 -0400
committerAnna Schumaker <Anna.Schumaker@Netapp.com>2014-06-04 08:56:39 -0400
commitf10eafd3a6ce9da7e96999c124b643ea6c4921f3 (patch)
tree802a9de893546367458883a1f97dc8b7ca83ba26 /net/sunrpc/xprtrdma
parent0ac531c1832318efa3dc3d723e356a7e09330e80 (diff)
xprtrdma: Fall back to MTHCAFMR when FRMR is not supported
An audit of in-kernel RDMA providers that do not support the FRMR memory registration shows that several of them support MTHCAFMR. Prefer MTHCAFMR when FRMR is not supported. If MTHCAFMR is not supported, only then choose ALLPHYSICAL. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Diffstat (limited to 'net/sunrpc/xprtrdma')
-rw-r--r--net/sunrpc/xprtrdma/verbs.c31
1 files changed, 15 insertions, 16 deletions
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c
index 6bb9a07f7d49..a3527989f5b3 100644
--- a/net/sunrpc/xprtrdma/verbs.c
+++ b/net/sunrpc/xprtrdma/verbs.c
@@ -491,33 +491,32 @@ rpcrdma_ia_open(struct rpcrdma_xprt *xprt, struct sockaddr *addr, int memreg)
491 ia->ri_dma_lkey = ia->ri_id->device->local_dma_lkey; 491 ia->ri_dma_lkey = ia->ri_id->device->local_dma_lkey;
492 } 492 }
493 493
494 switch (memreg) { 494 if (memreg == RPCRDMA_FRMR) {
495 case RPCRDMA_MTHCAFMR:
496 if (!ia->ri_id->device->alloc_fmr) {
497 dprintk("RPC: %s: MTHCAFMR registration "
498 "specified but not supported by adapter, "
499 "using riskier RPCRDMA_ALLPHYSICAL\n",
500 __func__);
501 memreg = RPCRDMA_ALLPHYSICAL;
502 }
503 break;
504 case RPCRDMA_FRMR:
505 /* Requires both frmr reg and local dma lkey */ 495 /* Requires both frmr reg and local dma lkey */
506 if ((devattr.device_cap_flags & 496 if ((devattr.device_cap_flags &
507 (IB_DEVICE_MEM_MGT_EXTENSIONS|IB_DEVICE_LOCAL_DMA_LKEY)) != 497 (IB_DEVICE_MEM_MGT_EXTENSIONS|IB_DEVICE_LOCAL_DMA_LKEY)) !=
508 (IB_DEVICE_MEM_MGT_EXTENSIONS|IB_DEVICE_LOCAL_DMA_LKEY)) { 498 (IB_DEVICE_MEM_MGT_EXTENSIONS|IB_DEVICE_LOCAL_DMA_LKEY)) {
509 dprintk("RPC: %s: FRMR registration " 499 dprintk("RPC: %s: FRMR registration "
510 "specified but not supported by adapter, " 500 "not supported by HCA\n", __func__);
511 "using riskier RPCRDMA_ALLPHYSICAL\n", 501 memreg = RPCRDMA_MTHCAFMR;
512 __func__);
513 memreg = RPCRDMA_ALLPHYSICAL;
514 } else { 502 } else {
515 /* Mind the ia limit on FRMR page list depth */ 503 /* Mind the ia limit on FRMR page list depth */
516 ia->ri_max_frmr_depth = min_t(unsigned int, 504 ia->ri_max_frmr_depth = min_t(unsigned int,
517 RPCRDMA_MAX_DATA_SEGS, 505 RPCRDMA_MAX_DATA_SEGS,
518 devattr.max_fast_reg_page_list_len); 506 devattr.max_fast_reg_page_list_len);
519 } 507 }
520 break; 508 }
509 if (memreg == RPCRDMA_MTHCAFMR) {
510 if (!ia->ri_id->device->alloc_fmr) {
511 dprintk("RPC: %s: MTHCAFMR registration "
512 "not supported by HCA\n", __func__);
513#if RPCRDMA_PERSISTENT_REGISTRATION
514 memreg = RPCRDMA_ALLPHYSICAL;
515#else
516 rc = -EINVAL;
517 goto out2;
518#endif
519 }
521 } 520 }
522 521
523 /* 522 /*