Patch "xprtrdma: Fix Read chunk padding" has been added to the 4.9-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
xprtrdma: Fix Read chunk padding
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
xprtrdma-fix-read-chunk-padding.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
24abdf1be15c478e2821d6fc903a4a4440beff02Mon Sep 17 00:00:00 2001
From: Chuck Lever <[email protected]>
Date: Wed, 8 Feb 2017 16:59:46 -0500
Subject: xprtrdma: Fix Read chunk padding
From: Chuck Lever <[email protected]>
commit 24abdf1be15c478e2821d6fc903a4a4440beff02 upstream.
When pad optimization is disabled, rpcrdma_convert_iovs still does not add explicit XDR round-up padding to a Read chunk.
Commit 677eb17e94ed ("xprtrdma: Fix XDR tail buffer marshalling") incorrectly short-circuited the test for whether round-up padding is needed that appears later in rpcrdma_convert_iovs.
However, if this is indeed a regular Read chunk (and not a Position-Zero Read chunk), the tail iovec _always_ contains the chunk's padding, and never anything else.
So, it's easy to just skip the tail when padding optimization is enabled, and add the tail in a subsequent Read chunk segment, if disabled.
--- net/sunrpc/xprtrdma/rpc_rdma.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
net/sunrpc/xprtrdma/rpc_rdma.c +4 -6
@@ -226,8 +226,10 @@ rpcrdma_convert_iovs(struct xdr_buf *xdrif (len && n ==RPCRDMA_MAX_SEGS ) goto out_overflow; -/* When encoding the read list, the tail is always sent inline */ -if (type == rpcrdma_readch) +/* When encoding a Read chunk, the tail iovec contains an +* XDR pad and may be omitted. +*/ +if (type == rpcrdma_readch && xprt_rdma_pad_optimize)return n;/* When encoding the Write list, some servers need to see an extra
@@ -238,10 +240,6 @@ rpcrdma_convert_iovs(struct xdr_buf *xdrreturn n;if (xdrbuf->tail[0 ].iov_len) { -/* the rpcrdma protocol allows us to omit any trailing -* xdr pad bytes, saving the server an RDMA operation. */ -if (xdrbuf->tail[0 ].iov_len <4 && xprt_rdma_pad_optimize) -return n; n =rpcrdma_convert_kvec (&xdrbuf->tail[0 ], seg, n);if (n ==RPCRDMA_MAX_SEGS ) goto out_overflow;
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/xprtrdma-disable-pad-optimization-by-default.patch queue-4.9/xprtrdma-fix-read-chunk-padding.patch queue-4.9/xprtrdma-reduce-required-number-of-send-sges.patch queue-4.9/nfsd-special-case-truncates-some-more.patch queue-4.9/xprtrdma-per-connection-pad-optimization.patch