splice, net: Use sendmsg(MSG_SPLICE_PAGES) rather than ->sendpage()
authorDavid Howells <dhowells@redhat.com>
Wed, 7 Jun 2023 18:19:09 +0000 (19:19 +0100)
committerJakub Kicinski <kuba@kernel.org>
Fri, 9 Jun 2023 02:40:30 +0000 (19:40 -0700)
commit2dc334f1a63a8839b88483a3e73c0f27c9c1791c
treeb23b85a3637baa98d8d44c0a4652a7db1dc18f96
parent81840b3b91aad06053ad2712f3da5d0448eeb0e8
splice, net: Use sendmsg(MSG_SPLICE_PAGES) rather than ->sendpage()

Replace generic_splice_sendpage() + splice_from_pipe + pipe_to_sendpage()
with a net-specific handler, splice_to_socket(), that calls sendmsg() with
MSG_SPLICE_PAGES set instead of calling ->sendpage().

MSG_MORE is used to indicate if the sendmsg() is expected to be followed
with more data.

This allows multiple pipe-buffer pages to be passed in a single call in a
BVEC iterator, allowing the processing to be pushed down to a loop in the
protocol driver.  This helps pave the way for passing multipage folios down
too.

Protocols that haven't been converted to handle MSG_SPLICE_PAGES yet should
just ignore it and do a normal sendmsg() for now - although that may be a
bit slower as it may copy everything.

Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-by: Jakub Kicinski <kuba@kernel.org>
cc: Jens Axboe <axboe@kernel.dk>
cc: Matthew Wilcox <willy@infradead.org>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
fs/splice.c
include/linux/fs.h
include/linux/splice.h
net/socket.c