]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
io_uring/zcrx: let zcrx choose region for mmaping
authorPavel Begunkov <asml.silence@gmail.com>
Sun, 20 Apr 2025 09:31:18 +0000 (10:31 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 21 Apr 2025 11:11:40 +0000 (05:11 -0600)
In preparation for adding multiple ifqs, add a helper returning a region
for mmaping zcrx refill queue. For now it's trivial and returns the same
ctx global ->zcrx_region.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/d9006e2ef8cd5e5b337c2ba2228ede8409eb60f2.1745141261.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/memmap.c
io_uring/memmap.h
io_uring/zcrx.c
io_uring/zcrx.h

index 76fcc79656b002c0ab7af203c5767452dc1e6af5..5cf3f23e751bc267a7c2359e4136d03bca9f2a6b 100644 (file)
@@ -13,6 +13,7 @@
 #include "memmap.h"
 #include "kbuf.h"
 #include "rsrc.h"
+#include "zcrx.h"
 
 static void *io_mem_alloc_compound(struct page **pages, int nr_pages,
                                   size_t size, gfp_t gfp)
@@ -258,7 +259,8 @@ static struct io_mapped_region *io_mmap_get_region(struct io_ring_ctx *ctx,
                                                   loff_t pgoff)
 {
        loff_t offset = pgoff << PAGE_SHIFT;
-       unsigned int bgid;
+       unsigned int id;
+
 
        switch (offset & IORING_OFF_MMAP_MASK) {
        case IORING_OFF_SQ_RING:
@@ -267,12 +269,13 @@ static struct io_mapped_region *io_mmap_get_region(struct io_ring_ctx *ctx,
        case IORING_OFF_SQES:
                return &ctx->sq_region;
        case IORING_OFF_PBUF_RING:
-               bgid = (offset & ~IORING_OFF_MMAP_MASK) >> IORING_OFF_PBUF_SHIFT;
-               return io_pbuf_get_region(ctx, bgid);
+               id = (offset & ~IORING_OFF_MMAP_MASK) >> IORING_OFF_PBUF_SHIFT;
+               return io_pbuf_get_region(ctx, id);
        case IORING_MAP_OFF_PARAM_REGION:
                return &ctx->param_region;
        case IORING_MAP_OFF_ZCRX_REGION:
-               return &ctx->zcrx_region;
+               id = (offset & ~IORING_OFF_MMAP_MASK) >> IORING_OFF_ZCRX_SHIFT;
+               return io_zcrx_get_region(ctx, id);
        }
        return NULL;
 }
index dad0aa5b1b457475665ed392c89b158f5e5e50b4..24afb298e974dd5947c65a4ccefe4412496b2dce 100644 (file)
@@ -4,6 +4,8 @@
 #define IORING_MAP_OFF_PARAM_REGION            0x20000000ULL
 #define IORING_MAP_OFF_ZCRX_REGION             0x30000000ULL
 
+#define IORING_OFF_ZCRX_SHIFT          16
+
 struct page **io_pin_pages(unsigned long ubuf, unsigned long len, int *npages);
 
 #ifndef CONFIG_MMU
index ecfe080b24c5149e220b138202230f46e0ddb792..b7e65ae413b62d1eda0605bd1ee0a48459082f76 100644 (file)
@@ -338,6 +338,16 @@ static void io_zcrx_ifq_free(struct io_zcrx_ifq *ifq)
        kfree(ifq);
 }
 
+struct io_mapped_region *io_zcrx_get_region(struct io_ring_ctx *ctx,
+                                           unsigned int id)
+{
+       lockdep_assert_held(&ctx->mmap_lock);
+
+       if (id != 0)
+               return NULL;
+       return &ctx->zcrx_region;
+}
+
 int io_register_zcrx_ifq(struct io_ring_ctx *ctx,
                          struct io_uring_zcrx_ifq_reg __user *arg)
 {
index f2bc811f022c67d89669d6fa002eccc5156b2f8b..43134e5c9213367831acb1588524373329bfc0ad 100644 (file)
@@ -49,6 +49,8 @@ void io_shutdown_zcrx_ifqs(struct io_ring_ctx *ctx);
 int io_zcrx_recv(struct io_kiocb *req, struct io_zcrx_ifq *ifq,
                 struct socket *sock, unsigned int flags,
                 unsigned issue_flags, unsigned int *len);
+struct io_mapped_region *io_zcrx_get_region(struct io_ring_ctx *ctx,
+                                           unsigned int id);
 #else
 static inline int io_register_zcrx_ifq(struct io_ring_ctx *ctx,
                                        struct io_uring_zcrx_ifq_reg __user *arg)
@@ -67,6 +69,11 @@ static inline int io_zcrx_recv(struct io_kiocb *req, struct io_zcrx_ifq *ifq,
 {
        return -EOPNOTSUPP;
 }
+static inline struct io_mapped_region *io_zcrx_get_region(struct io_ring_ctx *ctx,
+                                                         unsigned int id)
+{
+       return NULL;
+}
 #endif
 
 int io_recvzc(struct io_kiocb *req, unsigned int issue_flags);