Re: [PATCH 1/5] io_uring/zcrx: notify user when out of buffers

Pavel Begunkov <[email protected]>
Newsgroups org.kernel.vger.io-uring,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel,org.kernel.vger.linux-kselftest,org.kernel.vger.netdev
Message-ID <[email protected]>
On 4/22/26 12:25, Clément Léger wrote:
> From: Pavel Begunkov <[email protected]>
...>   static inline struct page *io_zcrx_iov_page(const struct net_iov *niov)
>   {
>   	struct io_zcrx_area *area = io_zcrx_iov_to_area(niov);
> @@ -531,6 +541,7 @@ static struct io_zcrx_ifq *io_zcrx_ifq_alloc(struct io_ring_ctx *ctx)
>   
>   	ifq->if_rxq = -1;
>   	spin_lock_init(&ifq->rq.lock);
> +	spin_lock_init(&ifq->ctx_lock);
>   	mutex_init(&ifq->pp_lock);
>   	refcount_set(&ifq->refs, 1);
>   	refcount_set(&ifq->user_refs, 1);
> @@ -585,6 +596,11 @@ static void io_zcrx_ifq_free(struct io_zcrx_ifq *ifq)
>   	if (ifq->dev)
>   		put_device(ifq->dev);
>   
> +	scoped_guard(spinlock_bh, &ifq->ctx_lock) {
> +		if (ifq->master_ctx)
> +			percpu_ref_put(&ifq->master_ctx->refs);
> +	}
> +

Something very odd happened here. It's not my patch but rather an edited
squash of two other patches. This particular hunk creates a circular
dependency, i.e. io_uring waits for this reference to be put down before
destroying the zcrx instance that triggers io_zcrx_ifq_free.

-- 
Pavel Begunkov
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.