aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/xprtsock.c
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@hammerspace.com>2019-02-19 13:00:13 -0500
committerTrond Myklebust <trond.myklebust@hammerspace.com>2019-02-20 17:35:58 -0500
commit0472e476604998c127f3c80d291113e77c5676ac (patch)
treeefa8cd9afba60a51867d18e678a7d760702a035f /net/sunrpc/xprtsock.c
parente791f8e9380d945ee9ed75aba2d65a9369f01820 (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.c49
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
762static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned int base, int more, bool zerocopy, int *sent_p) 762static 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;