]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
io_uring/zcrx: fix rq flush locking
authorPavel Begunkov <asml.silence@gmail.com>
Sun, 1 Feb 2026 21:19:56 +0000 (21:19 +0000)
committerJens Axboe <axboe@kernel.dk>
Mon, 2 Feb 2026 15:19:43 +0000 (08:19 -0700)
zcrx needs to keep the rq lock for uref manipulations, for now move all
zcrx_return_buffers() under the lock.

Fixes: 475eb39b00478 ("io_uring/zcrx: add sync refill queue flushing")
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/zcrx.c

index f18c173a7bcbaf572b6eda8b225878820fb6514b..3d398283cf340593b7042eb24b2d46ac49429f67 100644 (file)
@@ -1069,8 +1069,6 @@ static unsigned zcrx_parse_rq(netmem_ref *netmem_array, unsigned nr,
        unsigned int mask = zcrx->rq_entries - 1;
        unsigned int i;
 
-       guard(spinlock_bh)(&zcrx->rq_lock);
-
        nr = min(nr, io_zcrx_rqring_entries(zcrx));
        for (i = 0; i < nr; i++) {
                struct io_uring_zcrx_rqe *rqe = io_zcrx_get_rqe(zcrx, mask);
@@ -1115,9 +1113,11 @@ static int zcrx_flush_rq(struct io_ring_ctx *ctx, struct io_zcrx_ifq *zcrx,
                return -EINVAL;
 
        do {
-               nr = zcrx_parse_rq(netmems, ZCRX_FLUSH_BATCH, zcrx);
+               scoped_guard(spinlock_bh, &zcrx->rq_lock) {
+                       nr = zcrx_parse_rq(netmems, ZCRX_FLUSH_BATCH, zcrx);
+                       zcrx_return_buffers(netmems, nr);
+               }
 
-               zcrx_return_buffers(netmems, nr);
                total += nr;
 
                if (fatal_signal_pending(current))