]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
io_uring/zcrx: reject REG_NODEV with large rx_buf_size
authorPavel Begunkov <asml.silence@gmail.com>
Tue, 31 Mar 2026 21:07:38 +0000 (22:07 +0100)
committerJens Axboe <axboe@kernel.dk>
Wed, 1 Apr 2026 16:21:13 +0000 (10:21 -0600)
The copy fallback path doesn't care about the actual niov size and only
uses first PAGE_SIZE bytes, and any additional space will be wasted.
Since ZCRX_REG_NODEV solely relies on the copy path, it doesn't make
sense to support non-standard rx_buf_len. Reject it for now, and
re-enable once improved.

Fixes: c11728021d5cd ("io_uring/zcrx: implement device-less mode for zcrx")
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://patch.msgid.link/3e7652d9c27f8ac5d2b141e3af47971f2771fb05.1774780198.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/zcrx.c

index f94f74d0f566052586770b18a3fdaee5d4e6a4b0..1ce867c68446b1c7aa767adcddf306cf05cb3731 100644 (file)
@@ -449,6 +449,8 @@ static int io_zcrx_create_area(struct io_zcrx_ifq *ifq,
                        return -EINVAL;
                buf_size_shift = ilog2(reg->rx_buf_len);
        }
+       if (!ifq->dev && buf_size_shift != PAGE_SHIFT)
+               return -EOPNOTSUPP;
 
        ret = -ENOMEM;
        area = kzalloc_obj(*area);
@@ -462,7 +464,7 @@ static int io_zcrx_create_area(struct io_zcrx_ifq *ifq,
        if (ifq->dev)
                area->is_mapped = true;
 
-       if (buf_size_shift > io_area_max_shift(&area->mem)) {
+       if (ifq->dev && buf_size_shift > io_area_max_shift(&area->mem)) {
                ret = -ERANGE;
                goto err;
        }