diff options
| author | Pavel Begunkov <asml.silence@gmail.com> | 2025-11-13 10:46:14 +0000 |
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2025-11-13 11:19:37 -0700 |
| commit | 39c9676f789eb71ce1005a22eebe2be80a00de6a (patch) | |
| tree | 4a5753b7c2099eec5586bb019b86d0e75e62d659 /io_uring/zcrx.c | |
| parent | 475eb39b00478b1898bc9080344dcd8e86c53c7a (diff) | |
io_uring/zcrx: count zcrx users
zcrx tries to detach ifq / terminate page pools when the io_uring ctx
owning it is being destroyed. There will be multiple io_uring instances
attached to it in the future, so add a separate counter to track the
users. Note, refs can't be reused for this purpose as it only used to
prevent zcrx and rings destruction, and also used by page pools to keep
it alive.
Signed-off-by: David Wei <dw@davidwei.uk>
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'io_uring/zcrx.c')
| -rw-r--r-- | io_uring/zcrx.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c index 08c103af69bc..2335f140ff19 100644 --- a/io_uring/zcrx.c +++ b/io_uring/zcrx.c @@ -482,6 +482,7 @@ static struct io_zcrx_ifq *io_zcrx_ifq_alloc(struct io_ring_ctx *ctx) spin_lock_init(&ifq->rq_lock); mutex_init(&ifq->pp_lock); refcount_set(&ifq->refs, 1); + refcount_set(&ifq->user_refs, 1); return ifq; } @@ -742,8 +743,10 @@ void io_unregister_zcrx_ifqs(struct io_ring_ctx *ctx) if (!ifq) break; - io_close_queue(ifq); - io_zcrx_scrub(ifq); + if (refcount_dec_and_test(&ifq->user_refs)) { + io_close_queue(ifq); + io_zcrx_scrub(ifq); + } io_put_zcrx_ifq(ifq); } |