io_uring/zcrx: protect netdev with pp_lock

Remove ifq->lock and reuse pp_lock to protect the netdev pointer.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Pavel Begunkov 2025-09-16 15:27:57 +01:00 committed by Jens Axboe
parent 4f602f3112
commit 20dda449c0
2 changed files with 11 additions and 13 deletions

View File

@ -476,7 +476,6 @@ static struct io_zcrx_ifq *io_zcrx_ifq_alloc(struct io_ring_ctx *ctx)
ifq->if_rxq = -1;
ifq->ctx = ctx;
spin_lock_init(&ifq->lock);
spin_lock_init(&ifq->rq_lock);
mutex_init(&ifq->pp_lock);
return ifq;
@ -484,12 +483,12 @@ static struct io_zcrx_ifq *io_zcrx_ifq_alloc(struct io_ring_ctx *ctx)
static void io_zcrx_drop_netdev(struct io_zcrx_ifq *ifq)
{
spin_lock(&ifq->lock);
if (ifq->netdev) {
netdev_put(ifq->netdev, &ifq->netdev_tracker);
ifq->netdev = NULL;
}
spin_unlock(&ifq->lock);
guard(mutex)(&ifq->pp_lock);
if (!ifq->netdev)
return;
netdev_put(ifq->netdev, &ifq->netdev_tracker);
ifq->netdev = NULL;
}
static void io_close_queue(struct io_zcrx_ifq *ifq)
@ -504,11 +503,11 @@ static void io_close_queue(struct io_zcrx_ifq *ifq)
if (ifq->if_rxq == -1)
return;
spin_lock(&ifq->lock);
netdev = ifq->netdev;
netdev_tracker = ifq->netdev_tracker;
ifq->netdev = NULL;
spin_unlock(&ifq->lock);
scoped_guard(mutex, &ifq->pp_lock) {
netdev = ifq->netdev;
netdev_tracker = ifq->netdev_tracker;
ifq->netdev = NULL;
}
if (netdev) {
net_mp_close_rxq(netdev, ifq->if_rxq, &p);

View File

@ -53,7 +53,6 @@ struct io_zcrx_ifq {
struct device *dev;
struct net_device *netdev;
netdevice_tracker netdev_tracker;
spinlock_t lock;
/*
* Page pool and net configuration lock, can be taken deeper in the