|
|
|
@ -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; |
|
|
|
|
|
|
|
|
|