OSDN Git Service

xprtrdma: Clean up device capability detection
authorChuck Lever <chuck.lever@oracle.com>
Wed, 29 Jun 2016 17:53:27 +0000 (13:53 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Mon, 11 Jul 2016 19:50:43 +0000 (15:50 -0400)
Clean up: Move device capability detection into memreg-specific
source files.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Tested-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
net/sunrpc/xprtrdma/fmr_ops.c
net/sunrpc/xprtrdma/frwr_ops.c
net/sunrpc/xprtrdma/verbs.c
net/sunrpc/xprtrdma/xprt_rdma.h

index 6c4527b..8b6ce8e 100644 (file)
@@ -34,6 +34,17 @@ enum {
                                          IB_ACCESS_REMOTE_READ,
 };
 
+bool
+fmr_is_supported(struct rpcrdma_ia *ia)
+{
+       if (!ia->ri_device->alloc_fmr) {
+               pr_info("rpcrdma: 'fmr' mode is not supported by device %s\n",
+                       ia->ri_device->name);
+               return false;
+       }
+       return true;
+}
+
 static int
 __fmr_init(struct rpcrdma_mw *mw, struct ib_pd *pd)
 {
index c9ead2b..fc2826b 100644 (file)
 # define RPCDBG_FACILITY       RPCDBG_TRANS
 #endif
 
+bool
+frwr_is_supported(struct rpcrdma_ia *ia)
+{
+       struct ib_device_attr *attrs = &ia->ri_device->attrs;
+
+       if (!(attrs->device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS))
+               goto out_not_supported;
+       if (attrs->max_fast_reg_page_list_len == 0)
+               goto out_not_supported;
+       return true;
+
+out_not_supported:
+       pr_info("rpcrdma: 'frwr' mode is not supported by device %s\n",
+               ia->ri_device->name);
+       return false;
+}
+
 static int
 __frwr_init(struct rpcrdma_mw *r, struct ib_pd *pd, unsigned int depth)
 {
index b80e767..cd4c5f1 100644 (file)
@@ -389,44 +389,29 @@ rpcrdma_ia_open(struct rpcrdma_xprt *xprt, struct sockaddr *addr, int memreg)
        ia->ri_pd = ib_alloc_pd(ia->ri_device);
        if (IS_ERR(ia->ri_pd)) {
                rc = PTR_ERR(ia->ri_pd);
-               dprintk("RPC:       %s: ib_alloc_pd() failed %i\n",
-                       __func__, rc);
+               pr_err("rpcrdma: ib_alloc_pd() returned %d\n", rc);
                goto out2;
        }
 
-       if (memreg == RPCRDMA_FRMR) {
-               if (!(ia->ri_device->attrs.device_cap_flags &
-                               IB_DEVICE_MEM_MGT_EXTENSIONS) ||
-                   (ia->ri_device->attrs.max_fast_reg_page_list_len == 0)) {
-                       dprintk("RPC:       %s: FRMR registration "
-                               "not supported by HCA\n", __func__);
-                       memreg = RPCRDMA_MTHCAFMR;
-               }
-       }
-       if (memreg == RPCRDMA_MTHCAFMR) {
-               if (!ia->ri_device->alloc_fmr) {
-                       dprintk("RPC:       %s: MTHCAFMR registration "
-                               "not supported by HCA\n", __func__);
-                       rc = -EINVAL;
-                       goto out3;
-               }
-       }
-
        switch (memreg) {
        case RPCRDMA_FRMR:
-               ia->ri_ops = &rpcrdma_frwr_memreg_ops;
-               break;
+               if (frwr_is_supported(ia)) {
+                       ia->ri_ops = &rpcrdma_frwr_memreg_ops;
+                       break;
+               }
+               /*FALLTHROUGH*/
        case RPCRDMA_MTHCAFMR:
-               ia->ri_ops = &rpcrdma_fmr_memreg_ops;
-               break;
+               if (fmr_is_supported(ia)) {
+                       ia->ri_ops = &rpcrdma_fmr_memreg_ops;
+                       break;
+               }
+               /*FALLTHROUGH*/
        default:
-               printk(KERN_ERR "RPC: Unsupported memory "
-                               "registration mode: %d\n", memreg);
-               rc = -ENOMEM;
+               pr_err("rpcrdma: Unsupported memory registration mode: %d\n",
+                      memreg);
+               rc = -EINVAL;
                goto out3;
        }
-       dprintk("RPC:       %s: memory registration strategy is '%s'\n",
-               __func__, ia->ri_ops->ro_displayname);
 
        return 0;
 
index f1b6f2f..08d441d 100644 (file)
@@ -446,6 +446,8 @@ extern int xprt_rdma_pad_optimize;
  */
 int rpcrdma_ia_open(struct rpcrdma_xprt *, struct sockaddr *, int);
 void rpcrdma_ia_close(struct rpcrdma_ia *);
+bool frwr_is_supported(struct rpcrdma_ia *);
+bool fmr_is_supported(struct rpcrdma_ia *);
 
 /*
  * Endpoint calls - xprtrdma/verbs.c