]> git.openfabrics.org - ~emulex/for-vlad/old/compat-rdma.git/commitdiff
svcrdma: advertise the correct max payload
authorSteve Wise <swise@opengridcomputing.com>
Wed, 1 Oct 2014 23:50:07 +0000 (18:50 -0500)
committerSteve Wise <swise@opengridcomputing.com>
Wed, 1 Oct 2014 23:50:07 +0000 (18:50 -0500)
Pull in this:

commit 7e5be28827bf5c1989218c4b7bf64fdbc3d679b5
Author: Steve Wise <swise@opengridcomputing.com>
Date:   Tue Sep 23 17:11:22 2014 -0500

    svcrdma: advertise the correct max payload

Signed-off-by: Steve Wise <swise@opengridcomputing.com>
linux-next-cherry-picks/0168-svcrdma--advertise-the-correct-max-payload.patch [new file with mode: 0644]

diff --git a/linux-next-cherry-picks/0168-svcrdma--advertise-the-correct-max-payload.patch b/linux-next-cherry-picks/0168-svcrdma--advertise-the-correct-max-payload.patch
new file mode 100644 (file)
index 0000000..2e3b516
--- /dev/null
@@ -0,0 +1,53 @@
+commit 7e5be28827bf5c1989218c4b7bf64fdbc3d679b5
+Author: Steve Wise <swise@opengridcomputing.com>
+Date:   Tue Sep 23 17:11:22 2014 -0500
+
+    svcrdma: advertise the correct max payload
+    
+    Svcrdma currently advertises 1MB, which is too large.  The correct value
+    is the minimum of RPCSVC_MAXPAYLOAD and the max scatter-gather allowed
+    in an NFSRDMA IO chunk * the host page size. This bug is usually benign
+    because the Linux X64 NFSRDMA client correctly limits the payload size to
+    the correct value (64*4096 = 256KB).  But if the Linux client is PPC64
+    with a 64KB page size, then the client will indeed use a payload size
+    that will overflow the server.
+    
+    Signed-off-by: Steve Wise <swise@opengridcomputing.com>
+    Signed-off-by: J. Bruce Fields <bfields@redhat.com>
+
+diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c
+index 374feb4..4e61880 100644
+--- a/net/sunrpc/xprtrdma/svc_rdma_transport.c
++++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c
+@@ -91,7 +91,7 @@ struct svc_xprt_class svc_rdma_class = {
+       .xcl_name = "rdma",
+       .xcl_owner = THIS_MODULE,
+       .xcl_ops = &svc_rdma_ops,
+-      .xcl_max_payload = RPCSVC_MAXPAYLOAD_TCP,
++      .xcl_max_payload = RPCSVC_MAXPAYLOAD_RDMA,
+ };
+ struct svc_rdma_op_ctxt *svc_rdma_get_context(struct svcxprt_rdma *xprt)
+diff --git a/net/sunrpc/xprtrdma/xprt_rdma.h b/net/sunrpc/xprtrdma/xprt_rdma.h
+index c419498..ac7fc9a 100644
+--- a/net/sunrpc/xprtrdma/xprt_rdma.h
++++ b/net/sunrpc/xprtrdma/xprt_rdma.h
+@@ -51,6 +51,7 @@
+ #include <linux/sunrpc/clnt.h>                /* rpc_xprt */
+ #include <linux/sunrpc/rpc_rdma.h>    /* RPC/RDMA protocol */
+ #include <linux/sunrpc/xprtrdma.h>    /* xprt parameters */
++#include <linux/sunrpc/svc.h>         /* RPCSVC_MAXPAYLOAD */
+ #define RDMA_RESOLVE_TIMEOUT  (5000)  /* 5 seconds */
+ #define RDMA_CONNECT_RETRY_MAX        (2)     /* retries if no listener backlog */
+@@ -392,4 +393,10 @@ extern struct kmem_cache *svc_rdma_ctxt_cachep;
+ /* Workqueue created in svc_rdma.c */
+ extern struct workqueue_struct *svc_rdma_wq;
++#if RPCSVC_MAXPAYLOAD < (RPCRDMA_MAX_DATA_SEGS << PAGE_SHIFT)
++#define RPCSVC_MAXPAYLOAD_RDMA RPCSVC_MAXPAYLOAD
++#else
++#define RPCSVC_MAXPAYLOAD_RDMA (RPCRDMA_MAX_DATA_SEGS << PAGE_SHIFT)
++#endif
++
+ #endif                                /* _LINUX_SUNRPC_XPRT_RDMA_H */