From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-yx1-f43.google.com (mail-yx1-f43.google.com [74.125.224.43]) (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 C3F47302741 for ; Thu, 20 Nov 2025 03:37:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.43 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763609839; cv=none; b=dcpFD0pUI+he5atU3vE0ngC4rZwbQEDg4ygbXW7vk7wkhyolBi37PGzjVRpYeZ+TS9DuMrPNMw0TH/lL1WSZwFYT4m30Utnj++gjar+AbFPAty4srUfeOZttiDnb45byPKq5Q67ndWE/uJDOT8RzA58DCeVryjCRdF+PNKP//Bw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763609839; c=relaxed/simple; bh=o+TnvX8H67E39YgV1VzM4yPneveTtrGVWnzs7PTFEyI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ns4D/AAmyxJ5NJm865gKVLDtHM4a6jnm1HZU7CNhjBR/jAcVogfnB3VOrLTBHTBNKF2aWBL5sORstUCLi6a7Cv/RNELunlRbx0OG6DFa/v8ZBnyO5zMpIdz3iVV9Ohgaa2s7ZXbcjpDDMqhYzcVG8xZGTDXbsrSJwH36itmtVgY= 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=c50ijRWD; arc=none smtp.client-ip=74.125.224.43 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="c50ijRWD" Received: by mail-yx1-f43.google.com with SMTP id 956f58d0204a3-63bc1aeb427so351786d50.3 for ; Wed, 19 Nov 2025 19:37:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1763609835; x=1764214635; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=dB9vGRQKOzD+0FIDq610kWqp5roY5Ews5Rp+LunXhtg=; b=c50ijRWDv6C4+bgjDgEntLElA/090B2lBIWQ/umM7rjkKgvMUfVLaWczs2DEj2Rbyx I2Mgxaiors/DmJAgoAkki5Yp8iYo6qaNIfe18qbZFMlNXnyel4IyEggprq4KIhCUYFh9 Bm+3PjfIENhOZTyXldLtte3+qD4dvFuMMCUGwm1rMUeiij76QlSqlEiCCnnZF7kJ5BZe 4iUe9LHarqM1jVzlwwYg4D8J61TCwd26KZejYV0GYmvc1qplkVnBMWVAlC/3VQ6aEcqF gyMUwQxdOyvxUG+CcLNJhg297RkK9mcREkxV+nLAF8yQJDS0JslUe6HU4TOWOl27kwIR uJlQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763609835; x=1764214635; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=dB9vGRQKOzD+0FIDq610kWqp5roY5Ews5Rp+LunXhtg=; b=jdhNI0yu6nHL4NrgPKgh6tqrrVdyCqwQn4Z8VexeWerX/Dhs8Fxl/nXqaxLccwcJE9 8S5b8hIN6TE3MkbuzIjKiiCRmdUcBMINyrys8jNVO4NsdE5sOhEl4/5R/AUYwHpgVxZH hiqCxHKzKAc/soXYtTNeGIW9ImWw97DBuBRJAyPkgl260aFPLpif5KblcjRcHB02n4D7 AjB2bZDULLnnpFGNJpM5wyg+fzPp0YZKoJguMKXXFuPxPSfvvT/a9FJS3jKUZ2imnhGW R/5BkPD/0THFgS765OE0e4DkDy57mxXs2CTa8wMrEt7Z/MuZquwzuUJ0BTElvDzSwn/q Qktw== X-Forwarded-Encrypted: i=1; AJvYcCX7NG+hhhKqzknKomLPxlu160An674ov9GKU/M+SSE8rWnGmMeSqrCxzUzFokVq1zLCmG2XUkc9uHY=@vger.kernel.org X-Gm-Message-State: AOJu0YzXMs9Snsf5L/sUU5uz2sVaJchjNrZFx0VyT25Oj8c1SUvQqLrq m2f3xZgE3O+6O2naTsD2FFsPMTfaU0C6EeBTLCPYDjYwpvDiXKOVzLOS X-Gm-Gg: ASbGncsril81du6RcSrZ3fD/7Jfgl2ZsneoqN0Lk33F7uUCw/Mpj7QEji6QbCji6brn zs2IeOi2KxHxFZ2C2GpFcAh219AJ5PonAXSlLaVajkQN4rqsH795JqLhZ+vzvO9nKLy4QADhClf m/CSdRJEBjL62ndO8ySbhffqn3Vk3GQkjVgbwDps4n1vjlz3OFAiBCpmztJkcjlPQ0pG23xuwh2 mIwbgm+JvoIazoWq+SuPn4doHGDZWEgphgbXqzhxryhujiDzzno+of0GwBEYPjx6efnTXMiLijs O5tvkkohV99jVdQCQGyeyONH5nrqREScUbbhiA3QP+0GbkUklnXXlrQ0R2kdSuLPnKw4iMgD0HI vFTPF1WfNxjXfDjY4Fy/BAYKWVgYi84KlO8kwPAbJB/J88nrxX6nNhmEiAtF5ERNrLa6w/AmKl3 cnOuXgkciVEx/rc1pzn+E9MA== X-Google-Smtp-Source: AGHT+IH+ZvCrkl3kFqXJlHEtVfU0bYPG0c0dzdNLXfeCYjxXFUTZZPthcByghfwOu6Wk5tCc8cKAKg== X-Received: by 2002:a05:690e:12cb:b0:63f:a324:bbf3 with SMTP id 956f58d0204a3-642f79d694dmr1177865d50.42.1763609835427; Wed, 19 Nov 2025 19:37:15 -0800 (PST) Received: from localhost ([2a03:2880:25ff:52::]) by smtp.gmail.com with ESMTPSA id 956f58d0204a3-642f718bbbesm456461d50.21.2025.11.19.19.37.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Nov 2025 19:37:15 -0800 (PST) From: Bobby Eshleman Date: Wed, 19 Nov 2025 19:37:12 -0800 Subject: [PATCH net-next v7 5/5] selftests: drv-net: devmem: add autorelease tests Precedence: bulk X-Mailing-List: linux-doc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20251119-scratch-bobbyeshleman-devmem-tcp-token-upstream-v7-5-1abc8467354c@meta.com> References: <20251119-scratch-bobbyeshleman-devmem-tcp-token-upstream-v7-0-1abc8467354c@meta.com> In-Reply-To: <20251119-scratch-bobbyeshleman-devmem-tcp-token-upstream-v7-0-1abc8467354c@meta.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Kuniyuki Iwashima , Willem de Bruijn , Neal Cardwell , David Ahern , Arnd Bergmann , Jonathan Corbet , Andrew Lunn , Shuah Khan , Donald Hunter , Mina Almasry Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, Stanislav Fomichev , Bobby Eshleman X-Mailer: b4 0.14.3 From: Bobby Eshleman Add tests cases that check the autorelease modes (on and off). The new tests are the same as the old ones, but just pass a flag to ncdevmem to select the autorelease mode. Only for RX tests is autorelease checked, as the autorelease ncdevmem flag is unused in the TX case and doesn't apply to TX bind operations. Signed-off-by: Bobby Eshleman --- Note: I tested successfully with kperf, but I'm troubleshooting some mlx5 issues with ncdevmem so this patch, though simple, is not fully validated. Will respond to this thread when solve the issue. Changes in v7: - use autorelease netlink - remove sockopt tests --- tools/testing/selftests/drivers/net/hw/devmem.py | 22 ++++++++++++++++++++-- tools/testing/selftests/drivers/net/hw/ncdevmem.c | 19 +++++++++++++------ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/tools/testing/selftests/drivers/net/hw/devmem.py b/tools/testing/selftests/drivers/net/hw/devmem.py index 45c2d49d55b6..dddb9d77cb28 100755 --- a/tools/testing/selftests/drivers/net/hw/devmem.py +++ b/tools/testing/selftests/drivers/net/hw/devmem.py @@ -25,7 +25,23 @@ def check_rx(cfg) -> None: port = rand_port() socat = f"socat -u - TCP{cfg.addr_ipver}:{cfg.baddr}:{port},bind={cfg.remote_baddr}:{port}" - listen_cmd = f"{cfg.bin_local} -l -f {cfg.ifname} -s {cfg.addr} -p {port} -c {cfg.remote_addr} -v 7" + listen_cmd = f"{cfg.bin_local} -l -f {cfg.ifname} -s {cfg.addr} -p {port} -c {cfg.remote_addr} -v 7 -a 0" + + with bkg(listen_cmd, exit_wait=True) as ncdevmem: + wait_port_listen(port) + cmd(f"yes $(echo -e \x01\x02\x03\x04\x05\x06) | \ + head -c 1K | {socat}", host=cfg.remote, shell=True) + + ksft_eq(ncdevmem.ret, 0) + + +@ksft_disruptive +def check_rx_autorelease(cfg) -> None: + require_devmem(cfg) + + port = rand_port() + socat = f"socat -u - TCP{cfg.addr_ipver}:{cfg.baddr}:{port},bind={cfg.remote_baddr}:{port}" + listen_cmd = f"{cfg.bin_local} -l -f {cfg.ifname} -s {cfg.addr} -p {port} -c {cfg.remote_addr} -v 7 -a 1" with bkg(listen_cmd, exit_wait=True) as ncdevmem: wait_port_listen(port) @@ -68,7 +84,9 @@ def main() -> None: cfg.bin_local = path.abspath(path.dirname(__file__) + "/ncdevmem") cfg.bin_remote = cfg.remote.deploy(cfg.bin_local) - ksft_run([check_rx, check_tx, check_tx_chunks], + ksft_run([check_rx, check_rx_autorelease, + check_tx, check_tx_autorelease, + check_tx_chunks, check_tx_chunks_autorelease], args=(cfg, )) ksft_exit() diff --git a/tools/testing/selftests/drivers/net/hw/ncdevmem.c b/tools/testing/selftests/drivers/net/hw/ncdevmem.c index 3288ed04ce08..406f1771d9ec 100644 --- a/tools/testing/selftests/drivers/net/hw/ncdevmem.c +++ b/tools/testing/selftests/drivers/net/hw/ncdevmem.c @@ -92,6 +92,7 @@ static char *port; static size_t do_validation; static int start_queue = -1; static int num_queues = -1; +static int devmem_autorelease; static char *ifname; static unsigned int ifindex; static unsigned int dmabuf_id; @@ -679,7 +680,8 @@ static int configure_flow_steering(struct sockaddr_in6 *server_sin) static int bind_rx_queue(unsigned int ifindex, unsigned int dmabuf_fd, struct netdev_queue_id *queues, - unsigned int n_queue_index, struct ynl_sock **ys) + unsigned int n_queue_index, struct ynl_sock **ys, + int autorelease) { struct netdev_bind_rx_req *req = NULL; struct netdev_bind_rx_rsp *rsp = NULL; @@ -695,6 +697,7 @@ static int bind_rx_queue(unsigned int ifindex, unsigned int dmabuf_fd, req = netdev_bind_rx_req_alloc(); netdev_bind_rx_req_set_ifindex(req, ifindex); netdev_bind_rx_req_set_fd(req, dmabuf_fd); + netdev_bind_rx_req_set_autorelease(req, autorelease); __netdev_bind_rx_req_set_queues(req, queues, n_queue_index); rsp = netdev_bind_rx(*ys, req); @@ -872,7 +875,8 @@ static int do_server(struct memory_buffer *mem) goto err_reset_rss; } - if (bind_rx_queue(ifindex, mem->fd, create_queues(), num_queues, &ys)) { + if (bind_rx_queue(ifindex, mem->fd, create_queues(), num_queues, &ys, + devmem_autorelease)) { pr_err("Failed to bind"); goto err_reset_flow_steering; } @@ -1092,7 +1096,7 @@ int run_devmem_tests(void) goto err_reset_headersplit; } - if (!bind_rx_queue(ifindex, mem->fd, queues, num_queues, &ys)) { + if (!bind_rx_queue(ifindex, mem->fd, queues, num_queues, &ys, 0)) { pr_err("Binding empty queues array should have failed"); goto err_unbind; } @@ -1108,7 +1112,7 @@ int run_devmem_tests(void) goto err_reset_headersplit; } - if (!bind_rx_queue(ifindex, mem->fd, queues, num_queues, &ys)) { + if (!bind_rx_queue(ifindex, mem->fd, queues, num_queues, &ys, 0)) { pr_err("Configure dmabuf with header split off should have failed"); goto err_unbind; } @@ -1124,7 +1128,7 @@ int run_devmem_tests(void) goto err_reset_headersplit; } - if (bind_rx_queue(ifindex, mem->fd, queues, num_queues, &ys)) { + if (bind_rx_queue(ifindex, mem->fd, queues, num_queues, &ys, 0)) { pr_err("Failed to bind"); goto err_reset_headersplit; } @@ -1397,7 +1401,7 @@ int main(int argc, char *argv[]) int is_server = 0, opt; int ret, err = 1; - while ((opt = getopt(argc, argv, "ls:c:p:v:q:t:f:z:")) != -1) { + while ((opt = getopt(argc, argv, "ls:c:p:v:q:t:f:z:a:")) != -1) { switch (opt) { case 'l': is_server = 1; @@ -1426,6 +1430,9 @@ int main(int argc, char *argv[]) case 'z': max_chunk = atoi(optarg); break; + case 'a': + devmem_autorelease = atoi(optarg); + break; case '?': fprintf(stderr, "unknown option: %c\n", optopt); break; -- 2.47.3