svcrdma: Add common XDR encoders for RDMA and Read segments
authorChuck Lever <chuck.lever@oracle.com>
Tue, 7 Apr 2020 19:32:14 +0000 (15:32 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 13 Jul 2020 21:28:24 +0000 (17:28 -0400)
Clean up: De-duplicate some code.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
include/linux/sunrpc/rpc_rdma.h
net/sunrpc/xprtrdma/rpc_rdma.c
net/sunrpc/xprtrdma/svc_rdma_sendto.c

index db50380f64f4de4633c888b024e5b027036cfaf7..4af31bbc880241bb781243f81280a071d03011fd 100644 (file)
@@ -124,6 +124,43 @@ rpcrdma_decode_buffer_size(u8 val)
        return ((unsigned int)val + 1) << 10;
 }
 
+/**
+ * xdr_encode_rdma_segment - Encode contents of an RDMA segment
+ * @p: Pointer into a send buffer
+ * @handle: The RDMA handle to encode
+ * @length: The RDMA length to encode
+ * @offset: The RDMA offset to encode
+ *
+ * Return value:
+ *   Pointer to the XDR position that follows the encoded RDMA segment
+ */
+static inline __be32 *xdr_encode_rdma_segment(__be32 *p, u32 handle,
+                                             u32 length, u64 offset)
+{
+       *p++ = cpu_to_be32(handle);
+       *p++ = cpu_to_be32(length);
+       return xdr_encode_hyper(p, offset);
+}
+
+/**
+ * xdr_encode_read_segment - Encode contents of a Read segment
+ * @p: Pointer into a send buffer
+ * @position: The position to encode
+ * @handle: The RDMA handle to encode
+ * @length: The RDMA length to encode
+ * @offset: The RDMA offset to encode
+ *
+ * Return value:
+ *   Pointer to the XDR position that follows the encoded Read segment
+ */
+static inline __be32 *xdr_encode_read_segment(__be32 *p, u32 position,
+                                             u32 handle, u32 length,
+                                             u64 offset)
+{
+       *p++ = cpu_to_be32(position);
+       return xdr_encode_rdma_segment(p, handle, length, offset);
+}
+
 /**
  * xdr_decode_rdma_segment - Decode contents of an RDMA segment
  * @p: Pointer to the undecoded RDMA segment
index 5461f01eeca66818a2b88151f8b63e09fcb64592..73ed51893175dfa591e5c569d4748f83bfacd954 100644 (file)
@@ -275,14 +275,6 @@ out:
        return n;
 }
 
-static void
-xdr_encode_rdma_segment(__be32 *iptr, struct rpcrdma_mr *mr)
-{
-       *iptr++ = cpu_to_be32(mr->mr_handle);
-       *iptr++ = cpu_to_be32(mr->mr_length);
-       xdr_encode_hyper(iptr, mr->mr_offset);
-}
-
 static int
 encode_rdma_segment(struct xdr_stream *xdr, struct rpcrdma_mr *mr)
 {
@@ -292,7 +284,7 @@ encode_rdma_segment(struct xdr_stream *xdr, struct rpcrdma_mr *mr)
        if (unlikely(!p))
                return -EMSGSIZE;
 
-       xdr_encode_rdma_segment(p, mr);
+       xdr_encode_rdma_segment(p, mr->mr_handle, mr->mr_length, mr->mr_offset);
        return 0;
 }
 
@@ -307,8 +299,8 @@ encode_read_segment(struct xdr_stream *xdr, struct rpcrdma_mr *mr,
                return -EMSGSIZE;
 
        *p++ = xdr_one;                 /* Item present */
-       *p++ = cpu_to_be32(position);
-       xdr_encode_rdma_segment(p, mr);
+       xdr_encode_read_segment(p, position, mr->mr_handle, mr->mr_length,
+                               mr->mr_offset);
        return 0;
 }
 
index a78f1d22e9bb34f90f1a4cadd8e18cb8c03a3f4d..38d8f0ee35ecdd931849ec34b809dbd41f66fcdd 100644 (file)
@@ -376,7 +376,6 @@ static ssize_t svc_rdma_encode_write_segment(__be32 *src,
 
        xdr_decode_rdma_segment(src, &handle, &length, &offset);
 
-       *p++ = cpu_to_be32(handle);
        if (*remaining < length) {
                /* segment only partly filled */
                length = *remaining;
@@ -385,8 +384,7 @@ static ssize_t svc_rdma_encode_write_segment(__be32 *src,
                /* entire segment was consumed */
                *remaining -= length;
        }
-       *p++ = cpu_to_be32(length);
-       xdr_encode_hyper(p, offset);
+       xdr_encode_rdma_segment(p, handle, length, offset);
 
        trace_svcrdma_encode_wseg(handle, length, offset);
        return len;