Merge branch 'splice-net-replace-sendpage-with-sendmsg-msg_splice_pages-part-1'
authorJakub Kicinski <kuba@kernel.org>
Wed, 24 May 2023 03:48:53 +0000 (20:48 -0700)
committerJakub Kicinski <kuba@kernel.org>
Wed, 24 May 2023 03:48:53 +0000 (20:48 -0700)
commit51c78a4d532efe9543a4df019ff405f05c6157f6
treea5b6292a7d7e82a1f6ca74a2dad45a4f4bda6838
parent57910a47ffe993c2724a916b9e003d84ff0c0df7
parent57d44a354a43edba4ef9963327d4657d12edbfbc
Merge branch 'splice-net-replace-sendpage-with-sendmsg-msg_splice_pages-part-1'

David Howells says:

====================
splice, net: Replace sendpage with sendmsg(MSG_SPLICE_PAGES), part 1

Here's the first tranche of patches towards providing a MSG_SPLICE_PAGES
internal sendmsg flag that is intended to replace the ->sendpage() op with
calls to sendmsg().  MSG_SPLICE_PAGES is a hint that tells the protocol
that it should splice the pages supplied if it can and copy them if not.

This will allow splice to pass multiple pages in a single call and allow
certain parts of higher protocols (e.g. sunrpc, iwarp) to pass an entire
message in one go rather than having to send them piecemeal.  This should
also make it easier to handle the splicing of multipage folios.

A helper, skb_splice_from_iter() is provided to do the work of splicing or
copying data from an iterator.  If a page is determined to be unspliceable
(such as being in the slab), then the helper will give an error.

Note that this facility is not made available to userspace and does not
provide any sort of callback.

This set consists of the following parts:

 (1) Define the MSG_SPLICE_PAGES flag and prevent sys_sendmsg() from being
     able to set it.

 (2) Add an extra argument to skb_append_pagefrags() so that something
     other than MAX_SKB_FRAGS can be used (sysctl_max_skb_frags for
     example).

 (3) Add the skb_splice_from_iter() helper to handle splicing pages into
     skbuffs for MSG_SPLICE_PAGES that can be shared by TCP, IP/UDP and
     AF_UNIX.

 (4) Implement MSG_SPLICE_PAGES support in TCP.

 (5) Make do_tcp_sendpages() just wrap sendmsg() and then fold it in to its
     various callers.

 (6) Implement MSG_SPLICE_PAGES support in IP and make udp_sendpage() just
     a wrapper around sendmsg().

 (7) Implement MSG_SPLICE_PAGES support in IP6/UDP6.

 (8) Implement MSG_SPLICE_PAGES support in AF_UNIX.

 (9) Make AF_UNIX copy unspliceable pages.

Link: https://lore.kernel.org/r/20230316152618.711970-1-dhowells@redhat.com/
Link: https://lore.kernel.org/r/20230329141354.516864-1-dhowells@redhat.com/
Link: https://lore.kernel.org/r/20230331160914.1608208-1-dhowells@redhat.com/
Link: https://lore.kernel.org/r/20230405165339.3468808-1-dhowells@redhat.com/
Link: https://lore.kernel.org/r/20230406094245.3633290-1-dhowells@redhat.com/
Link: https://lore.kernel.org/r/20230411160902.4134381-1-dhowells@redhat.com/
Link: https://lore.kernel.org/r/20230515093345.396978-1-dhowells@redhat.com/
Link: https://lore.kernel.org/r/20230518113453.1350757-1-dhowells@redhat.com/
====================

Link: https://lore.kernel.org/r/20230522121125.2595254-1-dhowells@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>