NFSD: Optimize nfsd4_encode_readv()
authorChuck Lever <chuck.lever@oracle.com>
Fri, 22 Jul 2022 20:09:04 +0000 (16:09 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Sat, 30 Jul 2022 00:16:57 +0000 (20:16 -0400)
write_bytes_to_xdr_buf() is pretty expensive to use for inserting
an XDR data item that is always 1 XDR_UNIT at an address that is
always XDR word-aligned.

Since both the readv and splice read paths encode EOF and maxcount
values, move both to a common code path.

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4xdr.c

index 16ae1be1bbacbfd60b78baf02e2e432d620774de..1e59d4ce529ff01be4e532693a0ad89d2f501ca0 100644 (file)
@@ -3880,7 +3880,6 @@ static __be32 nfsd4_encode_splice_read(
        struct xdr_buf *buf = xdr->buf;
        int status, space_left;
        __be32 nfserr;
-       __be32 *p = xdr->p - 2;
 
        /* Make sure there will be room for padding if needed */
        if (xdr->end - xdr->p < 1)
@@ -3899,9 +3898,6 @@ static __be32 nfsd4_encode_splice_read(
                goto out_err;
        }
 
-       *(p++) = htonl(read->rd_eof);
-       *(p++) = htonl(maxcount);
-
        buf->page_len = maxcount;
        buf->len += maxcount;
        xdr->page_ptr += (buf->page_base + maxcount + PAGE_SIZE - 1)
@@ -3962,11 +3958,6 @@ static __be32 nfsd4_encode_readv(struct nfsd4_compoundres *resp,
                return nfserr_io;
        xdr_truncate_encode(xdr, starting_len + 8 + xdr_align_size(maxcount));
 
-       tmp = htonl(read->rd_eof);
-       write_bytes_to_xdr_buf(xdr->buf, starting_len    , &tmp, 4);
-       tmp = htonl(maxcount);
-       write_bytes_to_xdr_buf(xdr->buf, starting_len + 4, &tmp, 4);
-
        tmp = xdr_zero;
        pad = (maxcount&3) ? 4 - (maxcount&3) : 0;
        write_bytes_to_xdr_buf(xdr->buf, starting_len + 8 + maxcount,
@@ -4008,11 +3999,14 @@ nfsd4_encode_read(struct nfsd4_compoundres *resp, __be32 nfserr,
                nfserr = nfsd4_encode_splice_read(resp, read, file, maxcount);
        else
                nfserr = nfsd4_encode_readv(resp, read, file, maxcount);
-
-       if (nfserr)
+       if (nfserr) {
                xdr_truncate_encode(xdr, starting_len);
+               return nfserr;
+       }
 
-       return nfserr;
+       p = xdr_encode_bool(p, read->rd_eof);
+       *p = cpu_to_be32(read->rd_length);
+       return nfs_ok;
 }
 
 static __be32