aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/xprtsock.c
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2019-02-11 11:24:37 -0500
committerAnna Schumaker <Anna.Schumaker@Netapp.com>2019-02-13 13:14:35 -0500
commit067fb11b12af1448f7bbcacca41e470cb775e9fa (patch)
tree22bb526dc0c5ff6ea1707206b0c5253e3f7c2ca0 /net/sunrpc/xprtsock.c
parent80125d4ae70aff049b170dd21ea5d007694d629a (diff)
SUNRPC: Remove rpc_xprt::tsh_size
tsh_size was added to accommodate transports that send a pre-amble before each RPC message. However, this assumes the pre-amble is fixed in size, which isn't true for some transports. That makes tsh_size not very generic. Also I'd like to make the estimation of RPC send and receive buffer sizes more precise. tsh_size doesn't currently appear to be accounted for at all by call_allocate. Therefore let's just remove the tsh_size concept, and make the only transports that have a non-zero tsh_size employ a direct approach. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Diffstat (limited to 'net/sunrpc/xprtsock.c')
-rw-r--r--net/sunrpc/xprtsock.c91
1 files changed, 60 insertions, 31 deletions
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index 7754aa3e434f..ae09d850cd11 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -696,6 +696,40 @@ xs_stream_reset_connect(struct sock_xprt *transport)
696 696
697#define XS_SENDMSG_FLAGS (MSG_DONTWAIT | MSG_NOSIGNAL) 697#define XS_SENDMSG_FLAGS (MSG_DONTWAIT | MSG_NOSIGNAL)
698 698
699/* Common case:
700 * - stream transport
701 * - sending from byte 0 of the message
702 * - the message is wholly contained in @xdr's head iovec
703 */
704static int xs_send_rm_and_kvec(struct socket *sock, struct xdr_buf *xdr,
705 unsigned int remainder)
706{
707 struct msghdr msg = {
708 .msg_flags = XS_SENDMSG_FLAGS | (remainder ? MSG_MORE : 0)
709 };
710 rpc_fraghdr marker = cpu_to_be32(RPC_LAST_STREAM_FRAGMENT |
711 (u32)xdr->len);
712 struct kvec iov[2] = {
713 {
714 .iov_base = &marker,
715 .iov_len = sizeof(marker)
716 },
717 {
718 .iov_base = xdr->head[0].iov_base,
719 .iov_len = xdr->head[0].iov_len
720 },
721 };
722 int ret;
723
724 ret = kernel_sendmsg(sock, &msg, iov, 2,
725 iov[0].iov_len + iov[1].iov_len);
726 if (ret < 0)
727 return ret;
728 if (ret < iov[0].iov_len)
729 return -EPIPE;
730 return ret - iov[0].iov_len;
731}
732
699static int xs_send_kvec(struct socket *sock, struct sockaddr *addr, int addrlen, struct kvec *vec, unsigned int base, int more) 733static int xs_send_kvec(struct socket *sock, struct sockaddr *addr, int addrlen, struct kvec *vec, unsigned int base, int more)
700{ 734{
701 struct msghdr msg = { 735 struct msghdr msg = {
@@ -779,7 +813,11 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,
779 if (base < xdr->head[0].iov_len || addr != NULL) { 813 if (base < xdr->head[0].iov_len || addr != NULL) {
780 unsigned int len = xdr->head[0].iov_len - base; 814 unsigned int len = xdr->head[0].iov_len - base;
781 remainder -= len; 815 remainder -= len;
782 err = xs_send_kvec(sock, addr, addrlen, &xdr->head[0], base, remainder != 0); 816 if (!base && !addr)
817 err = xs_send_rm_and_kvec(sock, xdr, remainder);
818 else
819 err = xs_send_kvec(sock, addr, addrlen, &xdr->head[0],
820 base, remainder != 0);
783 if (remainder == 0 || err != len) 821 if (remainder == 0 || err != len)
784 goto out; 822 goto out;
785 *sent_p += err; 823 *sent_p += err;
@@ -869,16 +907,6 @@ xs_send_request_was_aborted(struct sock_xprt *transport, struct rpc_rqst *req)
869 return transport->xmit.offset != 0 && req->rq_bytes_sent == 0; 907 return transport->xmit.offset != 0 && req->rq_bytes_sent == 0;
870} 908}
871 909
872/*
873 * Construct a stream transport record marker in @buf.
874 */
875static inline void xs_encode_stream_record_marker(struct xdr_buf *buf)
876{
877 u32 reclen = buf->len - sizeof(rpc_fraghdr);
878 rpc_fraghdr *base = buf->head[0].iov_base;
879 *base = cpu_to_be32(RPC_LAST_STREAM_FRAGMENT | reclen);
880}
881
882/** 910/**
883 * xs_local_send_request - write an RPC request to an AF_LOCAL socket 911 * xs_local_send_request - write an RPC request to an AF_LOCAL socket
884 * @req: pointer to RPC request 912 * @req: pointer to RPC request
@@ -905,8 +933,6 @@ static int xs_local_send_request(struct rpc_rqst *req)
905 return -ENOTCONN; 933 return -ENOTCONN;
906 } 934 }
907 935
908 xs_encode_stream_record_marker(&req->rq_snd_buf);
909
910 xs_pktdump("packet data:", 936 xs_pktdump("packet data:",
911 req->rq_svec->iov_base, req->rq_svec->iov_len); 937 req->rq_svec->iov_base, req->rq_svec->iov_len);
912 938
@@ -1057,8 +1083,6 @@ static int xs_tcp_send_request(struct rpc_rqst *req)
1057 return -ENOTCONN; 1083 return -ENOTCONN;
1058 } 1084 }
1059 1085
1060 xs_encode_stream_record_marker(&req->rq_snd_buf);
1061
1062 xs_pktdump("packet data:", 1086 xs_pktdump("packet data:",
1063 req->rq_svec->iov_base, 1087 req->rq_svec->iov_base,
1064 req->rq_svec->iov_len); 1088 req->rq_svec->iov_len);
@@ -2534,26 +2558,35 @@ static int bc_sendto(struct rpc_rqst *req)
2534{ 2558{
2535 int len; 2559 int len;
2536 struct xdr_buf *xbufp = &req->rq_snd_buf; 2560 struct xdr_buf *xbufp = &req->rq_snd_buf;
2537 struct rpc_xprt *xprt = req->rq_xprt;
2538 struct sock_xprt *transport = 2561 struct sock_xprt *transport =
2539 container_of(xprt, struct sock_xprt, xprt); 2562 container_of(req->rq_xprt, struct sock_xprt, xprt);
2540 struct socket *sock = transport->sock;
2541 unsigned long headoff; 2563 unsigned long headoff;
2542 unsigned long tailoff; 2564 unsigned long tailoff;
2565 struct page *tailpage;
2566 struct msghdr msg = {
2567 .msg_flags = MSG_MORE
2568 };
2569 rpc_fraghdr marker = cpu_to_be32(RPC_LAST_STREAM_FRAGMENT |
2570 (u32)xbufp->len);
2571 struct kvec iov = {
2572 .iov_base = &marker,
2573 .iov_len = sizeof(marker),
2574 };
2543 2575
2544 xs_encode_stream_record_marker(xbufp); 2576 len = kernel_sendmsg(transport->sock, &msg, &iov, 1, iov.iov_len);
2577 if (len != iov.iov_len)
2578 return -EAGAIN;
2545 2579
2580 tailpage = NULL;
2581 if (xbufp->tail[0].iov_len)
2582 tailpage = virt_to_page(xbufp->tail[0].iov_base);
2546 tailoff = (unsigned long)xbufp->tail[0].iov_base & ~PAGE_MASK; 2583 tailoff = (unsigned long)xbufp->tail[0].iov_base & ~PAGE_MASK;
2547 headoff = (unsigned long)xbufp->head[0].iov_base & ~PAGE_MASK; 2584 headoff = (unsigned long)xbufp->head[0].iov_base & ~PAGE_MASK;
2548 len = svc_send_common(sock, xbufp, 2585 len = svc_send_common(transport->sock, xbufp,
2549 virt_to_page(xbufp->head[0].iov_base), headoff, 2586 virt_to_page(xbufp->head[0].iov_base), headoff,
2550 xbufp->tail[0].iov_base, tailoff); 2587 tailpage, tailoff);
2551 2588 if (len != xbufp->len)
2552 if (len != xbufp->len) { 2589 return -EAGAIN;
2553 printk(KERN_NOTICE "Error sending entire callback!\n");
2554 len = -EAGAIN;
2555 }
2556
2557 return len; 2590 return len;
2558} 2591}
2559 2592
@@ -2793,7 +2826,6 @@ static struct rpc_xprt *xs_setup_local(struct xprt_create *args)
2793 transport = container_of(xprt, struct sock_xprt, xprt); 2826 transport = container_of(xprt, struct sock_xprt, xprt);
2794 2827
2795 xprt->prot = 0; 2828 xprt->prot = 0;
2796 xprt->tsh_size = sizeof(rpc_fraghdr) / sizeof(u32);
2797 xprt->max_payload = RPC_MAX_FRAGMENT_SIZE; 2829 xprt->max_payload = RPC_MAX_FRAGMENT_SIZE;
2798 2830
2799 xprt->bind_timeout = XS_BIND_TO; 2831 xprt->bind_timeout = XS_BIND_TO;
@@ -2862,7 +2894,6 @@ static struct rpc_xprt *xs_setup_udp(struct xprt_create *args)
2862 transport = container_of(xprt, struct sock_xprt, xprt); 2894 transport = container_of(xprt, struct sock_xprt, xprt);
2863 2895
2864 xprt->prot = IPPROTO_UDP; 2896 xprt->prot = IPPROTO_UDP;
2865 xprt->tsh_size = 0;
2866 /* XXX: header size can vary due to auth type, IPv6, etc. */ 2897 /* XXX: header size can vary due to auth type, IPv6, etc. */
2867 xprt->max_payload = (1U << 16) - (MAX_HEADER << 3); 2898 xprt->max_payload = (1U << 16) - (MAX_HEADER << 3);
2868 2899
@@ -2942,7 +2973,6 @@ static struct rpc_xprt *xs_setup_tcp(struct xprt_create *args)
2942 transport = container_of(xprt, struct sock_xprt, xprt); 2973 transport = container_of(xprt, struct sock_xprt, xprt);
2943 2974
2944 xprt->prot = IPPROTO_TCP; 2975 xprt->prot = IPPROTO_TCP;
2945 xprt->tsh_size = sizeof(rpc_fraghdr) / sizeof(u32);
2946 xprt->max_payload = RPC_MAX_FRAGMENT_SIZE; 2976 xprt->max_payload = RPC_MAX_FRAGMENT_SIZE;
2947 2977
2948 xprt->bind_timeout = XS_BIND_TO; 2978 xprt->bind_timeout = XS_BIND_TO;
@@ -3015,7 +3045,6 @@ static struct rpc_xprt *xs_setup_bc_tcp(struct xprt_create *args)
3015 transport = container_of(xprt, struct sock_xprt, xprt); 3045 transport = container_of(xprt, struct sock_xprt, xprt);
3016 3046
3017 xprt->prot = IPPROTO_TCP; 3047 xprt->prot = IPPROTO_TCP;
3018 xprt->tsh_size = sizeof(rpc_fraghdr) / sizeof(u32);
3019 xprt->max_payload = RPC_MAX_FRAGMENT_SIZE; 3048 xprt->max_payload = RPC_MAX_FRAGMENT_SIZE;
3020 xprt->timeout = &xs_tcp_default_timeout; 3049 xprt->timeout = &xs_tcp_default_timeout;
3021 3050