lkml.org 
[lkml]   [2023]   [Mar]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 27/55] tls/device: Support MSG_SPLICE_PAGES
    Date
    Make TLS's device sendmsg() support MSG_SPLICE_PAGES.  This causes pages to
    be spliced from the source iterator if possible and copied the data if not.

    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: Chuck Lever <chuck.lever@oracle.com>
    cc: Boris Pismenny <borisp@nvidia.com>
    cc: John Fastabend <john.fastabend@gmail.com>
    cc: Jakub Kicinski <kuba@kernel.org>
    cc: Eric Dumazet <edumazet@google.com>
    cc: "David S. Miller" <davem@davemloft.net>
    cc: Paolo Abeni <pabeni@redhat.com>
    cc: Jens Axboe <axboe@kernel.dk>
    cc: Matthew Wilcox <willy@infradead.org>
    cc: netdev@vger.kernel.org
    ---
    net/tls/tls_device.c | 26 ++++++++++++++++++++++++++
    1 file changed, 26 insertions(+)

    diff --git a/net/tls/tls_device.c b/net/tls/tls_device.c
    index 6c593788dc25..f5c3b56ac1ce 100644
    --- a/net/tls/tls_device.c
    +++ b/net/tls/tls_device.c
    @@ -508,7 +508,30 @@ static int tls_push_data(struct sock *sk,
    zc_pfrag.offset = iter_offset.offset;
    zc_pfrag.size = copy;
    tls_append_frag(record, &zc_pfrag, copy);
    + } else if (copy && (flags & MSG_SPLICE_PAGES)) {
    + struct page_frag zc_pfrag;
    + struct page **pages = &zc_pfrag.page;
    + size_t off;
    +
    + rc = iov_iter_extract_pages(iter_offset.msg_iter, &pages,
    + copy, 1, 0, &off);
    + if (rc <= 0) {
    + if (rc == 0)
    + rc = -EIO;
    + goto handle_error;
    + }
    + copy = rc;
    +
    + if (!sendpage_ok(zc_pfrag.page)) {
    + iov_iter_revert(iter_offset.msg_iter, copy);
    + goto no_zcopy_this_page;
    + }
    +
    + zc_pfrag.offset = off;
    + zc_pfrag.size = copy;
    + tls_append_frag(record, &zc_pfrag, copy);
    } else if (copy) {
    +no_zcopy_this_page:
    copy = min_t(size_t, copy, pfrag->size - pfrag->offset);

    rc = tls_device_copy_data(page_address(pfrag->page) +
    @@ -571,6 +594,9 @@ int tls_device_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
    union tls_iter_offset iter;
    int rc;

    + if (!tls_ctx->zerocopy_sendfile)
    + msg->msg_flags &= ~MSG_SPLICE_PAGES;
    +
    mutex_lock(&tls_ctx->tx_lock);
    lock_sock(sk);

    \
     
     \ /
      Last update: 2023-03-31 18:16    [W:4.084 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site