This series implements support for multiple RPC/RDMA chunks per RPC transaction. This is one of the few remaining generalities that the Linux NFS/RDMA server implementation lacks. There is currently one known NFS/RDMA client implementation that can send multiple chunks per RPC, and that is Solaris. Multiple chunks are rare enough that the Linux NFS/RDMA implementation has been successful without this support for many years. Along with multiple chunk support, this series adds the following benefits: - More robust input sanitization of RPC/RDMA headers - An internal representation of chunks that is agnostic to their wire format The cost is a little additional complexity and some extra memory allocations when handling non-empty chunk lists. Most of these allocations can be optimized away if we find they are a problem. --- Chuck Lever (20): SUNRPC: Adjust synopsis of xdr_buf_subsegment() svcrdma: Const-ify the xdr_buf arguments svcrdma: Refactor the RDMA Write path SUNRPC: Rename svc_encode_read_payload() NFSD: Invoke svc_encode_result_payload() in "read" NFSD encoders svcrdma: Post RDMA Writes while XDR encoding replies svcrdma: Clean up svc_rdma_encode_reply_chunk() svcrdma: Add a "parsed chunk list" data structure svcrdma: Use parsed chunk lists to derive the inv_rkey svcrdma: Use parsed chunk lists to detect reverse direction replies svcrdma: Use parsed chunk lists to construct RDMA Writes svcrdma: Use parsed chunk lists to encode Reply transport headers svcrdma: Support multiple write chunks when pulling up svcrdma: Support multiple Write chunks in svc_rdma_map_reply_msg() svcrdma: Support multiple Write chunks in svc_rdma_send_reply_chunk svcrdma: Remove chunk list pointers svcrdma: Clean up chunk tracepoints svcrdma: Rename info::ri_chunklen svcrdma: Use the new parsed chunk list when pulling Read chunks svcrdma: support multiple Read chunks per RPC fs/nfsd/nfs3xdr.c | 4 + fs/nfsd/nfs4xdr.c | 5 +- fs/nfsd/nfsxdr.c | 4 + include/linux/sunrpc/svc.h | 6 +- include/linux/sunrpc/svc_rdma.h | 36 +- include/linux/sunrpc/svc_rdma_pcl.h | 128 +++++ include/linux/sunrpc/svc_xprt.h | 4 +- include/trace/events/rpcrdma.h | 143 +++-- net/sunrpc/svc.c | 11 +- net/sunrpc/svcsock.c | 8 +- net/sunrpc/xprtrdma/Makefile | 2 +- net/sunrpc/xprtrdma/svc_rdma_backchannel.c | 14 +- net/sunrpc/xprtrdma/svc_rdma_pcl.c | 306 +++++++++++ net/sunrpc/xprtrdma/svc_rdma_recvfrom.c | 314 ++++++----- net/sunrpc/xprtrdma/svc_rdma_rw.c | 598 +++++++++++++++------ net/sunrpc/xprtrdma/svc_rdma_sendto.c | 561 ++++++++++--------- net/sunrpc/xprtrdma/svc_rdma_transport.c | 2 +- 17 files changed, 1488 insertions(+), 658 deletions(-) create mode 100644 include/linux/sunrpc/svc_rdma_pcl.h create mode 100644 net/sunrpc/xprtrdma/svc_rdma_pcl.c -- Chuck Lever