| From c95a3c6b88658bcb8f77f85f31a0b9d9036e8016 Mon Sep 17 00:00:00 2001 |
| From: Chuck Lever <chuck.lever@oracle.com> |
| Date: Wed, 8 Feb 2017 17:00:02 -0500 |
| Subject: xprtrdma: Disable pad optimization by default |
| |
| From: Chuck Lever <chuck.lever@oracle.com> |
| |
| commit c95a3c6b88658bcb8f77f85f31a0b9d9036e8016 upstream. |
| |
| Commit d5440e27d3e5 ("xprtrdma: Enable pad optimization") made the |
| Linux client omit XDR round-up padding in normal Read and Write |
| chunks so that the client doesn't have to register and invalidate |
| 3-byte memory regions that contain no real data. |
| |
| Unfortunately, my cheery 2014 assessment that this optimization "is |
| supported now by both Linux and Solaris servers" was premature. |
| We've found bugs in Solaris in this area since commit d5440e27d3e5 |
| ("xprtrdma: Enable pad optimization") was merged (SYMLINK is the |
| main offender). |
| |
| So for maximum interoperability, I'm disabling this optimization |
| again. If a CM private message is exchanged when connecting, the |
| client recognizes that the server is Linux, and enables the |
| optimization for that connection. |
| |
| Until now the Solaris server bugs did not impact common operations, |
| and were thus largely benign. Soon, less capable devices on Linux |
| NFS/RDMA clients will make use of Read chunks more often, and these |
| Solaris bugs will prevent interoperation in more cases. |
| |
| Fixes: 677eb17e94ed ("xprtrdma: Fix XDR tail buffer marshalling") |
| Signed-off-by: Chuck Lever <chuck.lever@oracle.com> |
| Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| net/sunrpc/xprtrdma/transport.c | 2 +- |
| net/sunrpc/xprtrdma/verbs.c | 1 + |
| 2 files changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/net/sunrpc/xprtrdma/transport.c |
| +++ b/net/sunrpc/xprtrdma/transport.c |
| @@ -67,7 +67,7 @@ unsigned int xprt_rdma_max_inline_read = |
| static unsigned int xprt_rdma_max_inline_write = RPCRDMA_DEF_INLINE; |
| static unsigned int xprt_rdma_inline_write_padding; |
| static unsigned int xprt_rdma_memreg_strategy = RPCRDMA_FRMR; |
| - int xprt_rdma_pad_optimize = 1; |
| + int xprt_rdma_pad_optimize = 0; |
| |
| #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) |
| |
| --- a/net/sunrpc/xprtrdma/verbs.c |
| +++ b/net/sunrpc/xprtrdma/verbs.c |
| @@ -216,6 +216,7 @@ rpcrdma_update_connect_private(struct rp |
| pmsg->cp_magic == rpcrdma_cmp_magic && |
| pmsg->cp_version == RPCRDMA_CMP_VERSION) { |
| r_xprt->rx_ia.ri_reminv_expected = true; |
| + r_xprt->rx_ia.ri_implicit_roundup = true; |
| rsize = rpcrdma_decode_buffer_size(pmsg->cp_send_size); |
| wsize = rpcrdma_decode_buffer_size(pmsg->cp_recv_size); |
| } |