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:
parent
4f602f3112
commit
20dda449c0
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue