mirror of
https://github.com/torvalds/linux.git
synced 2026-09-14 16:10:02 +02:00
io_uring/zcrx: unmap under netdev lock
Make sure we unmap areas while closing a queue. Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Link: https://patch.msgid.link/1c41f349f8bcbcaafb17a9c81d4157aa9d30de93.1786108672.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
be94c24ce3
commit
6bc4d9dec9
|
|
@ -311,6 +311,9 @@ static void io_zcrx_unmap_area(struct io_zcrx_ifq *ifq,
|
|||
{
|
||||
int i;
|
||||
|
||||
if (!area)
|
||||
return;
|
||||
|
||||
guard(mutex)(&ifq->pp_lock);
|
||||
if (!area->is_mapped)
|
||||
return;
|
||||
|
|
@ -437,7 +440,8 @@ static void io_free_rbuf_ring(struct io_zcrx_ifq *ifq)
|
|||
static void io_zcrx_free_area(struct io_zcrx_ifq *ifq,
|
||||
struct io_zcrx_area *area)
|
||||
{
|
||||
io_zcrx_unmap_area(ifq, area);
|
||||
if (WARN_ON_ONCE(area->is_mapped))
|
||||
return;
|
||||
io_release_area_mem(&area->mem);
|
||||
|
||||
if (area->mem.account_pages)
|
||||
|
|
@ -544,8 +548,10 @@ static int __zcrx_create_area(struct io_zcrx_ifq *ifq,
|
|||
if (!ret)
|
||||
return 0;
|
||||
err:
|
||||
if (area)
|
||||
if (area) {
|
||||
io_zcrx_unmap_area(ifq, area);
|
||||
io_zcrx_free_area(ifq, area);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -599,11 +605,12 @@ static void io_close_queue(struct io_zcrx_ifq *ifq)
|
|||
}
|
||||
|
||||
if (netdev) {
|
||||
if (ifq->if_rxq != -1) {
|
||||
netdev_lock(netdev);
|
||||
netdev_lock(netdev);
|
||||
if (ifq->if_rxq != -1)
|
||||
netif_mp_close_rxq(netdev, ifq->if_rxq, &p);
|
||||
netdev_unlock(netdev);
|
||||
}
|
||||
|
||||
io_zcrx_unmap_area(ifq, ifq->area);
|
||||
netdev_unlock(netdev);
|
||||
netdev_put(netdev, &netdev_tracker);
|
||||
}
|
||||
ifq->if_rxq = -1;
|
||||
|
|
@ -1396,8 +1403,7 @@ static void io_pp_uninstall(void *mp_priv, struct netdev_rx_queue *rxq)
|
|||
struct io_zcrx_ifq *ifq = mp_priv;
|
||||
|
||||
io_zcrx_drop_netdev(ifq);
|
||||
if (ifq->area)
|
||||
io_zcrx_unmap_area(ifq, ifq->area);
|
||||
io_zcrx_unmap_area(ifq, ifq->area);
|
||||
|
||||
p->mp_ops = NULL;
|
||||
p->mp_priv = NULL;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user