xprtrdma: Simplify rpcrdma_convert_kvec() and frwr_map()
authorChuck Lever <chuck.lever@oracle.com>
Thu, 4 Feb 2021 16:59:07 +0000 (11:59 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Fri, 5 Feb 2021 16:16:55 +0000 (11:16 -0500)
Clean up.

Remove a conditional branch from the SGL set-up loop in frwr_map():
Instead of using either sg_set_page() or sg_set_buf(), initialize
the mr_page field properly when rpcrdma_convert_kvec() converts the
kvec to an SGL entry. frwr_map() can then invoke sg_set_page()
unconditionally.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Reviewed-by: Tom Talpey <tom@talpey.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
net/sunrpc/xprtrdma/frwr_ops.c
net/sunrpc/xprtrdma/rpc_rdma.c
net/sunrpc/xprtrdma/xprt_rdma.h

index baca49f..13a50f7 100644 (file)
@@ -306,14 +306,10 @@ struct rpcrdma_mr_seg *frwr_map(struct rpcrdma_xprt *r_xprt,
        if (nsegs > ep->re_max_fr_depth)
                nsegs = ep->re_max_fr_depth;
        for (i = 0; i < nsegs;) {
-               if (seg->mr_page)
-                       sg_set_page(&mr->mr_sg[i],
-                                   seg->mr_page,
-                                   seg->mr_len,
-                                   offset_in_page(seg->mr_offset));
-               else
-                       sg_set_buf(&mr->mr_sg[i], seg->mr_offset,
-                                  seg->mr_len);
+               sg_set_page(&mr->mr_sg[i],
+                           seg->mr_page,
+                           seg->mr_len,
+                           offset_in_page(seg->mr_offset));
 
                ++seg;
                ++i;
index 57f9217..b36b9aa 100644 (file)
@@ -213,7 +213,7 @@ static struct rpcrdma_mr_seg *
 rpcrdma_convert_kvec(struct kvec *vec, struct rpcrdma_mr_seg *seg,
                     unsigned int *n)
 {
-       seg->mr_page = NULL;
+       seg->mr_page = virt_to_page(vec->iov_base);
        seg->mr_offset = vec->iov_base;
        seg->mr_len = vec->iov_len;
        ++seg;
index 94b2865..02971e1 100644 (file)
@@ -283,10 +283,11 @@ enum {
                                  RPCRDMA_MAX_IOV_SEGS,
 };
 
-struct rpcrdma_mr_seg {                /* chunk descriptors */
-       u32             mr_len;         /* length of chunk or segment */
-       struct page     *mr_page;       /* owning page, if any */
-       char            *mr_offset;     /* kva if no page, else offset */
+/* Arguments for DMA mapping and registration */
+struct rpcrdma_mr_seg {
+       u32             mr_len;         /* length of segment */
+       struct page     *mr_page;       /* underlying struct page */
+       char            *mr_offset;     /* IN: page offset, OUT: iova */
 };
 
 /* The Send SGE array is provisioned to send a maximum size