Skip to content

Commit 0472e47

Browse files
author
Trond Myklebust
committed
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 <[email protected]>
1 parent e791f8e commit 0472e47

File tree

2 files changed

+14
-36
lines changed

2 files changed

+14
-36
lines changed

net/sunrpc/xprt.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1723,6 +1723,7 @@ void xprt_release(struct rpc_task *task)
17231723
xprt->ops->buf_free(task);
17241724
xprt_inject_disconnect(xprt);
17251725
xdr_free_bvec(&req->rq_rcv_buf);
1726+
xdr_free_bvec(&req->rq_snd_buf);
17261727
if (req->rq_cred != NULL)
17271728
put_rpccred(req->rq_cred);
17281729
task->tk_rqstp = NULL;

net/sunrpc/xprtsock.c

Lines changed: 13 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -759,42 +759,18 @@ static int xs_send_kvec(struct socket *sock, struct msghdr *msg, struct kvec *ve
759759
return xs_sendmsg(sock, msg, seek);
760760
}
761761

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)
763763
{
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;
768764
int err;
769765

770-
remainder = xdr->page_len - base;
771-
base += xdr->page_base;
772-
ppage = xdr->pages + (base >> PAGE_SHIFT);
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;
766+
err = xdr_alloc_bvec(xdr, GFP_KERNEL);
767+
if (err < 0)
768+
return err;
780769

781-
remainder -= len;
782-
if (more)
783-
flags |= MSG_MORE;
784-
if (remainder != 0)
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;
770+
iov_iter_bvec(&msg->msg_iter, WRITE, xdr->bvec,
771+
xdr_buf_pagecount(xdr),
772+
xdr->page_len + xdr->page_base);
773+
return xs_sendmsg(sock, msg, base + xdr->page_base);
798774
}
799775

800776
/**
@@ -817,7 +793,6 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,
817793
};
818794
unsigned int remainder = xdr->len - base;
819795
int err = 0;
820-
int sent = 0;
821796

822797
if (unlikely(!sock))
823798
return -ENOTSOCK;
@@ -843,10 +818,12 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,
843818
if (base < xdr->page_len) {
844819
unsigned int len = xdr->page_len - base;
845820
remainder -= len;
846-
err = xs_send_pagedata(sock, xdr, base, remainder != 0, zerocopy, &sent);
847-
*sent_p += sent;
848-
if (remainder == 0 || sent != len)
821+
if (remainder == 0)
822+
msg.msg_flags &= ~MSG_MORE;
823+
err = xs_send_pagedata(sock, &msg, xdr, base);
824+
if (remainder == 0 || err != len)
849825
goto out;
826+
*sent_p += err;
850827
base = 0;
851828
} else
852829
base -= xdr->page_len;

0 commit comments

Comments
 (0)