diff options
| author | Pavel Begunkov <asml.silence@gmail.com> | 2026-08-07 14:19:30 +0100 |
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2026-08-15 17:29:57 -0600 |
| commit | 6bc4d9dec9059f1373eb140fc80b6f64fd153ecd (patch) | |
| tree | da019a2a101bd0105714f839037f6a662a8153ba | |
| parent | be94c24ce377c528f10176906f2b939d90b53716 (diff) | |
| download | linux-stable-6bc4d9dec9059f1373eb140fc80b6f64fd153ecd.tar.gz linux-stable-6bc4d9dec9059f1373eb140fc80b6f64fd153ecd.zip | |
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>
| -rw-r--r-- | io_uring/zcrx.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c index ceca13de070f..8f9654d4a6de 100644 --- a/io_uring/zcrx.c +++ b/io_uring/zcrx.c @@ -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; |
