xprtrdma: Refactor __fmr_dma_unmap()
authorChuck Lever <chuck.lever@oracle.com>
Mon, 2 May 2016 18:42:38 +0000 (14:42 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Tue, 17 May 2016 19:48:03 +0000 (15:48 -0400)
Separate the DMA unmap operation from freeing the MW. In a
subsequent patch they will not always be done at the same time,
and they are not related operations (except by order; freeing
the MW must be the last step during invalidation).

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Tested-by: Steve Wise <swise@opengridcomputing.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
net/sunrpc/xprtrdma/fmr_ops.c

index 009694b0c56e538a5cc12fe291447f184375f6a0..9d50f3a5732a9aabf5ecfc6aaf6e3187150c0aa0 100644 (file)
@@ -186,15 +186,10 @@ static void
 __fmr_dma_unmap(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr_seg *seg)
 {
        struct ib_device *device = r_xprt->rx_ia.ri_device;
-       struct rpcrdma_mw *mw = seg->rl_mw;
        int nsegs = seg->mr_nsegs;
 
-       seg->rl_mw = NULL;
-
        while (nsegs--)
                rpcrdma_unmap_one(device, seg++);
-
-       rpcrdma_put_mw(r_xprt, mw);
 }
 
 /* Invalidate all memory regions that were registered for "req".
@@ -237,9 +232,11 @@ fmr_op_unmap_sync(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req)
                seg = &req->rl_segments[i];
 
                __fmr_dma_unmap(r_xprt, seg);
+               rpcrdma_put_mw(r_xprt, seg->rl_mw);
 
                i += seg->mr_nsegs;
                seg->mr_nsegs = 0;
+               seg->rl_mw = NULL;
        }
 
        req->rl_nchunks = 0;