[PATCH review-only 14/17] io_uring/zcrx: pass area_id to __zcrx_create_area()
From: Pavel Begunkov <asml.silence@gmail.com>
Date: 2026-07-11 09:12:51
Also in:
io-uring
Subsystem:
io_uring, io_uring zcrx, the rest · Maintainers:
Jens Axboe, Pavel Begunkov, Linus Torvalds
Instead of generating an area id inside of __zcrx_create_area(), let the caller to pass it. It needs the id to derive the user token, and we might need to know it before creating and publishing the area. Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> --- io_uring/zcrx.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-)
diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c
index 474ffc217b0b..3f61f942c393 100644
--- a/io_uring/zcrx.c
+++ b/io_uring/zcrx.c@@ -44,6 +44,11 @@ static inline u64 zcrx_area_id_to_token(u32 area_id) return (u64)area_id << IORING_ZCRX_AREA_SHIFT; } +static inline u32 zcrx_next_area_id(struct io_zcrx_ifq *zcrx) +{ + return zcrx->nr_areas; +} + static inline struct io_zcrx_ifq *io_pp_to_ifq(struct page_pool *pp) { return pp->mp_priv;
@@ -472,6 +477,8 @@ static int io_zcrx_append_area(struct io_zcrx_ifq *ifq, if (WARN_ON_ONCE(ifq->kern_readable != kern_readable)) return -EINVAL; + if (WARN_ON_ONCE(area->area_id != zcrx_next_area_id(ifq))) + return -EINVAL; old_areas = ifq->areas; old_nr = ifq->nr_areas;
@@ -494,9 +501,10 @@ static int io_zcrx_append_area(struct io_zcrx_ifq *ifq, } static int __zcrx_create_area(struct io_zcrx_ifq *ifq, - struct io_uring_zcrx_area_reg *area_reg, + const struct io_uring_zcrx_area_reg *area_reg, struct io_zcrx_area **res_area, - u32 rx_buf_len) + u32 rx_buf_len, + u32 area_id) { int buf_size_shift = PAGE_SHIFT; struct io_zcrx_area *area;
@@ -565,9 +573,7 @@ static int __zcrx_create_area(struct io_zcrx_ifq *ifq, } area->free_count = nr_iovs; - /* we're only supporting one area per ifq for now */ - area->area_id = 0; - area_reg->rq_area_token = zcrx_area_id_to_token(area->area_id); + area->area_id = area_id; *res_area = area; return 0; err:
@@ -583,9 +589,12 @@ static int io_zcrx_create_area(struct io_zcrx_ifq *ifq, struct io_uring_zcrx_ifq_reg *reg) { struct io_zcrx_area *area; + u32 id = zcrx_next_area_id(ifq); int ret; - ret = __zcrx_create_area(ifq, area_reg, &area, reg->rx_buf_len); + area_reg->rq_area_token = zcrx_area_id_to_token(id); + + ret = __zcrx_create_area(ifq, area_reg, &area, reg->rx_buf_len, id); if (ret) return ret;
--
2.54.0