[PATCH io_uring 15/16] io_uring/zcrx: lock area creation with pp_lock
Pavel Begunkov <[email protected]>
| Newsgroups | org.kernel.vger.io-uring,org.kernel.vger.netdev |
|---|---|
| Message-ID | <a667399971120227a28d54ebabc50e707f717bf3.1786108672.git.asml.silence@gmail.com> |
Protect __zcrx_create_area() with pp_lock. It's not needed for now, nobody can take the lock in parallel, but we'll need it for dynamic area creation for avoiding races with the device dying. Signed-off-by: Pavel Begunkov <[email protected]> --- io_uring/zcrx.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c index 8de142856795..fe36520994e7 100644 --- a/io_uring/zcrx.c +++ b/io_uring/zcrx.c @@ -330,13 +330,6 @@ static void __io_zcrx_unmap_area(struct io_zcrx_ifq *ifq, } } -static void io_zcrx_unmap_area(struct io_zcrx_ifq *ifq, - struct io_zcrx_area *area) -{ - guard(mutex)(&ifq->pp_lock); - __io_zcrx_unmap_area(ifq, area); -} - static void io_zcrx_unmap_areas(struct io_zcrx_ifq *ifq) { unsigned area_idx; @@ -508,6 +501,8 @@ static int __zcrx_create_area(struct io_zcrx_ifq *ifq, unsigned nr_iovs; int i, ret; + lockdep_assert_held(&ifq->pp_lock); + if (rx_buf_len) { if (!is_power_of_2(rx_buf_len) || rx_buf_len < PAGE_SIZE) return -EINVAL; @@ -579,7 +574,7 @@ static int __zcrx_create_area(struct io_zcrx_ifq *ifq, return 0; err: if (area) { - io_zcrx_unmap_area(ifq, area); + __io_zcrx_unmap_area(ifq, area); io_zcrx_free_area(ifq, area); } return ret; @@ -589,6 +584,7 @@ static int io_zcrx_create_area(struct io_zcrx_ifq *ifq, struct io_uring_zcrx_area_reg *area_reg, struct io_uring_zcrx_ifq_reg *reg) { + guard(mutex)(&ifq->pp_lock); return __zcrx_create_area(ifq, area_reg, reg->rx_buf_len); } -- 2.54.0