From: David Wei <dw@davidwei.uk>
To: io-uring@vger.kernel.org, netdev@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>, Pavel Begunkov <asml.silence@gmail.com>
Subject: [PATCH v6 0/5] io_uring zcrx ifq sharing
Date: Sat, 8 Nov 2025 10:14:18 -0800 [thread overview]
Message-ID: <20251108181423.3518005-1-dw@davidwei.uk> (raw)
Each ifq is bound to a HW RX queue with no way to share this across
multiple rings. It is possible that one ring will not be able to fully
saturate an entire HW RX queue due to userspace work. There are two ways
to handle more work:
1. Move work to other threads, but have to pay context switch overhead
and cold caches.
2. Add more rings with ifqs, but HW RX queues are a limited resource.
This patchset add a way for multiple rings to share the same underlying
src ifq that is bound to a HW RX queue. Rings with shared ifqs can issue
io_recvzc on zero copy sockets, just like the src ring.
Userspace are expected to create rings in separate threads and not
processes, such that all rings share the same address space. This is
because the sharing and synchronisation of refill rings is purely done
in userspace with no kernel involvement e.g. dst rings do not mmap the
refill ring. Also, userspace must distribute zero copy sockets steered
into the same HW RX queue across rings sharing the ifq.
v6:
- removed ifq refcounting that merged separately
- fill in struct io_uring_zcrx_offsets
- shorten functions + structs
- move ctx flags checks from export to import
v5:
- remove sync refill api
- pp mp taking ref on ifq
- add ifq export to file
- implement sharing by importing ifq fd
v4:
- lock rings in seq instead of both
- drop export io_lock_two_rings()
- break circular ref between ifq and ring ctx
- remove io_shutdown_zcrx_ifqs()
- copy reg struct to user before writing ifq to ctx->zcrx_ctxs
v3:
- drop ifq->proxy
- use dec_and_test to clean up ifq
v2:
- split patch
David Wei (3):
io_uring/zcrx: move io_zcrx_scrub() and dependencies up
io_uring/zcrx: add io_fill_zcrx_offsets()
io_uring/zcrx: share an ifq between rings
Pavel Begunkov (2):
io_uring/zcrx: count zcrx users
io_uring/zcrx: export zcrx via a file
include/uapi/linux/io_uring.h | 5 +
io_uring/zcrx.c | 218 ++++++++++++++++++++++++++--------
io_uring/zcrx.h | 2 +
3 files changed, 173 insertions(+), 52 deletions(-)
--
2.47.3
next reply other threads:[~2025-11-08 18:14 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-08 18:14 David Wei [this message]
2025-11-08 18:14 ` [PATCH v6 1/5] io_uring/zcrx: count zcrx users David Wei
2025-11-08 18:14 ` [PATCH v6 2/5] io_uring/zcrx: move io_zcrx_scrub() and dependencies up David Wei
2025-11-08 18:14 ` [PATCH v6 3/5] io_uring/zcrx: export zcrx via a file David Wei
2025-11-08 18:14 ` [PATCH v6 4/5] io_uring/zcrx: add io_fill_zcrx_offsets() David Wei
2025-11-08 18:14 ` [PATCH v6 5/5] io_uring/zcrx: share an ifq between rings David Wei
2025-11-11 14:40 ` [PATCH v6 0/5] io_uring zcrx ifq sharing Pavel Begunkov
2025-11-11 17:35 ` David Wei
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251108181423.3518005-1-dw@davidwei.uk \
--to=dw@davidwei.uk \
--cc=asml.silence@gmail.com \
--cc=axboe@kernel.dk \
--cc=io-uring@vger.kernel.org \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox