diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2017-12-14 20:58:04 -0500 |
---|---|---|
committer | Anna Schumaker <Anna.Schumaker@Netapp.com> | 2018-01-16 11:19:52 -0500 |
commit | ec12e479e30653bf973ca1185bbb09158e9af0b7 (patch) | |
tree | 56311458295827af007ced5f8bc88efc3ff802d2 /net/sunrpc/xprtrdma/fmr_ops.c | |
parent | 96ceddea3710f61bb5a5f2af25e684b7e1466171 (diff) | |
download | linux-ec12e479e30653bf973ca1185bbb09158e9af0b7.tar.gz linux-ec12e479e30653bf973ca1185bbb09158e9af0b7.tar.bz2 linux-ec12e479e30653bf973ca1185bbb09158e9af0b7.zip |
xprtrdma: Introduce rpcrdma_mw_unmap_and_put
Clean up: Code review suggested that a common bit of code can be
placed into a helper function, and this gives us fewer places to
stick an "I DMA unmapped something" trace point.
Signed-off-by: Chuck Lever <chuck.lever@oracle.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.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/net/sunrpc/xprtrdma/fmr_ops.c b/net/sunrpc/xprtrdma/fmr_ops.c index 8bd0399b3a1c..7f2f2b774076 100644 --- a/net/sunrpc/xprtrdma/fmr_ops.c +++ b/net/sunrpc/xprtrdma/fmr_ops.c @@ -135,14 +135,12 @@ fmr_op_recover_mr(struct rpcrdma_mr *mr) /* ORDER: invalidate first */ rc = __fmr_unmap(mr); - - /* ORDER: then DMA unmap */ - ib_dma_unmap_sg(r_xprt->rx_ia.ri_device, - mr->mr_sg, mr->mr_nents, mr->mr_dir); if (rc) goto out_release; - rpcrdma_mr_put(mr); + /* ORDER: then DMA unmap */ + rpcrdma_mr_unmap_and_put(mr); + r_xprt->rx_stats.mrs_recovered++; return; @@ -150,6 +148,9 @@ out_release: pr_err("rpcrdma: FMR reset failed (%d), %p released\n", rc, mr); r_xprt->rx_stats.mrs_orphaned++; + ib_dma_unmap_sg(r_xprt->rx_ia.ri_device, + mr->mr_sg, mr->mr_nents, mr->mr_dir); + spin_lock(&r_xprt->rx_buf.rb_mrlock); list_del(&mr->mr_all); spin_unlock(&r_xprt->rx_buf.rb_mrlock); @@ -245,9 +246,7 @@ out_maperr: pr_err("rpcrdma: ib_map_phys_fmr %u@0x%llx+%i (%d) status %i\n", len, (unsigned long long)dma_pages[0], pageoff, mr->mr_nents, rc); - ib_dma_unmap_sg(r_xprt->rx_ia.ri_device, - mr->mr_sg, mr->mr_nents, mr->mr_dir); - rpcrdma_mr_put(mr); + rpcrdma_mr_unmap_and_put(mr); return ERR_PTR(-EIO); } @@ -289,9 +288,7 @@ fmr_op_unmap_sync(struct rpcrdma_xprt *r_xprt, struct list_head *mrs) dprintk("RPC: %s: DMA unmapping fmr %p\n", __func__, &mr->fmr); list_del(&mr->fmr.fm_mr->list); - ib_dma_unmap_sg(r_xprt->rx_ia.ri_device, - mr->mr_sg, mr->mr_nents, mr->mr_dir); - rpcrdma_mr_put(mr); + rpcrdma_mr_unmap_and_put(mr); } return; |