[PATCH for-next 0/8] io_uring: multishot recv

From: Dylan Yudaken
Date: Tue Jun 28 2022 - 11:02:57 EST


This series adds support for multishot recv/recvmsg to io_uring.

The idea is that generally socket applications will be continually
enqueuing a new recv() when the previous one completes. This can be
improved on by allowing the application to queue a multishot receive,
which will post completions as and when data is available. It uses the
provided buffers feature to receive new data into a pool provided by
the application.

This is more performant in a few ways:
* 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

Running a small network benchmark [1] shows improved QPS of ~6-8% over a range of loads.

[1]: https://github.com/DylanZA/netbench/tree/multishot_recv

Dylan Yudaken (8):
io_uring: allow 0 length for buffer select
io_uring: restore bgid in io_put_kbuf
io_uring: allow iov_len = 0 for recvmsg and buffer select
io_uring: recycle buffers on error
io_uring: clean up io_poll_check_events return values
io_uring: add IOU_STOP_MULTISHOT return code
io_uring: add IORING_RECV_MULTISHOT flag
io_uring: multishot recv

include/uapi/linux/io_uring.h | 5 ++
io_uring/io_uring.h | 7 ++
io_uring/kbuf.c | 4 +-
io_uring/kbuf.h | 8 ++-
io_uring/net.c | 119 ++++++++++++++++++++++++++++------
io_uring/poll.c | 30 ++++++---
6 files changed, 140 insertions(+), 33 deletions(-)


base-commit: 755441b9029317d981269da0256e0a7e5a7fe2cc
--
2.30.2