chelsio: Support MSG_SPLICE_PAGES
authorDavid Howells <dhowells@redhat.com>
Wed, 31 May 2023 11:00:07 +0000 (12:00 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 1 Jun 2023 11:41:36 +0000 (13:41 +0200)
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>
drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_io.c

index ae6b17b..1d08386 100644 (file)
@@ -1092,7 +1092,17 @@ new_buf:
                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);