mirror of
https://github.com/torvalds/linux.git
synced 2024-11-12 07:01:57 +00:00
xprtrdma: Release orphaned MRs immediately
Instead of leaving orphaned MRs to be released when the transport is destroyed, release them immediately. The MR free list can now be replenished if it becomes exhausted. 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>
This commit is contained in:
parent
e2ac236c0b
commit
2ffc871a57
@ -134,15 +134,22 @@ fmr_op_recover_mr(struct rpcrdma_mw *mw)
|
||||
/* ORDER: then DMA unmap */
|
||||
ib_dma_unmap_sg(r_xprt->rx_ia.ri_device,
|
||||
mw->mw_sg, mw->mw_nents, mw->mw_dir);
|
||||
if (rc) {
|
||||
pr_err("rpcrdma: FMR reset status %d, %p orphaned\n",
|
||||
rc, mw);
|
||||
r_xprt->rx_stats.mrs_orphaned++;
|
||||
return;
|
||||
}
|
||||
if (rc)
|
||||
goto out_release;
|
||||
|
||||
rpcrdma_put_mw(r_xprt, mw);
|
||||
r_xprt->rx_stats.mrs_recovered++;
|
||||
return;
|
||||
|
||||
out_release:
|
||||
pr_err("rpcrdma: FMR reset failed (%d), %p released\n", rc, mw);
|
||||
r_xprt->rx_stats.mrs_orphaned++;
|
||||
|
||||
spin_lock(&r_xprt->rx_buf.rb_mwlock);
|
||||
list_del(&mw->mw_all);
|
||||
spin_unlock(&r_xprt->rx_buf.rb_mwlock);
|
||||
|
||||
fmr_op_release_mr(mw);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -177,15 +177,22 @@ frwr_op_recover_mr(struct rpcrdma_mw *mw)
|
||||
|
||||
rc = __frwr_reset_mr(ia, mw);
|
||||
ib_dma_unmap_sg(ia->ri_device, mw->mw_sg, mw->mw_nents, mw->mw_dir);
|
||||
if (rc) {
|
||||
pr_err("rpcrdma: FRMR reset status %d, %p orphaned\n",
|
||||
rc, mw);
|
||||
r_xprt->rx_stats.mrs_orphaned++;
|
||||
return;
|
||||
}
|
||||
if (rc)
|
||||
goto out_release;
|
||||
|
||||
rpcrdma_put_mw(r_xprt, mw);
|
||||
r_xprt->rx_stats.mrs_recovered++;
|
||||
return;
|
||||
|
||||
out_release:
|
||||
pr_err("rpcrdma: FRMR reset failed %d, %p release\n", rc, mw);
|
||||
r_xprt->rx_stats.mrs_orphaned++;
|
||||
|
||||
spin_lock(&r_xprt->rx_buf.rb_mwlock);
|
||||
list_del(&mw->mw_all);
|
||||
spin_unlock(&r_xprt->rx_buf.rb_mwlock);
|
||||
|
||||
frwr_op_release_mr(mw);
|
||||
}
|
||||
|
||||
static int
|
||||
|
Loading…
Reference in New Issue
Block a user