lkml.org 
[lkml]   [2023]   [Mar]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH 11/28] udp: Convert udp_sendpage() to use MSG_SPLICE_PAGES
    Date
    Convert udp_sendpage() to use sendmsg() with MSG_SPLICE_PAGES rather than
    directly splicing in the pages itself.

    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: Willem de Bruijn <willemdebruijn.kernel@gmail.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
    ---
    net/ipv4/udp.c | 50 +++++++++-----------------------------------------
    1 file changed, 9 insertions(+), 41 deletions(-)

    diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
    index c605d171eb2d..097feb92e215 100644
    --- a/net/ipv4/udp.c
    +++ b/net/ipv4/udp.c
    @@ -1332,52 +1332,20 @@ EXPORT_SYMBOL(udp_sendmsg);
    int udp_sendpage(struct sock *sk, struct page *page, int offset,
    size_t size, int flags)
    {
    - struct inet_sock *inet = inet_sk(sk);
    - struct udp_sock *up = udp_sk(sk);
    + struct bio_vec bvec;
    + struct msghdr msg = {
    + .msg_flags = flags | MSG_SPLICE_PAGES | MSG_MORE
    + };
    int ret;

    - if (flags & MSG_SENDPAGE_NOTLAST)
    - flags |= MSG_MORE;
    + bvec_set_page(&bvec, page, size, offset);
    + iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, size);

    - if (!up->pending) {
    - struct msghdr msg = { .msg_flags = flags|MSG_MORE };
    -
    - /* Call udp_sendmsg to specify destination address which
    - * sendpage interface can't pass.
    - * This will succeed only when the socket is connected.
    - */
    - ret = udp_sendmsg(sk, &msg, 0);
    - if (ret < 0)
    - return ret;
    - }
    + if (flags & MSG_SENDPAGE_NOTLAST)
    + msg.msg_flags |= MSG_MORE;

    lock_sock(sk);
    -
    - if (unlikely(!up->pending)) {
    - release_sock(sk);
    -
    - net_dbg_ratelimited("cork failed\n");
    - return -EINVAL;
    - }
    -
    - ret = ip_append_page(sk, &inet->cork.fl.u.ip4,
    - page, offset, size, flags);
    - if (ret == -EOPNOTSUPP) {
    - release_sock(sk);
    - return sock_no_sendpage(sk->sk_socket, page, offset,
    - size, flags);
    - }
    - if (ret < 0) {
    - udp_flush_pending_frames(sk);
    - goto out;
    - }
    -
    - up->len += size;
    - if (!(READ_ONCE(up->corkflag) || (flags&MSG_MORE)))
    - ret = udp_push_pending_frames(sk);
    - if (!ret)
    - ret = size;
    -out:
    + ret = udp_sendmsg(sk, &msg, size);
    release_sock(sk);
    return ret;
    }
    \
     
     \ /
      Last update: 2023-03-27 01:04    [W:3.261 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site