Skip to content

Commit

Permalink
xprtrdma: Release orphaned MRs immediately
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
chucklever authored and amschuma-ntap committed Jul 11, 2016
1 parent e2ac236 commit 2ffc871
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 12 deletions.
19 changes: 13 additions & 6 deletions net/sunrpc/xprtrdma/fmr_ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
19 changes: 13 additions & 6 deletions net/sunrpc/xprtrdma/frwr_ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 2ffc871

Please sign in to comment.