diff options
author | Pavel Begunkov <asml.silence@gmail.com> | 2025-09-16 15:27:48 +0100 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2025-09-16 12:37:20 -0600 |
commit | d425f13146af0ef10b8f1dc7cc9fd700ce7c759e (patch) | |
tree | 30e20017201e198b91a54e7140d5ef7c4e33532b | |
parent | c49606fc4be78da6c7a7c623566f6cf7663ba740 (diff) |
io_uring/zcrx: don't pass slot to io_zcrx_create_area
Don't pass a pointer to a pointer where an area should be stored to
io_zcrx_create_area(), and let it handle finding the right place for a
new area. It's more straightforward and will be needed to support
multiple areas.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r-- | io_uring/zcrx.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c index 7a46e6fc2ee7..c64b8c7ddedf 100644 --- a/io_uring/zcrx.c +++ b/io_uring/zcrx.c @@ -397,8 +397,16 @@ static void io_zcrx_free_area(struct io_zcrx_area *area) #define IO_ZCRX_AREA_SUPPORTED_FLAGS (IORING_ZCRX_AREA_DMABUF) +static int io_zcrx_append_area(struct io_zcrx_ifq *ifq, + struct io_zcrx_area *area) +{ + if (ifq->area) + return -EINVAL; + ifq->area = area; + return 0; +} + static int io_zcrx_create_area(struct io_zcrx_ifq *ifq, - struct io_zcrx_area **res, struct io_uring_zcrx_area_reg *area_reg) { struct io_zcrx_area *area; @@ -455,8 +463,10 @@ static int io_zcrx_create_area(struct io_zcrx_ifq *ifq, area->area_id = 0; area_reg->rq_area_token = (u64)area->area_id << IORING_ZCRX_AREA_SHIFT; spin_lock_init(&area->freelist_lock); - *res = area; - return 0; + + ret = io_zcrx_append_area(ifq, area); + if (!ret) + return 0; err: if (area) io_zcrx_free_area(area); @@ -610,7 +620,7 @@ int io_register_zcrx_ifq(struct io_ring_ctx *ctx, } get_device(ifq->dev); - ret = io_zcrx_create_area(ifq, &ifq->area, &area); + ret = io_zcrx_create_area(ifq, &area); if (ret) goto err; |