diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2019-02-11 11:24:37 -0500 |
---|---|---|
committer | Anna Schumaker <Anna.Schumaker@Netapp.com> | 2019-02-13 13:14:35 -0500 |
commit | 067fb11b12af1448f7bbcacca41e470cb775e9fa (patch) | |
tree | 22bb526dc0c5ff6ea1707206b0c5253e3f7c2ca0 /net/sunrpc/xprtsock.c | |
parent | 80125d4ae70aff049b170dd21ea5d007694d629a (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.c | 91 |
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 | */ | ||
704 | static 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 | |||
699 | static int xs_send_kvec(struct socket *sock, struct sockaddr *addr, int addrlen, struct kvec *vec, unsigned int base, int more) | 733 | static 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 | */ | ||
875 | static 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 | ||