From nobody Sat Feb 7 18:33:57 2026 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 808A43C1FD0 for ; Thu, 15 Jan 2026 17:12:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768497163; cv=none; b=HAZGs2rZ5nk57V4tbtLwXdgvIDt8wK0vT72RyXrF79nhwF5yG2CFqywqfX3p24fBndpGqiLmBPOD/aG+31ff1D5APDOP62LRUc2VAsSGZfNnUZVDLZbbZnzRkEp9CZgDJ+MbLqpUIzRZtqAI8AQinUx5l9gJ8Q8rUewSZdVJ7Qc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768497163; c=relaxed/simple; bh=ozJe/DZktvt1THhlIH8e13meT+GK+nb2peuvZHdYIB8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BnejIWFzntw7jpz1CWY1GVKFVMltbzSn7f1NsK9LGpOzak5AuCP1idQmk2Eg1zQppnQlKGbLFqcfDU9Rz3ytz4+G20DC/FUWc4jN78DIbS5Y/zeHEnbyjVcVNRNeycyTV1LBiOSPrG2QcY9zotKTb3MRXG9dCMDERf4+6X0niF8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=jv68rUWY; arc=none smtp.client-ip=209.85.128.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="jv68rUWY" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-4801c2fae63so5239225e9.2 for ; Thu, 15 Jan 2026 09:12:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768497158; x=1769101958; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=IUwAm1Dn1V0YNHJ06qHaA7B/DEkukzNU8MJR12KV7b4=; b=jv68rUWYhRMUVaQfK92x5EMA0vdJHU3qpp61axNVrr9/wMOVD3Y8IgWKe4QNDWKNUR HsnZOlgtxcvB/x1YGKC3nrRZvAocSJivD48lquEF0YLTHL0y81Kzb8HK1+WsYZiZyX60 5KCsHivQpfrnydWnhu8Ri/yd7X0pogRtwlimzX9ufGwSYwlQ62Br+EyxE3jNEZTl+Oj+ zHM+GQ8EiY0CWlv8IayDXJkUcizVKdJL83CoS7UMvdTwgP8ebqpTvoju1gJfi0uDokhP cTNqVxaNtDkFS8LVYSjCxmmtSsHvdpl/SxwY7yf/xkUnpT6aRzHOjhfRRHfH/1e+pqHT ZHkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768497158; x=1769101958; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=IUwAm1Dn1V0YNHJ06qHaA7B/DEkukzNU8MJR12KV7b4=; b=VxuVTao38LXGm7Xf8IKZMOPnnRN5dLRM0akDaVTlgUsxaDIFoSADfjzq342xj1kth1 eXTFXeybNSKn3eFDOXEYcRYbRJWk/7y/4E9KjErhk0mb8R4I1vByJ+7et78N6Md4N+DX hSvZTIgrxzDb8zw0XbUI2CtvYz1/TSt6Zy9UJBIDsoNC/o2CeiMU/KLF7PaPGvY3gZg7 AY7UQ53b3R1apnsqkBW6SRBFhCkSgBxV8m/WbO5BFxYf5uPq82g643hf2LPm3cycYZ+G vezVjMqhxbb7MaSKo1qQ/0fFZGhCZaMBLrhXQ9KYwATjt+hiEl/I5u7HZ84KoCqMaQRr fVww== X-Forwarded-Encrypted: i=1; AJvYcCVbg5RtT6nbltfvYOjSeEZEU0gSvTATrRNqmEEi5tUDoJAdv3+K2hY1Eioy3L6AgVOe9iBy6c6CqdsT4nM=@vger.kernel.org X-Gm-Message-State: AOJu0YxGc2ytt2xkMduyyU5T9D2WxNfYxCkMaCmXSuWm9kLjY5RMI09q CcTjSdpPXPxDbfj3izSGMFW/oXV+/GVvGddezvf+FgKUEl899jmKjFas X-Gm-Gg: AY/fxX7JjS4SnVyIXR/nfDqBirbuwhmqteKPeEL6d/GzVRbXVACvGzl3LoR9u66PwOu I2HweFrEdDHrxKSCWKB7HG2YxL6GBmnrbINHHWsJ0Z1sE+tweUr7HC+pxt4d/T/B0EDPXY/8mmD 2AADSTeuWAAtPMUF0KpegGUQ1HKDILs16kSTqI8Er6M0uX2fPzBOXzOe6kvEwx5yqkPESI1Fgz4 nXfXnAXy9Hfn+dJITRJZb/62p/3K3T9vrQOXxYcNaIzGPzcLaHOhjTbjCnBz6DDKrmSkokN/ZjK LKOr6xTH8Dimjaa5n0ZgiRb6h92xAZxsEl3lBou05kECFyxtrZ5XhKDKXotvBkc+1ReYxkgbvme 87/UQXFFqTfik9cT0KUTtZY/kjq2md5WZ+w4XbZ7foYHTCYvvktLY1/A/LZmY0L9LAle7QpzmD6 RSI+JhJqcbI31OpoGb1mXdosoXDv7+TxKVKNQQ5xY43x2rH+NsBbBS88I1LM/pCl5cFXYjgOsNu oWoedLHbuhT9iiOaw== X-Received: by 2002:a05:600c:8b58:b0:47b:e2a9:2bd9 with SMTP id 5b1f17b1804b1-4801e345987mr6476985e9.31.1768497158402; Thu, 15 Jan 2026 09:12:38 -0800 (PST) Received: from 127.mynet ([2a01:4b00:bd21:4f00:7cc6:d3ca:494:116c]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-47f429071a2sm54741645e9.11.2026.01.15.09.12.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Jan 2026 09:12:37 -0800 (PST) From: Pavel Begunkov To: netdev@vger.kernel.org Cc: "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Jonathan Corbet , Michael Chan , Pavan Chebbi , Andrew Lunn , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Joshua Washington , Harshitha Ramamurthy , Saeed Mahameed , Tariq Toukan , Mark Bloch , Leon Romanovsky , Alexander Duyck , Ilias Apalodimas , Shuah Khan , Willem de Bruijn , Ankit Garg , Tim Hostetler , Alok Tiwari , Ziwei Xiao , John Fraker , Praveen Kaligineedi , Mohsin Bashir , Joe Damato , Mina Almasry , Dimitri Daskalakis , Stanislav Fomichev , Kuniyuki Iwashima , Samiullah Khawaja , Alexander Lobakin , Pavel Begunkov , David Wei , Yue Haibing , Haiyue Wang , Jens Axboe , Simon Horman , Vishwanath Seshagiri , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, linux-rdma@vger.kernel.org, linux-kselftest@vger.kernel.org, dtatulea@nvidia.com, kernel-team@meta.com, io-uring@vger.kernel.org Subject: [PATCH net-next v9 8/9] selftests: iou-zcrx: test large chunk sizes Date: Thu, 15 Jan 2026 17:12:01 +0000 Message-ID: X-Mailer: git-send-email 2.52.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a test using large chunks for zcrx memory area. Signed-off-by: Pavel Begunkov --- .../selftests/drivers/net/hw/iou-zcrx.c | 72 +++++++++++++++---- .../selftests/drivers/net/hw/iou-zcrx.py | 39 ++++++++++ 2 files changed, 99 insertions(+), 12 deletions(-) diff --git a/tools/testing/selftests/drivers/net/hw/iou-zcrx.c b/tools/test= ing/selftests/drivers/net/hw/iou-zcrx.c index 62456df947bc..240d13dbc54e 100644 --- a/tools/testing/selftests/drivers/net/hw/iou-zcrx.c +++ b/tools/testing/selftests/drivers/net/hw/iou-zcrx.c @@ -12,6 +12,7 @@ #include =20 #include +#include #include #include #include @@ -37,6 +38,23 @@ =20 #include =20 +#define SKIP_CODE 42 + +struct t_io_uring_zcrx_ifq_reg { + __u32 if_idx; + __u32 if_rxq; + __u32 rq_entries; + __u32 flags; + + __u64 area_ptr; /* pointer to struct io_uring_zcrx_area_reg */ + __u64 region_ptr; /* struct io_uring_region_desc * */ + + struct io_uring_zcrx_offsets offsets; + __u32 zcrx_id; + __u32 rx_buf_len; + __u64 __resv[3]; +}; + static long page_size; #define AREA_SIZE (8192 * page_size) #define SEND_SIZE (512 * 4096) @@ -65,6 +83,8 @@ static bool cfg_oneshot; static int cfg_oneshot_recvs; static int cfg_send_size =3D SEND_SIZE; static struct sockaddr_in6 cfg_addr; +static unsigned int cfg_rx_buf_len; +static bool cfg_dry_run; =20 static char *payload; static void *area_ptr; @@ -128,14 +148,28 @@ static void setup_zcrx(struct io_uring *ring) if (!ifindex) error(1, 0, "bad interface name: %s", cfg_ifname); =20 - area_ptr =3D mmap(NULL, - AREA_SIZE, - PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE, - 0, - 0); - if (area_ptr =3D=3D MAP_FAILED) - error(1, 0, "mmap(): zero copy area"); + if (cfg_rx_buf_len && cfg_rx_buf_len !=3D page_size) { + area_ptr =3D mmap(NULL, + AREA_SIZE, + PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE | + MAP_HUGETLB | MAP_HUGE_2MB, + -1, + 0); + if (area_ptr =3D=3D MAP_FAILED) { + printf("Can't allocate huge pages\n"); + exit(SKIP_CODE); + } + } else { + area_ptr =3D mmap(NULL, + AREA_SIZE, + PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, + 0, + 0); + if (area_ptr =3D=3D MAP_FAILED) + error(1, 0, "mmap(): zero copy area"); + } =20 ring_size =3D get_refill_ring_size(rq_entries); ring_ptr =3D mmap(NULL, @@ -157,17 +191,23 @@ static void setup_zcrx(struct io_uring *ring) .flags =3D 0, }; =20 - struct io_uring_zcrx_ifq_reg reg =3D { + struct t_io_uring_zcrx_ifq_reg reg =3D { .if_idx =3D ifindex, .if_rxq =3D cfg_queue_id, .rq_entries =3D rq_entries, .area_ptr =3D (__u64)(unsigned long)&area_reg, .region_ptr =3D (__u64)(unsigned long)®ion_reg, + .rx_buf_len =3D cfg_rx_buf_len, }; =20 - ret =3D io_uring_register_ifq(ring, ®); - if (ret) + ret =3D io_uring_register_ifq(ring, (void *)®); + if (cfg_rx_buf_len && (ret =3D=3D -EINVAL || ret =3D=3D -EOPNOTSUPP || + ret =3D=3D -ERANGE)) { + printf("Large chunks are not supported %i\n", ret); + exit(SKIP_CODE); + } else if (ret) { error(1, 0, "io_uring_register_ifq(): %d", ret); + } =20 rq_ring.khead =3D (unsigned int *)((char *)ring_ptr + reg.offsets.head); rq_ring.ktail =3D (unsigned int *)((char *)ring_ptr + reg.offsets.tail); @@ -323,6 +363,8 @@ static void run_server(void) io_uring_queue_init(512, &ring, flags); =20 setup_zcrx(&ring); + if (cfg_dry_run) + return; =20 add_accept(&ring, fd); =20 @@ -383,7 +425,7 @@ static void parse_opts(int argc, char **argv) usage(argv[0]); cfg_payload_len =3D max_payload_len; =20 - while ((c =3D getopt(argc, argv, "sch:p:l:i:q:o:z:")) !=3D -1) { + while ((c =3D getopt(argc, argv, "sch:p:l:i:q:o:z:x:d")) !=3D -1) { switch (c) { case 's': if (cfg_client) @@ -418,6 +460,12 @@ static void parse_opts(int argc, char **argv) case 'z': cfg_send_size =3D strtoul(optarg, NULL, 0); break; + case 'x': + cfg_rx_buf_len =3D page_size * strtoul(optarg, NULL, 0); + break; + case 'd': + cfg_dry_run =3D true; + break; } } =20 diff --git a/tools/testing/selftests/drivers/net/hw/iou-zcrx.py b/tools/tes= ting/selftests/drivers/net/hw/iou-zcrx.py index 712c806508b5..7f596a33eb2b 100755 --- a/tools/testing/selftests/drivers/net/hw/iou-zcrx.py +++ b/tools/testing/selftests/drivers/net/hw/iou-zcrx.py @@ -7,6 +7,7 @@ from lib.py import ksft_run, ksft_exit, KsftSkipEx from lib.py import NetDrvEpEnv from lib.py import bkg, cmd, defer, ethtool, rand_port, wait_port_listen =20 +SKIP_CODE =3D 42 =20 def _get_current_settings(cfg): output =3D ethtool(f"-g {cfg.ifname}", json=3DTrue)[0] @@ -132,6 +133,44 @@ def test_zcrx_rss(cfg) -> None: cmd(tx_cmd, host=3Dcfg.remote) =20 =20 +def test_zcrx_large_chunks(cfg) -> None: + """Test zcrx with large buffer chunks.""" + + cfg.require_ipver('6') + + combined_chans =3D _get_combined_channels(cfg) + if combined_chans < 2: + raise KsftSkipEx('at least 2 combined channels required') + (rx_ring, hds_thresh) =3D _get_current_settings(cfg) + port =3D rand_port() + + ethtool(f"-G {cfg.ifname} tcp-data-split on") + defer(ethtool, f"-G {cfg.ifname} tcp-data-split auto") + + ethtool(f"-G {cfg.ifname} hds-thresh 0") + defer(ethtool, f"-G {cfg.ifname} hds-thresh {hds_thresh}") + + ethtool(f"-G {cfg.ifname} rx 64") + defer(ethtool, f"-G {cfg.ifname} rx {rx_ring}") + + ethtool(f"-X {cfg.ifname} equal {combined_chans - 1}") + defer(ethtool, f"-X {cfg.ifname} default") + + flow_rule_id =3D _set_flow_rule(cfg, port, combined_chans - 1) + defer(ethtool, f"-N {cfg.ifname} delete {flow_rule_id}") + + rx_cmd =3D f"{cfg.bin_local} -s -p {port} -i {cfg.ifname} -q {combined= _chans - 1} -x 2" + tx_cmd =3D f"{cfg.bin_remote} -c -h {cfg.addr_v['6']} -p {port} -l 128= 40" + + probe =3D cmd(rx_cmd + " -d", fail=3DFalse) + if probe.ret =3D=3D SKIP_CODE: + raise KsftSkipEx(probe.stdout) + + with bkg(rx_cmd, exit_wait=3DTrue): + wait_port_listen(port, proto=3D"tcp") + cmd(tx_cmd, host=3Dcfg.remote) + + def main() -> None: with NetDrvEpEnv(__file__) as cfg: cfg.bin_local =3D path.abspath(path.dirname(__file__) + "/../../..= /drivers/net/hw/iou-zcrx") --=20 2.52.0