xprtrdma: Remove last ib_reg_phys_mr() call site
All HCA providers have an ib_get_dma_mr() verb. Thus rpcrdma_ia_open() will either grab the device's local_dma_key if one is available, or it will call ib_get_dma_mr(). If ib_get_dma_mr() fails, rpcrdma_ia_open() fails and no transport is created. Therefore execution never reaches the ib_reg_phys_mr() call site in rpcrdma_register_internal(), so it can be removed. The remaining logic in rpcrdma_{de}register_internal() is folded into rpcrdma_{alloc,free}_regbuf(). This is clean up only. No behavior change is expected. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Reviewed-by: Devesh Sharma <devesh.sharma@avagotech.com> Reviewed-By: Sagi Grimberg <sagig@mellanox.com> Tested-by: Devesh Sharma <devesh.sharma@avagotech.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
d231093023
commit
e531dcabec
|
@ -1229,75 +1229,6 @@ rpcrdma_mapping_error(struct rpcrdma_mr_seg *seg)
|
||||||
(unsigned long long)seg->mr_dma, seg->mr_dmalen);
|
(unsigned long long)seg->mr_dma, seg->mr_dmalen);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
rpcrdma_register_internal(struct rpcrdma_ia *ia, void *va, int len,
|
|
||||||
struct ib_mr **mrp, struct ib_sge *iov)
|
|
||||||
{
|
|
||||||
struct ib_phys_buf ipb;
|
|
||||||
struct ib_mr *mr;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* All memory passed here was kmalloc'ed, therefore phys-contiguous.
|
|
||||||
*/
|
|
||||||
iov->addr = ib_dma_map_single(ia->ri_device,
|
|
||||||
va, len, DMA_BIDIRECTIONAL);
|
|
||||||
if (ib_dma_mapping_error(ia->ri_device, iov->addr))
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
iov->length = len;
|
|
||||||
|
|
||||||
if (ia->ri_have_dma_lkey) {
|
|
||||||
*mrp = NULL;
|
|
||||||
iov->lkey = ia->ri_dma_lkey;
|
|
||||||
return 0;
|
|
||||||
} else if (ia->ri_bind_mem != NULL) {
|
|
||||||
*mrp = NULL;
|
|
||||||
iov->lkey = ia->ri_bind_mem->lkey;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ipb.addr = iov->addr;
|
|
||||||
ipb.size = iov->length;
|
|
||||||
mr = ib_reg_phys_mr(ia->ri_pd, &ipb, 1,
|
|
||||||
IB_ACCESS_LOCAL_WRITE, &iov->addr);
|
|
||||||
|
|
||||||
dprintk("RPC: %s: phys convert: 0x%llx "
|
|
||||||
"registered 0x%llx length %d\n",
|
|
||||||
__func__, (unsigned long long)ipb.addr,
|
|
||||||
(unsigned long long)iov->addr, len);
|
|
||||||
|
|
||||||
if (IS_ERR(mr)) {
|
|
||||||
*mrp = NULL;
|
|
||||||
rc = PTR_ERR(mr);
|
|
||||||
dprintk("RPC: %s: failed with %i\n", __func__, rc);
|
|
||||||
} else {
|
|
||||||
*mrp = mr;
|
|
||||||
iov->lkey = mr->lkey;
|
|
||||||
rc = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
rpcrdma_deregister_internal(struct rpcrdma_ia *ia,
|
|
||||||
struct ib_mr *mr, struct ib_sge *iov)
|
|
||||||
{
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
ib_dma_unmap_single(ia->ri_device,
|
|
||||||
iov->addr, iov->length, DMA_BIDIRECTIONAL);
|
|
||||||
|
|
||||||
if (NULL == mr)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
rc = ib_dereg_mr(mr);
|
|
||||||
if (rc)
|
|
||||||
dprintk("RPC: %s: ib_dereg_mr failed %i\n", __func__, rc);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* rpcrdma_alloc_regbuf - kmalloc and register memory for SEND/RECV buffers
|
* rpcrdma_alloc_regbuf - kmalloc and register memory for SEND/RECV buffers
|
||||||
* @ia: controlling rpcrdma_ia
|
* @ia: controlling rpcrdma_ia
|
||||||
|
@ -1317,26 +1248,30 @@ struct rpcrdma_regbuf *
|
||||||
rpcrdma_alloc_regbuf(struct rpcrdma_ia *ia, size_t size, gfp_t flags)
|
rpcrdma_alloc_regbuf(struct rpcrdma_ia *ia, size_t size, gfp_t flags)
|
||||||
{
|
{
|
||||||
struct rpcrdma_regbuf *rb;
|
struct rpcrdma_regbuf *rb;
|
||||||
int rc;
|
struct ib_sge *iov;
|
||||||
|
|
||||||
rc = -ENOMEM;
|
|
||||||
rb = kmalloc(sizeof(*rb) + size, flags);
|
rb = kmalloc(sizeof(*rb) + size, flags);
|
||||||
if (rb == NULL)
|
if (rb == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
rb->rg_size = size;
|
iov = &rb->rg_iov;
|
||||||
rb->rg_owner = NULL;
|
iov->addr = ib_dma_map_single(ia->ri_device,
|
||||||
rc = rpcrdma_register_internal(ia, rb->rg_base, size,
|
(void *)rb->rg_base, size,
|
||||||
&rb->rg_mr, &rb->rg_iov);
|
DMA_BIDIRECTIONAL);
|
||||||
if (rc)
|
if (ib_dma_mapping_error(ia->ri_device, iov->addr))
|
||||||
goto out_free;
|
goto out_free;
|
||||||
|
|
||||||
|
iov->length = size;
|
||||||
|
iov->lkey = ia->ri_have_dma_lkey ?
|
||||||
|
ia->ri_dma_lkey : ia->ri_bind_mem->lkey;
|
||||||
|
rb->rg_size = size;
|
||||||
|
rb->rg_owner = NULL;
|
||||||
return rb;
|
return rb;
|
||||||
|
|
||||||
out_free:
|
out_free:
|
||||||
kfree(rb);
|
kfree(rb);
|
||||||
out:
|
out:
|
||||||
return ERR_PTR(rc);
|
return ERR_PTR(-ENOMEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1347,10 +1282,15 @@ out:
|
||||||
void
|
void
|
||||||
rpcrdma_free_regbuf(struct rpcrdma_ia *ia, struct rpcrdma_regbuf *rb)
|
rpcrdma_free_regbuf(struct rpcrdma_ia *ia, struct rpcrdma_regbuf *rb)
|
||||||
{
|
{
|
||||||
if (rb) {
|
struct ib_sge *iov;
|
||||||
rpcrdma_deregister_internal(ia, rb->rg_mr, &rb->rg_iov);
|
|
||||||
kfree(rb);
|
if (!rb)
|
||||||
}
|
return;
|
||||||
|
|
||||||
|
iov = &rb->rg_iov;
|
||||||
|
ib_dma_unmap_single(ia->ri_device,
|
||||||
|
iov->addr, iov->length, DMA_BIDIRECTIONAL);
|
||||||
|
kfree(rb);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -119,7 +119,6 @@ struct rpcrdma_ep {
|
||||||
struct rpcrdma_regbuf {
|
struct rpcrdma_regbuf {
|
||||||
size_t rg_size;
|
size_t rg_size;
|
||||||
struct rpcrdma_req *rg_owner;
|
struct rpcrdma_req *rg_owner;
|
||||||
struct ib_mr *rg_mr;
|
|
||||||
struct ib_sge rg_iov;
|
struct ib_sge rg_iov;
|
||||||
__be32 rg_base[0] __attribute__ ((aligned(256)));
|
__be32 rg_base[0] __attribute__ ((aligned(256)));
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue