[RFC net-next io_uring 00/11] improve io_uring's ubuf_info refcounting

From: Pavel Begunkov
Date: Wed Aug 10 2022 - 11:51:46 EST


There is a couple of tricks we can do with io_uring to improve ubuf_info
refcounting. First, we ammortise reference grabbing and then give them
away to the network layer, which is implemented in 8 and 11. Also, we
don't need need additional pinning for TCP, which is removed by 7.

1-4 are needed because otherwise we're out of space in io_notif_data and
using ->desc or some other field of ubuf_info would be ugly. It'll also
facilitate further ideas like adding a simpler notification model for UDP.

liburing/examples/io_uring-sendzc benchmark using a branch containing the
patchset and some more [1] showed ~1.6% qps improvement for UDP (dummy dev),
and ~1% for TCP (localhost + hacks enabling zc).

I didn't specifically test xen and vhost and not sure how, would love
some help with that.

[1] https://github.com/isilence/linux/tree/net/zc-ref-optimisation

Pavel Begunkov (11):
net: introduce struct ubuf_info_msgzc
xen/netback: use struct ubuf_info_msgzc
vhost/net: use struct ubuf_info_msgzc
net: shrink struct ubuf_info
net: rename ubuf_info's flags
net: add flags for controlling ubuf_info
net/tcp: optimise tcp ubuf refcounting
net: let callers provide ->msg_ubuf refs
io_uring/notif: add helper for flushing refs
io_uring/notif: mark notifs with UARGFL_CALLER_PINNED
io_uring/notif: add ubuf_info ref caching

drivers/net/xen-netback/common.h | 2 +-
drivers/net/xen-netback/interface.c | 4 +--
drivers/net/xen-netback/netback.c | 7 +++---
drivers/vhost/net.c | 17 +++++++------
include/linux/skbuff.h | 35 +++++++++++++++++++++++---
io_uring/net.c | 8 +++++-
io_uring/notif.c | 21 ++++++++++------
io_uring/notif.h | 22 +++++++++++++++-
net/core/skbuff.c | 39 ++++++++++++++++-------------
net/ipv4/ip_output.c | 3 ++-
net/ipv4/tcp.c | 11 +++++---
net/ipv6/ip6_output.c | 3 ++-
12 files changed, 123 insertions(+), 49 deletions(-)

--
2.37.0