Commit ec12e479 authored by Chuck Lever's avatar Chuck Lever Committed by Anna Schumaker

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: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent 96ceddea
...@@ -135,14 +135,12 @@ fmr_op_recover_mr(struct rpcrdma_mr *mr) ...@@ -135,14 +135,12 @@ fmr_op_recover_mr(struct rpcrdma_mr *mr)
/* ORDER: invalidate first */ /* ORDER: invalidate first */
rc = __fmr_unmap(mr); 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) if (rc)
goto out_release; goto out_release;
rpcrdma_mr_put(mr); /* ORDER: then DMA unmap */
rpcrdma_mr_unmap_and_put(mr);
r_xprt->rx_stats.mrs_recovered++; r_xprt->rx_stats.mrs_recovered++;
return; return;
...@@ -150,6 +148,9 @@ fmr_op_recover_mr(struct rpcrdma_mr *mr) ...@@ -150,6 +148,9 @@ fmr_op_recover_mr(struct rpcrdma_mr *mr)
pr_err("rpcrdma: FMR reset failed (%d), %p released\n", rc, mr); pr_err("rpcrdma: FMR reset failed (%d), %p released\n", rc, mr);
r_xprt->rx_stats.mrs_orphaned++; 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); spin_lock(&r_xprt->rx_buf.rb_mrlock);
list_del(&mr->mr_all); list_del(&mr->mr_all);
spin_unlock(&r_xprt->rx_buf.rb_mrlock); spin_unlock(&r_xprt->rx_buf.rb_mrlock);
...@@ -245,9 +246,7 @@ fmr_op_map(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr_seg *seg, ...@@ -245,9 +246,7 @@ fmr_op_map(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr_seg *seg,
pr_err("rpcrdma: ib_map_phys_fmr %u@0x%llx+%i (%d) status %i\n", pr_err("rpcrdma: ib_map_phys_fmr %u@0x%llx+%i (%d) status %i\n",
len, (unsigned long long)dma_pages[0], len, (unsigned long long)dma_pages[0],
pageoff, mr->mr_nents, rc); pageoff, mr->mr_nents, rc);
ib_dma_unmap_sg(r_xprt->rx_ia.ri_device, rpcrdma_mr_unmap_and_put(mr);
mr->mr_sg, mr->mr_nents, mr->mr_dir);
rpcrdma_mr_put(mr);
return ERR_PTR(-EIO); return ERR_PTR(-EIO);
} }
...@@ -289,9 +288,7 @@ fmr_op_unmap_sync(struct rpcrdma_xprt *r_xprt, struct list_head *mrs) ...@@ -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", dprintk("RPC: %s: DMA unmapping fmr %p\n",
__func__, &mr->fmr); __func__, &mr->fmr);
list_del(&mr->fmr.fm_mr->list); list_del(&mr->fmr.fm_mr->list);
ib_dma_unmap_sg(r_xprt->rx_ia.ri_device, rpcrdma_mr_unmap_and_put(mr);
mr->mr_sg, mr->mr_nents, mr->mr_dir);
rpcrdma_mr_put(mr);
} }
return; return;
......
...@@ -459,13 +459,9 @@ frwr_op_reminv(struct rpcrdma_rep *rep, struct list_head *mrs) ...@@ -459,13 +459,9 @@ frwr_op_reminv(struct rpcrdma_rep *rep, struct list_head *mrs)
list_for_each_entry(mr, mrs, mr_list) list_for_each_entry(mr, mrs, mr_list)
if (mr->mr_handle == rep->rr_inv_rkey) { if (mr->mr_handle == rep->rr_inv_rkey) {
struct rpcrdma_xprt *r_xprt = mr->mr_xprt;
list_del(&mr->mr_list); list_del(&mr->mr_list);
mr->frwr.fr_state = FRWR_IS_INVALID; mr->frwr.fr_state = FRWR_IS_INVALID;
ib_dma_unmap_sg(r_xprt->rx_ia.ri_device, rpcrdma_mr_unmap_and_put(mr);
mr->mr_sg, mr->mr_nents, mr->mr_dir);
rpcrdma_mr_put(mr);
break; /* only one invalidated MR per RPC */ break; /* only one invalidated MR per RPC */
} }
} }
...@@ -545,9 +541,7 @@ frwr_op_unmap_sync(struct rpcrdma_xprt *r_xprt, struct list_head *mrs) ...@@ -545,9 +541,7 @@ frwr_op_unmap_sync(struct rpcrdma_xprt *r_xprt, struct list_head *mrs)
mr = rpcrdma_mr_pop(mrs); mr = rpcrdma_mr_pop(mrs);
dprintk("RPC: %s: DMA unmapping frwr %p\n", dprintk("RPC: %s: DMA unmapping frwr %p\n",
__func__, &mr->frwr); __func__, &mr->frwr);
ib_dma_unmap_sg(ia->ri_device, rpcrdma_mr_unmap_and_put(mr);
mr->mr_sg, mr->mr_nents, mr->mr_dir);
rpcrdma_mr_put(mr);
} }
return; return;
......
...@@ -1321,6 +1321,14 @@ rpcrdma_mr_get(struct rpcrdma_xprt *r_xprt) ...@@ -1321,6 +1321,14 @@ rpcrdma_mr_get(struct rpcrdma_xprt *r_xprt)
return NULL; return NULL;
} }
static void
__rpcrdma_mr_put(struct rpcrdma_buffer *buf, struct rpcrdma_mr *mr)
{
spin_lock(&buf->rb_mrlock);
rpcrdma_mr_push(mr, &buf->rb_mrs);
spin_unlock(&buf->rb_mrlock);
}
/** /**
* rpcrdma_mr_put - Release an rpcrdma_mr object * rpcrdma_mr_put - Release an rpcrdma_mr object
* @mr: object to release * @mr: object to release
...@@ -1328,13 +1336,23 @@ rpcrdma_mr_get(struct rpcrdma_xprt *r_xprt) ...@@ -1328,13 +1336,23 @@ rpcrdma_mr_get(struct rpcrdma_xprt *r_xprt)
*/ */
void void
rpcrdma_mr_put(struct rpcrdma_mr *mr) rpcrdma_mr_put(struct rpcrdma_mr *mr)
{
__rpcrdma_mr_put(&mr->mr_xprt->rx_buf, mr);
}
/**
* rpcrdma_mr_unmap_and_put - DMA unmap an MR and release it
* @mr: object to release
*
*/
void
rpcrdma_mr_unmap_and_put(struct rpcrdma_mr *mr)
{ {
struct rpcrdma_xprt *r_xprt = mr->mr_xprt; struct rpcrdma_xprt *r_xprt = mr->mr_xprt;
struct rpcrdma_buffer *buf = &r_xprt->rx_buf;
spin_lock(&buf->rb_mrlock); ib_dma_unmap_sg(r_xprt->rx_ia.ri_device,
rpcrdma_mr_push(mr, &buf->rb_mrs); mr->mr_sg, mr->mr_nents, mr->mr_dir);
spin_unlock(&buf->rb_mrlock); __rpcrdma_mr_put(&r_xprt->rx_buf, mr);
} }
static struct rpcrdma_rep * static struct rpcrdma_rep *
......
...@@ -576,6 +576,7 @@ void rpcrdma_sendctx_put_locked(struct rpcrdma_sendctx *sc); ...@@ -576,6 +576,7 @@ void rpcrdma_sendctx_put_locked(struct rpcrdma_sendctx *sc);
struct rpcrdma_mr *rpcrdma_mr_get(struct rpcrdma_xprt *r_xprt); struct rpcrdma_mr *rpcrdma_mr_get(struct rpcrdma_xprt *r_xprt);
void rpcrdma_mr_put(struct rpcrdma_mr *mr); void rpcrdma_mr_put(struct rpcrdma_mr *mr);
void rpcrdma_mr_unmap_and_put(struct rpcrdma_mr *mr);
void rpcrdma_mr_defer_recovery(struct rpcrdma_mr *mr); void rpcrdma_mr_defer_recovery(struct rpcrdma_mr *mr);
struct rpcrdma_req *rpcrdma_buffer_get(struct rpcrdma_buffer *); struct rpcrdma_req *rpcrdma_buffer_get(struct rpcrdma_buffer *);
......
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