diff options
author | Steve Wise <swise@opengridcomputing.com> | 2014-09-23 18:11:22 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2014-09-29 14:35:18 -0400 |
commit | 7e5be28827bf5c1989218c4b7bf64fdbc3d679b5 (patch) | |
tree | 070f7e780597acd2543d53f2eafe0bf88d777a3b /net/sunrpc/xprtrdma | |
parent | 0162ac2b978e18792fa8cf3c0b4304321b4a3983 (diff) |
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>
Diffstat (limited to 'net/sunrpc/xprtrdma')
-rw-r--r-- | net/sunrpc/xprtrdma/svc_rdma_transport.c | 2 | ||||
-rw-r--r-- | net/sunrpc/xprtrdma/xprt_rdma.h | 7 |
2 files changed, 8 insertions, 1 deletions
diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c index 374feb44afea..4e618808bc98 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 = { | |||
91 | .xcl_name = "rdma", | 91 | .xcl_name = "rdma", |
92 | .xcl_owner = THIS_MODULE, | 92 | .xcl_owner = THIS_MODULE, |
93 | .xcl_ops = &svc_rdma_ops, | 93 | .xcl_ops = &svc_rdma_ops, |
94 | .xcl_max_payload = RPCSVC_MAXPAYLOAD_TCP, | 94 | .xcl_max_payload = RPCSVC_MAXPAYLOAD_RDMA, |
95 | .xcl_ident = XPRT_TRANSPORT_RDMA, | 95 | .xcl_ident = XPRT_TRANSPORT_RDMA, |
96 | }; | 96 | }; |
97 | 97 | ||
diff --git a/net/sunrpc/xprtrdma/xprt_rdma.h b/net/sunrpc/xprtrdma/xprt_rdma.h index c419498b8f46..ac7fc9a31342 100644 --- a/net/sunrpc/xprtrdma/xprt_rdma.h +++ b/net/sunrpc/xprtrdma/xprt_rdma.h | |||
@@ -51,6 +51,7 @@ | |||
51 | #include <linux/sunrpc/clnt.h> /* rpc_xprt */ | 51 | #include <linux/sunrpc/clnt.h> /* rpc_xprt */ |
52 | #include <linux/sunrpc/rpc_rdma.h> /* RPC/RDMA protocol */ | 52 | #include <linux/sunrpc/rpc_rdma.h> /* RPC/RDMA protocol */ |
53 | #include <linux/sunrpc/xprtrdma.h> /* xprt parameters */ | 53 | #include <linux/sunrpc/xprtrdma.h> /* xprt parameters */ |
54 | #include <linux/sunrpc/svc.h> /* RPCSVC_MAXPAYLOAD */ | ||
54 | 55 | ||
55 | #define RDMA_RESOLVE_TIMEOUT (5000) /* 5 seconds */ | 56 | #define RDMA_RESOLVE_TIMEOUT (5000) /* 5 seconds */ |
56 | #define RDMA_CONNECT_RETRY_MAX (2) /* retries if no listener backlog */ | 57 | #define RDMA_CONNECT_RETRY_MAX (2) /* retries if no listener backlog */ |
@@ -392,4 +393,10 @@ extern struct kmem_cache *svc_rdma_ctxt_cachep; | |||
392 | /* Workqueue created in svc_rdma.c */ | 393 | /* Workqueue created in svc_rdma.c */ |
393 | extern struct workqueue_struct *svc_rdma_wq; | 394 | extern struct workqueue_struct *svc_rdma_wq; |
394 | 395 | ||
396 | #if RPCSVC_MAXPAYLOAD < (RPCRDMA_MAX_DATA_SEGS << PAGE_SHIFT) | ||
397 | #define RPCSVC_MAXPAYLOAD_RDMA RPCSVC_MAXPAYLOAD | ||
398 | #else | ||
399 | #define RPCSVC_MAXPAYLOAD_RDMA (RPCRDMA_MAX_DATA_SEGS << PAGE_SHIFT) | ||
400 | #endif | ||
401 | |||
395 | #endif /* _LINUX_SUNRPC_XPRT_RDMA_H */ | 402 | #endif /* _LINUX_SUNRPC_XPRT_RDMA_H */ |