On 2026-08-13 18:23, Juanlu Herrero wrote:
Run the iou-zcrx server as N worker threads, each owning one receive
queue with its own io_uring and zero-copy receive (zcrx) ifq, so the
test can exercise multi-queue zero-copy receive.
The main thread owns the listening socket, accepts connections, and
dispatches each to the worker owning the queue it landed on by matching
SO_INCOMING_NAPI_ID against per-queue NAPI IDs.
Assisted-by: Claude:claude-opus-4-8
Signed-off-by: Juanlu Herrero <[email protected]>
---
.../testing/selftests/drivers/net/hw/Makefile | 5 +-
.../selftests/drivers/net/hw/iou-zcrx.c | 262 +++++++++++++-----
2 files changed, 195 insertions(+), 72 deletions(-)
[...]
diff --git a/tools/testing/selftests/drivers/net/hw/iou-zcrx.c
b/tools/testing/selftests/drivers/net/hw/iou-zcrx.c
index f793a6c04e412..008d3f4b76263 100644
--- a/tools/testing/selftests/drivers/net/hw/iou-zcrx.c
+++ b/tools/testing/selftests/drivers/net/hw/iou-zcrx.c
[...]
@@ -289,12 +279,13 @@ static void process_recvzc(struct thread_ctx *ctx, struct
io_uring_cqe *cqe)
error(1, 0, "recvzc(): %d", cqe->res);
if (cfg_oneshot) {
- if (cqe->res == 0 && cqe->flags == 0 && cfg_oneshot_recvs) {
- add_recvzc_oneshot(ctx, ctx->connfd, page_size);
- cfg_oneshot_recvs--;
+ if (cqe->res == 0 && cqe->flags == 0 &&
+ ctx->oneshot_recvs[conn_idx]) {
+ add_recvzc_oneshot(ctx, conn_idx, page_size);
+ ctx->oneshot_recvs[conn_idx]--;
This needs an early return. Sorry the bug was pre-existing but I just
noticed it.