Make Chelsio's TLS offload sendmsg() support MSG_SPLICE_PAGES, splicing in
pages from the source iterator if possible and copying the data in
otherwise.
This allows ->sendpage() to be replaced by something that can handle
multiple multipage folios in a single transaction.
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Ayush Sawal <ayush.sawal@chelsio.com>
cc: "David S. Miller" <davem@davemloft.net>
cc: Eric Dumazet <edumazet@google.com>
cc: Jakub Kicinski <kuba@kernel.org>
cc: Paolo Abeni <pabeni@redhat.com>
cc: Jens Axboe <axboe@kernel.dk>
cc: Matthew Wilcox <willy@infradead.org>
cc: netdev@vger.kernel.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
                if (copy > size)
                        copy = size;
 
-               if (skb_tailroom(skb) > 0) {
+               if (msg->msg_flags & MSG_SPLICE_PAGES) {
+                       err = skb_splice_from_iter(skb, &msg->msg_iter, copy,
+                                                  sk->sk_allocation);
+                       if (err < 0) {
+                               if (err == -EMSGSIZE)
+                                       goto new_buf;
+                               goto do_fault;
+                       }
+                       copy = err;
+                       sk_wmem_queued_add(sk, copy);
+               } else if (skb_tailroom(skb) > 0) {
                        copy = min(copy, skb_tailroom(skb));
                        if (is_tls_tx(csk))
                                copy = min_t(int, copy, csk->tlshws.txleft);