Commit 2ffc871a authored by Chuck Lever's avatar Chuck Lever Committed by Anna Schumaker

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: default avatarChuck Lever <chuck.lever@oracle.com>
Tested-by: default avatarSteve Wise <swise@opengridcomputing.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent e2ac236c
...@@ -134,15 +134,22 @@ fmr_op_recover_mr(struct rpcrdma_mw *mw) ...@@ -134,15 +134,22 @@ fmr_op_recover_mr(struct rpcrdma_mw *mw)
/* ORDER: then DMA unmap */ /* ORDER: then DMA unmap */
ib_dma_unmap_sg(r_xprt->rx_ia.ri_device, ib_dma_unmap_sg(r_xprt->rx_ia.ri_device,
mw->mw_sg, mw->mw_nents, mw->mw_dir); mw->mw_sg, mw->mw_nents, mw->mw_dir);
if (rc) { if (rc)
pr_err("rpcrdma: FMR reset status %d, %p orphaned\n", goto out_release;
rc, mw);
r_xprt->rx_stats.mrs_orphaned++;
return;
}
rpcrdma_put_mw(r_xprt, mw); rpcrdma_put_mw(r_xprt, mw);
r_xprt->rx_stats.mrs_recovered++; 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 static int
......
...@@ -177,15 +177,22 @@ frwr_op_recover_mr(struct rpcrdma_mw *mw) ...@@ -177,15 +177,22 @@ frwr_op_recover_mr(struct rpcrdma_mw *mw)
rc = __frwr_reset_mr(ia, mw); rc = __frwr_reset_mr(ia, mw);
ib_dma_unmap_sg(ia->ri_device, mw->mw_sg, mw->mw_nents, mw->mw_dir); ib_dma_unmap_sg(ia->ri_device, mw->mw_sg, mw->mw_nents, mw->mw_dir);
if (rc) { if (rc)
pr_err("rpcrdma: FRMR reset status %d, %p orphaned\n", goto out_release;
rc, mw);
r_xprt->rx_stats.mrs_orphaned++;
return;
}
rpcrdma_put_mw(r_xprt, mw); rpcrdma_put_mw(r_xprt, mw);
r_xprt->rx_stats.mrs_recovered++; 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 static int
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment