]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
io_uring/zcrx: cache fallback availability in zcrx ctx
authorPavel Begunkov <asml.silence@gmail.com>
Mon, 23 Mar 2026 12:44:03 +0000 (12:44 +0000)
committerJens Axboe <axboe@kernel.dk>
Wed, 1 Apr 2026 16:21:13 +0000 (10:21 -0600)
Store a flag in struct io_zcrx_ifq telling if the backing memory is
normal page or dmabuf based. It was looking it up from the area, however
it logically allocates from the zcrx ctx and not a particular area, and
once we add more than one area it'll become a mess.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://patch.msgid.link/65e75408a7758fe7e60fae89b7a8d5ae4857f515.1774261953.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/zcrx.c
io_uring/zcrx.h

index e637052b645a3d90c070c8a8bb3f5506e618e0ba..32829775fb6be9927d999a6b704e3627519ff854 100644 (file)
@@ -423,8 +423,13 @@ static void io_zcrx_free_area(struct io_zcrx_ifq *ifq,
 static int io_zcrx_append_area(struct io_zcrx_ifq *ifq,
                                struct io_zcrx_area *area)
 {
+       bool kern_readable = !area->mem.is_dmabuf;
+
        if (WARN_ON_ONCE(ifq->area))
                return -EINVAL;
+       if (WARN_ON_ONCE(ifq->kern_readable != kern_readable))
+               return -EINVAL;
+
        ifq->area = area;
        return 0;
 }
@@ -882,6 +887,8 @@ int io_register_zcrx_ifq(struct io_ring_ctx *ctx,
        if (ret)
                goto err;
 
+       ifq->kern_readable = !(area.flags & IORING_ZCRX_AREA_DMABUF);
+
        if (!(reg.flags & ZCRX_REG_NODEV)) {
                ret = zcrx_register_netdev(ifq, &reg, &area);
                if (ret)
@@ -1298,7 +1305,7 @@ static struct net_iov *io_alloc_fallback_niov(struct io_zcrx_ifq *ifq)
        struct io_zcrx_area *area = ifq->area;
        struct net_iov *niov = NULL;
 
-       if (area->mem.is_dmabuf)
+       if (!ifq->kern_readable)
                return NULL;
 
        scoped_guard(spinlock_bh, &area->freelist_lock)
index 893cd3708a06fa5b9f6a35c6b3ab357e7a98a49c..3e07238a4eb012cdddc86924d5252775ce92e5c5 100644 (file)
@@ -54,6 +54,7 @@ struct io_zcrx_ifq {
        unsigned                        niov_shift;
        struct user_struct              *user;
        struct mm_struct                *mm_account;
+       bool                            kern_readable;
 
        struct zcrx_rq                  rq ____cacheline_aligned_in_smp;