xprtrdma: Add "destroy MRs" memreg op
Memory Region objects associated with a transport instance are destroyed before the instance is shutdown and destroyed. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Reviewed-by: Sagi Grimberg <sagig@mellanox.com> Tested-by: Devesh Sharma <Devesh.Sharma@Emulex.Com> Tested-by: Meghana Cheripady <Meghana.Cheripady@Emulex.Com> Tested-by: Veeresh U. Kokatnur <veereshuk@chelsio.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
31a701a947
commit
4561f347d4
|
@ -168,11 +168,29 @@ fmr_op_reset(struct rpcrdma_xprt *r_xprt)
|
||||||
__func__, rc);
|
__func__, rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fmr_op_destroy(struct rpcrdma_buffer *buf)
|
||||||
|
{
|
||||||
|
struct rpcrdma_mw *r;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
while (!list_empty(&buf->rb_all)) {
|
||||||
|
r = list_entry(buf->rb_all.next, struct rpcrdma_mw, mw_all);
|
||||||
|
list_del(&r->mw_all);
|
||||||
|
rc = ib_dealloc_fmr(r->r.fmr);
|
||||||
|
if (rc)
|
||||||
|
dprintk("RPC: %s: ib_dealloc_fmr failed %i\n",
|
||||||
|
__func__, rc);
|
||||||
|
kfree(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const struct rpcrdma_memreg_ops rpcrdma_fmr_memreg_ops = {
|
const struct rpcrdma_memreg_ops rpcrdma_fmr_memreg_ops = {
|
||||||
.ro_map = fmr_op_map,
|
.ro_map = fmr_op_map,
|
||||||
.ro_unmap = fmr_op_unmap,
|
.ro_unmap = fmr_op_unmap,
|
||||||
.ro_maxpages = fmr_op_maxpages,
|
.ro_maxpages = fmr_op_maxpages,
|
||||||
.ro_init = fmr_op_init,
|
.ro_init = fmr_op_init,
|
||||||
.ro_reset = fmr_op_reset,
|
.ro_reset = fmr_op_reset,
|
||||||
|
.ro_destroy = fmr_op_destroy,
|
||||||
.ro_displayname = "fmr",
|
.ro_displayname = "fmr",
|
||||||
};
|
};
|
||||||
|
|
|
@ -260,11 +260,25 @@ frwr_op_reset(struct rpcrdma_xprt *r_xprt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
frwr_op_destroy(struct rpcrdma_buffer *buf)
|
||||||
|
{
|
||||||
|
struct rpcrdma_mw *r;
|
||||||
|
|
||||||
|
while (!list_empty(&buf->rb_all)) {
|
||||||
|
r = list_entry(buf->rb_all.next, struct rpcrdma_mw, mw_all);
|
||||||
|
list_del(&r->mw_all);
|
||||||
|
__frwr_release(r);
|
||||||
|
kfree(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const struct rpcrdma_memreg_ops rpcrdma_frwr_memreg_ops = {
|
const struct rpcrdma_memreg_ops rpcrdma_frwr_memreg_ops = {
|
||||||
.ro_map = frwr_op_map,
|
.ro_map = frwr_op_map,
|
||||||
.ro_unmap = frwr_op_unmap,
|
.ro_unmap = frwr_op_unmap,
|
||||||
.ro_maxpages = frwr_op_maxpages,
|
.ro_maxpages = frwr_op_maxpages,
|
||||||
.ro_init = frwr_op_init,
|
.ro_init = frwr_op_init,
|
||||||
.ro_reset = frwr_op_reset,
|
.ro_reset = frwr_op_reset,
|
||||||
|
.ro_destroy = frwr_op_destroy,
|
||||||
.ro_displayname = "frwr",
|
.ro_displayname = "frwr",
|
||||||
};
|
};
|
||||||
|
|
|
@ -64,11 +64,17 @@ physical_op_reset(struct rpcrdma_xprt *r_xprt)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
physical_op_destroy(struct rpcrdma_buffer *buf)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
const struct rpcrdma_memreg_ops rpcrdma_physical_memreg_ops = {
|
const struct rpcrdma_memreg_ops rpcrdma_physical_memreg_ops = {
|
||||||
.ro_map = physical_op_map,
|
.ro_map = physical_op_map,
|
||||||
.ro_unmap = physical_op_unmap,
|
.ro_unmap = physical_op_unmap,
|
||||||
.ro_maxpages = physical_op_maxpages,
|
.ro_maxpages = physical_op_maxpages,
|
||||||
.ro_init = physical_op_init,
|
.ro_init = physical_op_init,
|
||||||
.ro_reset = physical_op_reset,
|
.ro_reset = physical_op_reset,
|
||||||
|
.ro_destroy = physical_op_destroy,
|
||||||
.ro_displayname = "physical",
|
.ro_displayname = "physical",
|
||||||
};
|
};
|
||||||
|
|
|
@ -1199,47 +1199,6 @@ rpcrdma_destroy_req(struct rpcrdma_ia *ia, struct rpcrdma_req *req)
|
||||||
kfree(req);
|
kfree(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
rpcrdma_destroy_fmrs(struct rpcrdma_buffer *buf)
|
|
||||||
{
|
|
||||||
struct rpcrdma_mw *r;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
while (!list_empty(&buf->rb_all)) {
|
|
||||||
r = list_entry(buf->rb_all.next, struct rpcrdma_mw, mw_all);
|
|
||||||
list_del(&r->mw_all);
|
|
||||||
list_del(&r->mw_list);
|
|
||||||
|
|
||||||
rc = ib_dealloc_fmr(r->r.fmr);
|
|
||||||
if (rc)
|
|
||||||
dprintk("RPC: %s: ib_dealloc_fmr failed %i\n",
|
|
||||||
__func__, rc);
|
|
||||||
|
|
||||||
kfree(r);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
rpcrdma_destroy_frmrs(struct rpcrdma_buffer *buf)
|
|
||||||
{
|
|
||||||
struct rpcrdma_mw *r;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
while (!list_empty(&buf->rb_all)) {
|
|
||||||
r = list_entry(buf->rb_all.next, struct rpcrdma_mw, mw_all);
|
|
||||||
list_del(&r->mw_all);
|
|
||||||
list_del(&r->mw_list);
|
|
||||||
|
|
||||||
rc = ib_dereg_mr(r->r.frmr.fr_mr);
|
|
||||||
if (rc)
|
|
||||||
dprintk("RPC: %s: ib_dereg_mr failed %i\n",
|
|
||||||
__func__, rc);
|
|
||||||
ib_free_fast_reg_page_list(r->r.frmr.fr_pgl);
|
|
||||||
|
|
||||||
kfree(r);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
rpcrdma_buffer_destroy(struct rpcrdma_buffer *buf)
|
rpcrdma_buffer_destroy(struct rpcrdma_buffer *buf)
|
||||||
{
|
{
|
||||||
|
@ -1260,16 +1219,7 @@ rpcrdma_buffer_destroy(struct rpcrdma_buffer *buf)
|
||||||
rpcrdma_destroy_req(ia, buf->rb_send_bufs[i]);
|
rpcrdma_destroy_req(ia, buf->rb_send_bufs[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (ia->ri_memreg_strategy) {
|
ia->ri_ops->ro_destroy(buf);
|
||||||
case RPCRDMA_FRMR:
|
|
||||||
rpcrdma_destroy_frmrs(buf);
|
|
||||||
break;
|
|
||||||
case RPCRDMA_MTHCAFMR:
|
|
||||||
rpcrdma_destroy_fmrs(buf);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
kfree(buf->rb_pool);
|
kfree(buf->rb_pool);
|
||||||
}
|
}
|
||||||
|
|
|
@ -343,6 +343,7 @@ struct rpcrdma_memreg_ops {
|
||||||
size_t (*ro_maxpages)(struct rpcrdma_xprt *);
|
size_t (*ro_maxpages)(struct rpcrdma_xprt *);
|
||||||
int (*ro_init)(struct rpcrdma_xprt *);
|
int (*ro_init)(struct rpcrdma_xprt *);
|
||||||
void (*ro_reset)(struct rpcrdma_xprt *);
|
void (*ro_reset)(struct rpcrdma_xprt *);
|
||||||
|
void (*ro_destroy)(struct rpcrdma_buffer *);
|
||||||
const char *ro_displayname;
|
const char *ro_displayname;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue