kcm: Use sendmsg(MSG_SPLICE_PAGES) rather then sendpage

When transmitting data, call down into the transport socket using sendmsg
with MSG_SPLICE_PAGES to indicate that content should be spliced rather
than using sendpage.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Tom Herbert <tom@herbertland.com>
cc: Tom Herbert <tom@quantonium.net>
cc: Jens Axboe <axboe@kernel.dk>
cc: Matthew Wilcox <willy@infradead.org>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
David Howells 2023-06-09 11:02:20 +01:00 committed by Jakub Kicinski
parent de17c68573
commit 264ba53fac
1 changed files with 11 additions and 5 deletions

View File

@ -641,6 +641,10 @@ do_frag_list:
for (fragidx = 0; fragidx < skb_shinfo(skb)->nr_frags;
fragidx++) {
struct bio_vec bvec;
struct msghdr msg = {
.msg_flags = MSG_DONTWAIT | MSG_SPLICE_PAGES,
};
skb_frag_t *frag;
frag_offset = 0;
@ -651,11 +655,13 @@ do_frag:
goto out;
}
ret = kernel_sendpage(psock->sk->sk_socket,
skb_frag_page(frag),
skb_frag_off(frag) + frag_offset,
skb_frag_size(frag) - frag_offset,
MSG_DONTWAIT);
bvec_set_page(&bvec,
skb_frag_page(frag),
skb_frag_size(frag) - frag_offset,
skb_frag_off(frag) + frag_offset);
iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1,
bvec.bv_len);
ret = sock_sendmsg(psock->sk->sk_socket, &msg);
if (ret <= 0) {
if (ret == -EAGAIN) {
/* Save state to try again when there's