diff options
author | Trond Myklebust <trond.myklebust@hammerspace.com> | 2019-02-19 13:00:13 -0500 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@hammerspace.com> | 2019-02-20 17:35:58 -0500 |
commit | 0472e476604998c127f3c80d291113e77c5676ac (patch) | |
tree | efa8cd9afba60a51867d18e678a7d760702a035f /net/sunrpc/xprtsock.c | |
parent | e791f8e9380d945ee9ed75aba2d65a9369f01820 (diff) |
SUNRPC: Convert socket page send code to use iov_iter()
Simplify the page send code using iov_iter and bvecs.
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Diffstat (limited to 'net/sunrpc/xprtsock.c')
-rw-r--r-- | net/sunrpc/xprtsock.c | 49 |
1 files changed, 13 insertions, 36 deletions
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index e1546dd6aacc..35d1e81b6e5e 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
@@ -759,42 +759,18 @@ static int xs_send_kvec(struct socket *sock, struct msghdr *msg, struct kvec *ve | |||
759 | return xs_sendmsg(sock, msg, seek); | 759 | return xs_sendmsg(sock, msg, seek); |
760 | } | 760 | } |
761 | 761 | ||
762 | static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned int base, int more, bool zerocopy, int *sent_p) | 762 | static int xs_send_pagedata(struct socket *sock, struct msghdr *msg, struct xdr_buf *xdr, size_t base) |
763 | { | 763 | { |
764 | ssize_t (*do_sendpage)(struct socket *sock, struct page *page, | ||
765 | int offset, size_t size, int flags); | ||
766 | struct page **ppage; | ||
767 | unsigned int remainder; | ||
768 | int err; | 764 | int err; |
769 | 765 | ||
770 | remainder = xdr->page_len - base; | 766 | err = xdr_alloc_bvec(xdr, GFP_KERNEL); |
771 | base += xdr->page_base; | 767 | if (err < 0) |
772 | ppage = xdr->pages + (base >> PAGE_SHIFT); | 768 | return err; |
773 | base &= ~PAGE_MASK; | ||
774 | do_sendpage = sock->ops->sendpage; | ||
775 | if (!zerocopy) | ||
776 | do_sendpage = sock_no_sendpage; | ||
777 | for(;;) { | ||
778 | unsigned int len = min_t(unsigned int, PAGE_SIZE - base, remainder); | ||
779 | int flags = XS_SENDMSG_FLAGS; | ||
780 | 769 | ||
781 | remainder -= len; | 770 | iov_iter_bvec(&msg->msg_iter, WRITE, xdr->bvec, |
782 | if (more) | 771 | xdr_buf_pagecount(xdr), |
783 | flags |= MSG_MORE; | 772 | xdr->page_len + xdr->page_base); |
784 | if (remainder != 0) | 773 | return xs_sendmsg(sock, msg, base + xdr->page_base); |
785 | flags |= MSG_SENDPAGE_NOTLAST | MSG_MORE; | ||
786 | err = do_sendpage(sock, *ppage, base, len, flags); | ||
787 | if (remainder == 0 || err != len) | ||
788 | break; | ||
789 | *sent_p += err; | ||
790 | ppage++; | ||
791 | base = 0; | ||
792 | } | ||
793 | if (err > 0) { | ||
794 | *sent_p += err; | ||
795 | err = 0; | ||
796 | } | ||
797 | return err; | ||
798 | } | 774 | } |
799 | 775 | ||
800 | /** | 776 | /** |
@@ -817,7 +793,6 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen, | |||
817 | }; | 793 | }; |
818 | unsigned int remainder = xdr->len - base; | 794 | unsigned int remainder = xdr->len - base; |
819 | int err = 0; | 795 | int err = 0; |
820 | int sent = 0; | ||
821 | 796 | ||
822 | if (unlikely(!sock)) | 797 | if (unlikely(!sock)) |
823 | return -ENOTSOCK; | 798 | return -ENOTSOCK; |
@@ -843,10 +818,12 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen, | |||
843 | if (base < xdr->page_len) { | 818 | if (base < xdr->page_len) { |
844 | unsigned int len = xdr->page_len - base; | 819 | unsigned int len = xdr->page_len - base; |
845 | remainder -= len; | 820 | remainder -= len; |
846 | err = xs_send_pagedata(sock, xdr, base, remainder != 0, zerocopy, &sent); | 821 | if (remainder == 0) |
847 | *sent_p += sent; | 822 | msg.msg_flags &= ~MSG_MORE; |
848 | if (remainder == 0 || sent != len) | 823 | err = xs_send_pagedata(sock, &msg, xdr, base); |
824 | if (remainder == 0 || err != len) | ||
849 | goto out; | 825 | goto out; |
826 | *sent_p += err; | ||
850 | base = 0; | 827 | base = 0; |
851 | } else | 828 | } else |
852 | base -= xdr->page_len; | 829 | base -= xdr->page_len; |