[PATCH review-only 14/17] io_uring/zcrx: pass area_id to __zcrx_create_area()
Pavel Begunkov <[email protected]> Sat, 11 Jul 2026 11:40:07 +0100
| Newsgroups | org.kernel.vger.io-uring,org.kernel.vger.netdev |
|---|---|
| Message-ID | <20260711104007.WxqXcZhm6htBngsgBrJJTGs9ksyCOlnqWpnEklku68E@z> |
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 <[email protected]> --- 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