Commit 39c9676f authored by Pavel Begunkov's avatar Pavel Begunkov Committed by Jens Axboe
Browse files

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: default avatarDavid Wei <dw@davidwei.uk>
Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 475eb39b
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -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;

		if (refcount_dec_and_test(&ifq->user_refs)) {
			io_close_queue(ifq);
			io_zcrx_scrub(ifq);
		}
		io_put_zcrx_ifq(ifq);
	}

+2 −0
Original line number Diff line number Diff line
@@ -55,6 +55,8 @@ struct io_zcrx_ifq {
	struct net_device		*netdev;
	netdevice_tracker		netdev_tracker;
	refcount_t			refs;
	/* counts userspace facing users like io_uring */
	refcount_t			user_refs;

	/*
	 * Page pool and net configuration lock, can be taken deeper in the