All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH io_uring-7.1 v2 0/5] follow up zcrx fixes
@ 2026-03-25 13:09 Pavel Begunkov
  2026-03-25 13:09 ` [PATCH io_uring-7.1 v2 1/5] io_uring/zcrx: reject REG_NODEV with large rx_buf_size Pavel Begunkov
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Pavel Begunkov @ 2026-03-25 13:09 UTC (permalink / raw)
  To: io-uring; +Cc: asml.silence, axboe, netdev

Follow up fixes for the recent update flagged by review.

v2: reject REG_NODEV + ->rx_buf_size

Pavel Begunkov (5):
  io_uring/zcrx: reject REG_NODEV with large rx_buf_size
  io_uring/zcrx: don't use mark0 for allocating xarray
  io_uring/zcrx: don't clear not allocated niovs
  io_uring/zcrx: use dma_len for chunk size calculation
  io_uring/zcrx: use correct mmap off constants

 io_uring/zcrx.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

-- 
2.53.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH io_uring-7.1 v2 1/5] io_uring/zcrx: reject REG_NODEV with large rx_buf_size
  2026-03-25 13:09 [PATCH io_uring-7.1 v2 0/5] follow up zcrx fixes Pavel Begunkov
@ 2026-03-25 13:09 ` Pavel Begunkov
  2026-03-25 13:09 ` [PATCH io_uring-7.1 v2 2/5] io_uring/zcrx: don't use mark0 for allocating xarray Pavel Begunkov
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Pavel Begunkov @ 2026-03-25 13:09 UTC (permalink / raw)
  To: io-uring; +Cc: asml.silence, axboe, netdev

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>
---
 io_uring/zcrx.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c
index f94f74d0f566..1ce867c68446 100644
--- a/io_uring/zcrx.c
+++ b/io_uring/zcrx.c
@@ -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;
 	}
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH io_uring-7.1 v2 2/5] io_uring/zcrx: don't use mark0 for allocating xarray
  2026-03-25 13:09 [PATCH io_uring-7.1 v2 0/5] follow up zcrx fixes Pavel Begunkov
  2026-03-25 13:09 ` [PATCH io_uring-7.1 v2 1/5] io_uring/zcrx: reject REG_NODEV with large rx_buf_size Pavel Begunkov
@ 2026-03-25 13:09 ` Pavel Begunkov
  2026-03-25 13:09 ` [PATCH io_uring-7.1 v2 3/5] io_uring/zcrx: don't clear not allocated niovs Pavel Begunkov
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Pavel Begunkov @ 2026-03-25 13:09 UTC (permalink / raw)
  To: io-uring; +Cc: asml.silence, axboe, netdev

XA_MARK_0 is not compatible with xarray allocating entries, use
XA_MARK_1.

Fixes: fda90d43f4fac ("io_uring/zcrx: return back two step unregistration")
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
 io_uring/zcrx.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c
index 1ce867c68446..dede892bdda9 100644
--- a/io_uring/zcrx.c
+++ b/io_uring/zcrx.c
@@ -929,12 +929,12 @@ int io_register_zcrx(struct io_ring_ctx *ctx,
 
 static inline bool is_zcrx_entry_marked(struct io_ring_ctx *ctx, unsigned long id)
 {
-	return xa_get_mark(&ctx->zcrx_ctxs, id, XA_MARK_0);
+	return xa_get_mark(&ctx->zcrx_ctxs, id, XA_MARK_1);
 }
 
 static inline void set_zcrx_entry_mark(struct io_ring_ctx *ctx, unsigned long id)
 {
-	xa_set_mark(&ctx->zcrx_ctxs, id, XA_MARK_0);
+	xa_set_mark(&ctx->zcrx_ctxs, id, XA_MARK_1);
 }
 
 void io_terminate_zcrx(struct io_ring_ctx *ctx)
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH io_uring-7.1 v2 3/5] io_uring/zcrx: don't clear not allocated niovs
  2026-03-25 13:09 [PATCH io_uring-7.1 v2 0/5] follow up zcrx fixes Pavel Begunkov
  2026-03-25 13:09 ` [PATCH io_uring-7.1 v2 1/5] io_uring/zcrx: reject REG_NODEV with large rx_buf_size Pavel Begunkov
  2026-03-25 13:09 ` [PATCH io_uring-7.1 v2 2/5] io_uring/zcrx: don't use mark0 for allocating xarray Pavel Begunkov
@ 2026-03-25 13:09 ` Pavel Begunkov
  2026-03-25 13:09 ` [PATCH io_uring-7.1 v2 4/5] io_uring/zcrx: use dma_len for chunk size calculation Pavel Begunkov
  2026-03-25 13:09 ` [PATCH io_uring-7.1 v2 5/5] io_uring/zcrx: use correct mmap off constants Pavel Begunkov
  4 siblings, 0 replies; 6+ messages in thread
From: Pavel Begunkov @ 2026-03-25 13:09 UTC (permalink / raw)
  To: io-uring; +Cc: asml.silence, axboe, netdev

Now that area->is_mapped is set earlier before niovs array is allocated,
io_zcrx_free_area -> io_zcrx_unmap_area in an error path can try to
clear dma addresses for unallocated niovs, fix it.

Fixes: 8c0cab0b7bf76 ("always dma map in advance")
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
 io_uring/zcrx.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c
index dede892bdda9..d9174cb31a44 100644
--- a/io_uring/zcrx.c
+++ b/io_uring/zcrx.c
@@ -289,8 +289,10 @@ static void io_zcrx_unmap_area(struct io_zcrx_ifq *ifq,
 		return;
 	area->is_mapped = false;
 
-	for (i = 0; i < area->nia.num_niovs; i++)
-		net_mp_niov_set_dma_addr(&area->nia.niovs[i], 0);
+	if (area->nia.niovs) {
+		for (i = 0; i < area->nia.num_niovs; i++)
+			net_mp_niov_set_dma_addr(&area->nia.niovs[i], 0);
+	}
 
 	if (area->mem.is_dmabuf) {
 		io_release_dmabuf(&area->mem);
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH io_uring-7.1 v2 4/5] io_uring/zcrx: use dma_len for chunk size calculation
  2026-03-25 13:09 [PATCH io_uring-7.1 v2 0/5] follow up zcrx fixes Pavel Begunkov
                   ` (2 preceding siblings ...)
  2026-03-25 13:09 ` [PATCH io_uring-7.1 v2 3/5] io_uring/zcrx: don't clear not allocated niovs Pavel Begunkov
@ 2026-03-25 13:09 ` Pavel Begunkov
  2026-03-25 13:09 ` [PATCH io_uring-7.1 v2 5/5] io_uring/zcrx: use correct mmap off constants Pavel Begunkov
  4 siblings, 0 replies; 6+ messages in thread
From: Pavel Begunkov @ 2026-03-25 13:09 UTC (permalink / raw)
  To: io-uring; +Cc: asml.silence, axboe, netdev

Buffers are now dma-mapped earlier and we can sg_dma_len(), otherwise,
since it's walking with for_each_sgtable_dma_sg(), it might wrongfully
reject some configurations. As a bonus, it'd now be able to use larger
chunks if dma addresses are coalesced e.g by iommu.

Fixes: 8c0cab0b7bf76 ("always dma map in advance")
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
 io_uring/zcrx.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c
index d9174cb31a44..e1d2e1f1b766 100644
--- a/io_uring/zcrx.c
+++ b/io_uring/zcrx.c
@@ -63,7 +63,7 @@ static int io_area_max_shift(struct io_zcrx_mem *mem)
 	unsigned i;
 
 	for_each_sgtable_dma_sg(sgt, sg, i)
-		shift = min(shift, __ffs(sg->length));
+		shift = min(shift, __ffs(sg_dma_len(sg)));
 	return shift;
 }
 
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH io_uring-7.1 v2 5/5] io_uring/zcrx: use correct mmap off constants
  2026-03-25 13:09 [PATCH io_uring-7.1 v2 0/5] follow up zcrx fixes Pavel Begunkov
                   ` (3 preceding siblings ...)
  2026-03-25 13:09 ` [PATCH io_uring-7.1 v2 4/5] io_uring/zcrx: use dma_len for chunk size calculation Pavel Begunkov
@ 2026-03-25 13:09 ` Pavel Begunkov
  4 siblings, 0 replies; 6+ messages in thread
From: Pavel Begunkov @ 2026-03-25 13:09 UTC (permalink / raw)
  To: io-uring; +Cc: asml.silence, axboe, netdev

zcrx was using IORING_OFF_PBUF_SHIFT during first iterations, but there
is now a separate constant it should use. Both are 16 so it doesn't
change anything, but improve it for the future.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
 io_uring/zcrx.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/io_uring/zcrx.c b/io_uring/zcrx.c
index e1d2e1f1b766..df8dae724be4 100644
--- a/io_uring/zcrx.c
+++ b/io_uring/zcrx.c
@@ -386,7 +386,7 @@ static int io_allocate_rbuf_ring(struct io_ring_ctx *ctx,
 		return -EINVAL;
 
 	mmap_offset = IORING_MAP_OFF_ZCRX_REGION;
-	mmap_offset += id << IORING_OFF_PBUF_SHIFT;
+	mmap_offset += id << IORING_OFF_ZCRX_SHIFT;
 
 	ret = io_create_region(ctx, &ifq->rq_region, rd, mmap_offset);
 	if (ret < 0)
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-03-25 13:09 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-25 13:09 [PATCH io_uring-7.1 v2 0/5] follow up zcrx fixes Pavel Begunkov
2026-03-25 13:09 ` [PATCH io_uring-7.1 v2 1/5] io_uring/zcrx: reject REG_NODEV with large rx_buf_size Pavel Begunkov
2026-03-25 13:09 ` [PATCH io_uring-7.1 v2 2/5] io_uring/zcrx: don't use mark0 for allocating xarray Pavel Begunkov
2026-03-25 13:09 ` [PATCH io_uring-7.1 v2 3/5] io_uring/zcrx: don't clear not allocated niovs Pavel Begunkov
2026-03-25 13:09 ` [PATCH io_uring-7.1 v2 4/5] io_uring/zcrx: use dma_len for chunk size calculation Pavel Begunkov
2026-03-25 13:09 ` [PATCH io_uring-7.1 v2 5/5] io_uring/zcrx: use correct mmap off constants Pavel Begunkov

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.