• Dylan Yudaken's avatar
    io_uring: multishot recv · b3fdea6e
    Dylan Yudaken authored
    Support multishot receive for io_uring.
    Typical server applications will run a loop where for each recv CQE it
    requeues another recv/recvmsg.
    
    This can be simplified by using the existing multishot functionality
    combined with io_uring's provided buffers.
    The API is to add the IORING_RECV_MULTISHOT flag to the SQE. CQEs will
    then be posted (with IORING_CQE_F_MORE flag set) when data is available
    and is read. Once an error occurs or the socket ends, the multishot will
    be removed and a completion without IORING_CQE_F_MORE will be posted.
    
    The benefit to this is that the recv is much more performant.
     * Subsequent receives are queued up straight away without requiring the
       application to finish a processing loop.
     * If there are more data in the socket (sat the provided buffer size is
       smaller than the socket buffer) then the data is immediately
       returned, improving batching.
     * Poll is only armed once and reused, saving CPU cycles
    Signed-off-by: default avatarDylan Yudaken <dylany@fb.com>
    Link: https://lore.kernel.org/r/20220630091231.1456789-11-dylany@fb.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    b3fdea6e
net.c 20 KB