Commit 20dda449 authored by Pavel Begunkov's avatar Pavel Begunkov Committed by Jens Axboe
Browse files

io_uring/zcrx: protect netdev with pp_lock



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

Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 4f602f31
Loading
Loading
Loading
Loading
+11 −12
Original line number Diff line number Diff line
@@ -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,13 +483,13 @@ 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) {
	guard(mutex)(&ifq->pp_lock);

	if (!ifq->netdev)
		return;
	netdev_put(ifq->netdev, &ifq->netdev_tracker);
	ifq->netdev = NULL;
}
	spin_unlock(&ifq->lock);
}

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);
	scoped_guard(mutex, &ifq->pp_lock) {
		netdev = ifq->netdev;
		netdev_tracker = ifq->netdev_tracker;
		ifq->netdev = NULL;
	spin_unlock(&ifq->lock);
	}

	if (netdev) {
		net_mp_close_rxq(netdev, ifq->if_rxq, &p);
+0 −1
Original line number Diff line number Diff line
@@ -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