summaryrefslogtreecommitdiff
path: root/net/sunrpc/xprtrdma/fmr_ops.c
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2016-06-29 20:54:08 +0300
committerAnna Schumaker <Anna.Schumaker@Netapp.com>2016-07-11 22:50:43 +0300
commit2ffc871a574daa760ef4f7750e0a36187a45754a (patch)
tree30fcb24659d089a55417df53c4d8b33668367df9 /net/sunrpc/xprtrdma/fmr_ops.c
parente2ac236c0b65129f12fef358390f76cc3cacb865 (diff)
downloadlinux-2ffc871a574daa760ef4f7750e0a36187a45754a.tar.xz
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>
Diffstat (limited to 'net/sunrpc/xprtrdma/fmr_ops.c')
-rw-r--r--net/sunrpc/xprtrdma/fmr_ops.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/net/sunrpc/xprtrdma/fmr_ops.c b/net/sunrpc/xprtrdma/fmr_ops.c
index 758cd1a02249..6521dceff638 100644
--- a/net/sunrpc/xprtrdma/fmr_ops.c
+++ b/net/sunrpc/xprtrdma/fmr_ops.c
@@ -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