From nobody Tue Apr 7 01:19:01 2026 Received: from mail-yw1-f179.google.com (mail-yw1-f179.google.com [209.85.128.179]) (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 36239371D0C for ; Mon, 16 Mar 2026 22:29:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773700166; cv=none; b=YUVivO0csFv21BWddx5Ohx/XhorIYozJK9tDvM/dZTTOoKymn1yXiEdfLA5kkl4vZkwevTt3N0xvrxLQSIhXFS52vO5Pxvy0Rr65ZAZw7/Ns2jmqJVNrUiILleihspFmWkla9+dXL94RmoskQthI4ZjecCzLvX+TRs1FvvTHGuA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773700166; c=relaxed/simple; bh=KysKv+4UMfhnDnTvr6BO8IlevtyErd4SdDk4OwtDiUU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gavCQqWzzepBEnM3GSQ0/IHiqICu1CTYWvmVB+054xeiSFKGd3FclPN13LmOM9KQ0afVBtzGN1Nt1M5ORvX3mRH0U/RJEuz0AobgZnhW+TtMhwOIxUR3rURURjpB7SxLfPvlhqmS9KGgLtvD0p5rVnuHQI8Vu7w8e3fI4uqr0Vc= 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=d7x2AqX1; arc=none smtp.client-ip=209.85.128.179 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="d7x2AqX1" Received: by mail-yw1-f179.google.com with SMTP id 00721157ae682-79a3e2e64f4so10823407b3.1 for ; Mon, 16 Mar 2026 15:29:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773700162; x=1774304962; 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=Mhg1Y4Ej84+nsyH2qvB8M3otNVTGHX9lgToOwhjqhW4=; b=d7x2AqX1KCf2gCvxClxT7pQg8TYtC6zI88CvaFlV9h0wNBR52J0zPbkx1pUD9Ih8xD Ddi9IopD4EBbUGrXBgIucM6DgLnbrfJSgk84SJLOkFjT33hsSG1qj3v4xDhtEXibD7l+ JX6lXmIMQLE0nCaYnwVQhIh+rBkaiNgYAk/XYi/WlA5fgA+Eo6xGWMP1bpJ5Rl/4zh6F aFQTrrI+SaDsTzeO6nU6ApCekP36+9+UWcbUWMVZYkwmX5fNt6JnXIHXaH176PTT3pQz 9goHQWQ+k2u5t51hkqzNl4sIrYsCje9VT4QoTz/pyN+dgw7LbzEt91BH02I0UReCsI+U UX5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773700162; x=1774304962; 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=Mhg1Y4Ej84+nsyH2qvB8M3otNVTGHX9lgToOwhjqhW4=; b=nZZyulFkJyEi0PdQ/LGFFh4AMYX9vBcvTNLzvPEYik4ii1c3Kz5en9U55ORmrd1n44 ZxHNRGseRbwsBaM2dlZ0KSMIAkziOPeTW8eILDBrBcLX8wLVB5wMsJ6NEJ0TEcOaBWCo I6ongoFa8dd++4GsXqluhD3YMQl8OH6sxW9RSjZy1PjFuBO9at690fmggGBcGn3EQOAF lUuRbQ7oGc/19/nMuyulDpBCZc5shSyyiytST5EknQ7as3jKu/OxS05j0+BShtpk/9Z2 5IoK4th+WNFWhzioDbWOVGUeTG/YCHIOKwdbBfsZNzfN9G1liFFJkKxQCB5iYq5HFKd0 WKrA== X-Forwarded-Encrypted: i=1; AJvYcCVU/cEuf4Txoax1eTu/+vLNDwila2XpMM88pVrDuC+ezr0CFcxbiKIfoeEVXShVyEBh8GIU4DhrSRc0b0I=@vger.kernel.org X-Gm-Message-State: AOJu0YyyenwEjpWU0S3PxRB+pdwY3c0Xr+01F+Xk536nELzEC6BVLdNk jDWeGYopH+N7okjNV0obmZa5MgewXMTOrYfzsI0KggIoxeBjJuCz4+X+ X-Gm-Gg: ATEYQzzcqrjRraciNGpSOOJWRYHVR3RlM1Kfh0kdxqs+y6nqMn08e/SaGCn6NoiGyJ5 am80GX72u3LCLSsAiUHuG8HfMvuN/fb15zGzfDhseMWBv8Le+Znb740OAbmbkMfbR4Bqc+9I+1U V3HrXV35/mGBP+U0vcOouEwP1OIso4czbmATimY6POtwZSQ76XjrtyCgV0xnxCgypjALhCBXlGz cp6j0bcheRx8quPEeDPsqUMQH5xzd15DiLZhDboQkfga0bmqWgCIHTF1dpTwNEVCFpOIyRPRdOg LOaPfNVVudGxoYpyrvV/DOnNU9nLSfXRlNV/ELoKPJEGQvl1fXykLK0sJmkELGBVnDVmhBp5IR5 SrfWXvwnmJQotN0o6fOzCAc9MZAmlf3YjAcIJaZgSel80FR+fmQ0Hssl64APrp2UKniHjbnEGj6 FdYuEz93JGJTjO0I3ABTkSuPfiERKXBrJ6 X-Received: by 2002:a05:690c:1c:b0:798:34a:52de with SMTP id 00721157ae682-79a1c1ddd0fmr149731677b3.51.1773700161934; Mon, 16 Mar 2026 15:29:21 -0700 (PDT) Received: from localhost ([2a03:2880:25ff:45::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-79917f08134sm92221467b3.36.2026.03.16.15.29.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Mar 2026 15:29:21 -0700 (PDT) From: Bobby Eshleman Date: Mon, 16 Mar 2026 15:29:12 -0700 Subject: [PATCH net-next 1/6] net: devmem: support TX through netkit leased queues Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260316-scratch-bobbyeshleman-tcp-dm-netkit5-v1-1-b53c8cd72b23@meta.com> References: <20260316-scratch-bobbyeshleman-tcp-dm-netkit5-v1-0-b53c8cd72b23@meta.com> In-Reply-To: <20260316-scratch-bobbyeshleman-tcp-dm-netkit5-v1-0-b53c8cd72b23@meta.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Andrew Lunn , Shuah Khan Cc: Stanislav Fomichev , Mina Almasry , Wei Wang , David Wei , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, bpf@vger.kernel.org, Bobby Eshleman X-Mailer: b4 0.14.3 From: Bobby Eshleman When a netkit virtual device leases queues from a physical NIC, devmem TX bindings created on the netkit device should use the physical NIC for DMA operations rather than the virtual device, which has no DMA capability. In bind_tx_doit, walk the device's leased rx queues to discover the underlying physical device that supports netmem_tx. Use this device for DMA device lookup and pass it as the real_tx_dev in the binding. When real_tx_dev is set, it is also used for NUMA-local allocations. Extend validate_xmit_unreadable_skb() to support the netkit case, where the skb is validated twice: once on the netkit guest device and again on the physical NIC after BPF redirect or ip forwarding. Both invocations must pass for the skb to be transmitted. Signed-off-by: Bobby Eshleman --- net/core/dev.c | 26 +++++++++++++++++++------- net/core/devmem.c | 16 ++++++++++------ net/core/devmem.h | 6 ++++-- net/core/netdev-genl.c | 38 +++++++++++++++++++++++++++++++++----- 4 files changed, 66 insertions(+), 20 deletions(-) diff --git a/net/core/dev.c b/net/core/dev.c index ca4b26dfb1bd..105bd27be024 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3981,24 +3981,36 @@ static struct sk_buff *sk_validate_xmit_skb(struct = sk_buff *skb, static struct sk_buff *validate_xmit_unreadable_skb(struct sk_buff *skb, struct net_device *dev) { + struct net_devmem_dmabuf_binding *binding; struct skb_shared_info *shinfo; + struct net_device *real_tx_dev; struct net_iov *niov; =20 if (likely(skb_frags_readable(skb))) goto out; =20 - if (!dev->netmem_tx) - goto out_free; - shinfo =3D skb_shinfo(skb); + if (shinfo->nr_frags =3D=3D 0) + goto out; =20 - if (shinfo->nr_frags > 0) { - niov =3D netmem_to_net_iov(skb_frag_netmem(&shinfo->frags[0])); - if (net_is_devmem_iov(niov) && - READ_ONCE(net_devmem_iov_binding(niov)->dev) !=3D dev) + niov =3D netmem_to_net_iov(skb_frag_netmem(&shinfo->frags[0])); + if (!net_is_devmem_iov(niov)) + goto out; + + binding =3D net_devmem_iov_binding(niov); + real_tx_dev =3D READ_ONCE(binding->real_tx_dev); + + if (real_tx_dev) { + if (!real_tx_dev->netmem_tx) + goto out_free; + if (READ_ONCE(binding->dev) !=3D dev && real_tx_dev !=3D dev) goto out_free; + goto out; } =20 + if (READ_ONCE(binding->dev) !=3D dev || !dev->netmem_tx) + goto out_free; + out: return skb; =20 diff --git a/net/core/devmem.c b/net/core/devmem.c index 7ede81509968..a4148cba5b5f 100644 --- a/net/core/devmem.c +++ b/net/core/devmem.c @@ -181,12 +181,13 @@ int net_devmem_bind_dmabuf_to_queue(struct net_device= *dev, u32 rxq_idx, } =20 struct net_devmem_dmabuf_binding * -net_devmem_bind_dmabuf(struct net_device *dev, +net_devmem_bind_dmabuf(struct net_device *dev, struct net_device *real_tx_= dev, struct device *dma_dev, enum dma_data_direction direction, unsigned int dmabuf_fd, struct netdev_nl_sock *priv, struct netlink_ext_ack *extack) { + struct net_device *node_dev =3D real_tx_dev ?: dev; struct net_devmem_dmabuf_binding *binding; static u32 id_alloc_next; struct scatterlist *sg; @@ -205,13 +206,14 @@ net_devmem_bind_dmabuf(struct net_device *dev, return ERR_CAST(dmabuf); =20 binding =3D kzalloc_node(sizeof(*binding), GFP_KERNEL, - dev_to_node(&dev->dev)); + dev_to_node(&node_dev->dev)); if (!binding) { err =3D -ENOMEM; goto err_put_dmabuf; } =20 binding->dev =3D dev; + binding->real_tx_dev =3D real_tx_dev; xa_init_flags(&binding->bound_rxqs, XA_FLAGS_ALLOC); =20 err =3D percpu_ref_init(&binding->ref, @@ -254,7 +256,7 @@ net_devmem_bind_dmabuf(struct net_device *dev, * allocate MTU sized chunks here. Leave that for future work... */ binding->chunk_pool =3D gen_pool_create(PAGE_SHIFT, - dev_to_node(&dev->dev)); + dev_to_node(&node_dev->dev)); if (!binding->chunk_pool) { err =3D -ENOMEM; goto err_tx_vec; @@ -268,7 +270,7 @@ net_devmem_bind_dmabuf(struct net_device *dev, struct net_iov *niov; =20 owner =3D kzalloc_node(sizeof(*owner), GFP_KERNEL, - dev_to_node(&dev->dev)); + dev_to_node(&node_dev->dev)); if (!owner) { err =3D -ENOMEM; goto err_free_chunks; @@ -280,7 +282,8 @@ net_devmem_bind_dmabuf(struct net_device *dev, owner->binding =3D binding; =20 err =3D gen_pool_add_owner(binding->chunk_pool, dma_addr, - dma_addr, len, dev_to_node(&dev->dev), + dma_addr, len, + dev_to_node(&node_dev->dev), owner); if (err) { kfree(owner); @@ -397,7 +400,8 @@ struct net_devmem_dmabuf_binding *net_devmem_get_bindin= g(struct sock *sk, */ dst_dev =3D dst_dev_rcu(dst); if (unlikely(!dst_dev) || - unlikely(dst_dev !=3D READ_ONCE(binding->dev))) { + unlikely(dst_dev !=3D READ_ONCE(binding->dev) && + dst_dev !=3D READ_ONCE(binding->real_tx_dev))) { err =3D -ENODEV; goto out_unlock; } diff --git a/net/core/devmem.h b/net/core/devmem.h index 1c5c18581fcb..ffcf97a33633 100644 --- a/net/core/devmem.h +++ b/net/core/devmem.h @@ -20,6 +20,8 @@ struct net_devmem_dmabuf_binding { struct dma_buf_attachment *attachment; struct sg_table *sgt; struct net_device *dev; + /* Phys dev behind a virtual dev (e.g. netkit) with a queue lease. */ + struct net_device *real_tx_dev; struct gen_pool *chunk_pool; /* Protect dev */ struct mutex lock; @@ -84,7 +86,7 @@ struct dmabuf_genpool_chunk_owner { =20 void __net_devmem_dmabuf_binding_free(struct work_struct *wq); struct net_devmem_dmabuf_binding * -net_devmem_bind_dmabuf(struct net_device *dev, +net_devmem_bind_dmabuf(struct net_device *dev, struct net_device *real_tx_= dev, struct device *dma_dev, enum dma_data_direction direction, unsigned int dmabuf_fd, struct netdev_nl_sock *priv, @@ -165,7 +167,7 @@ static inline void net_devmem_put_net_iov(struct net_io= v *niov) } =20 static inline struct net_devmem_dmabuf_binding * -net_devmem_bind_dmabuf(struct net_device *dev, +net_devmem_bind_dmabuf(struct net_device *dev, struct net_device *real_tx_= dev, struct device *dma_dev, enum dma_data_direction direction, unsigned int dmabuf_fd, diff --git a/net/core/netdev-genl.c b/net/core/netdev-genl.c index 7d073894ca74..2b34924dc30f 100644 --- a/net/core/netdev-genl.c +++ b/net/core/netdev-genl.c @@ -1037,7 +1037,7 @@ int netdev_nl_bind_rx_doit(struct sk_buff *skb, struc= t genl_info *info) goto err_rxq_bitmap; } =20 - binding =3D net_devmem_bind_dmabuf(netdev, dma_dev, DMA_FROM_DEVICE, + binding =3D net_devmem_bind_dmabuf(netdev, NULL, dma_dev, DMA_FROM_DEVICE, dmabuf_fd, priv, info->extack); if (IS_ERR(binding)) { err =3D PTR_ERR(binding); @@ -1082,6 +1082,8 @@ int netdev_nl_bind_rx_doit(struct sk_buff *skb, struc= t genl_info *info) int netdev_nl_bind_tx_doit(struct sk_buff *skb, struct genl_info *info) { struct net_devmem_dmabuf_binding *binding; + struct net_device *real_tx_dev =3D NULL; + struct netdev_rx_queue *lease_rxq; struct netdev_nl_sock *priv; struct net_device *netdev; struct device *dma_dev; @@ -1089,6 +1091,7 @@ int netdev_nl_bind_tx_doit(struct sk_buff *skb, struc= t genl_info *info) struct sk_buff *rsp; int err =3D 0; void *hdr; + int i; =20 if (GENL_REQ_ATTR_CHECK(info, NETDEV_A_DEV_IFINDEX) || GENL_REQ_ATTR_CHECK(info, NETDEV_A_DMABUF_FD)) @@ -1124,16 +1127,41 @@ int netdev_nl_bind_tx_doit(struct sk_buff *skb, str= uct genl_info *info) goto err_unlock_netdev; } =20 - if (!netdev->netmem_tx) { + for (i =3D 0; i < netdev->real_num_rx_queues; i++) { + lease_rxq =3D READ_ONCE(__netif_get_rx_queue(netdev, i)->lease); + + if (!lease_rxq) + continue; + + real_tx_dev =3D lease_rxq->dev; + break; + } + + if (real_tx_dev) { + if (!netif_device_present(real_tx_dev)) { + err =3D -ENODEV; + goto err_unlock_netdev; + } + + if (!real_tx_dev->netmem_tx) { + err =3D -EOPNOTSUPP; + NL_SET_ERR_MSG(info->extack, + "Driver for queue lease device does not support netmem TX"); + goto err_unlock_netdev; + } + } + + if (!real_tx_dev && !netdev->netmem_tx) { err =3D -EOPNOTSUPP; NL_SET_ERR_MSG(info->extack, "Driver does not support netmem TX"); goto err_unlock_netdev; } =20 - dma_dev =3D netdev_queue_get_dma_dev(netdev, 0); - binding =3D net_devmem_bind_dmabuf(netdev, dma_dev, DMA_TO_DEVICE, - dmabuf_fd, priv, info->extack); + dma_dev =3D netdev_queue_get_dma_dev(real_tx_dev ?: netdev, 0); + binding =3D net_devmem_bind_dmabuf(netdev, real_tx_dev, dma_dev, + DMA_TO_DEVICE, dmabuf_fd, priv, + info->extack); if (IS_ERR(binding)) { err =3D PTR_ERR(binding); goto err_unlock_netdev; --=20 2.52.0 From nobody Tue Apr 7 01:19:01 2026 Received: from mail-yw1-f173.google.com (mail-yw1-f173.google.com [209.85.128.173]) (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 03640374197 for ; Mon, 16 Mar 2026 22:29:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773700167; cv=none; b=YscTnm3J+AYYyTERjfBWRd9W+O4UChxAuiQg3+cwhOP2Gx9IK7AgbWN8ARseZcM8SKabl4tKVQAoUyeuiaWLsz2a5XHNQuJk5FIpJhxZwH2IkTf7RXtWsMDxMLkwDAFnhGxmlqifqZmZlsd8UoIbeAAG5tITmWJ3mjvDFR+QqsE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773700167; c=relaxed/simple; bh=jyNxYmx5UB2XwVBzrPIt/v521XrQK8jWoaatFoXioqs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=epJV1GkmK3/6GZJdbWJdbKiSAEDlkZuMMGIUqQgIqZLpkZP62SM8HTV5SNnbpFBBzrsVPAx7r51+/PGE5/yIxpeX20s/4OeNA4O0FOp91gRfbyP3taY62ndiNFW76NSrIDfpanZVUizyLuUz0TUs1h9O3SRjoJdiMkzOPdQWEbM= 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=XMn9rRFa; arc=none smtp.client-ip=209.85.128.173 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="XMn9rRFa" Received: by mail-yw1-f173.google.com with SMTP id 00721157ae682-79860421382so45587517b3.0 for ; Mon, 16 Mar 2026 15:29:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773700163; x=1774304963; 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=omed2F+AqWiwSMzDcFuf7st7hlR6TZL1wyoNIJPdTr0=; b=XMn9rRFal8dlvd7EaX0AqXe5plw4ois8LmhTEgSEDmwkYClkt+Pd9SFtojlgWOBOm/ tucB/NyVFiglUhpi/tqaiY8JATMVWzzp80oERakv557SKHU0pTOeEn/KkrIMFi2qWj8l tPfai8Z9vngm80FYz3ni50W3vdoQ1cZ3tq1loIZSb9/myJJdvMOwJSKICCTFA8+RXKFc fa2Gb7USJGm6RbR/bRz2xUBEN33yOkpHfq75+EK1jAyh5XaXOLJM7K6gy3QM+BNHiXO3 I9Wj9fvGATzEPyflcEALH4rhjtiEgS5g1R1Zgfh99A2UiNjBcIAEq+KHn5wTC0j92Qrm fBfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773700163; x=1774304963; 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=omed2F+AqWiwSMzDcFuf7st7hlR6TZL1wyoNIJPdTr0=; b=sH/x+QeR2vHAnOXEPMDz/ZNrJw2d3U0fXRcCWPA8v8FF/acFHUobbwuS8ok9Oyp1bU 7fuZas2Y+bNaW1dSKQLnPEkkSsjsbF9TKvp/QLdk5gSE+R9syjcOPUWHxXrHARtwd5q0 SkqYIUoGcotG25R8adHmx/OrFiCvCD5zpDacLnLFKnsq/x2YmV2R+EorjodTIqRLsCtf ppybaHzYDRhPorH5z6GXxYFoUMRn0/sqcOQ8Sh2l8o7Grt5MKbKgH+T/SKqUsHsPp3n2 t1rtDEjsUeCsNI6+bRvmT4fIKoUg/sQK8gOJbWm/gVi/rc/laPUkPdoGpbLWU6Zl2KF/ v1Fw== X-Forwarded-Encrypted: i=1; AJvYcCWa8Y6QWn+Q4ZmikZr3IxLsSILW5uPctS3W1+q5xbhB9OEZQDTqbuKFc9rFcjx9CmdPyuRR+znkDxPv6JA=@vger.kernel.org X-Gm-Message-State: AOJu0YwnDjZU2wKXVmlrhV04rHZzAxzI6imyO+n/s3Jgf/4U0yd7+peK ZWIYzuNBRKdQYouJEpVB2AjLaHvKVuAwnpluP+foSyn5xhKdjIQq4Ud6 X-Gm-Gg: ATEYQzzq06qKEP/QOyCUVS3TagWDMeungxzhgk8pM1rUU+J+gI0DqRmfEtChCtedA9a x0cB4yuU33gpC6l4YHOIAZE0vO+hyuugoS9dCdmkuMD7PCUrN3F//e52NidrxSXxOjF+IsOnBUS qwU5kB0jJ2gWnKKu10P5HyQYWsAqaDqHAI/d85vOEgISIo8qnzOwWmT8axKO71dZoglrLbsHSRe Cgk3ZIoTRF5Ttr+Mf5DBHAOm9s6O+JHDv/qLSFjcVxOTfppaMhqR0ua3KdAqFBCnlh4r3zgFaZl OH5vxxuFhSCmj1AHJi5YoTCMvV/fdGM1ko95LSHblnJr8Czz1QMOC2otk6k44Gzkf8eczeqkpmD b9hiu6JOxa3HGBHFfy0Zo+ERulmmVAoxkZWeLRJ3sUx2OEJ9pqjhol5+AvXUDw/imYI7GyStyO1 vWZqfhZFvG5MNdblN1evOmwg== X-Received: by 2002:a05:690c:81:b0:79a:3a79:a4b5 with SMTP id 00721157ae682-79a3a79b4eamr90331507b3.11.1773700162705; Mon, 16 Mar 2026 15:29:22 -0700 (PDT) Received: from localhost ([2a03:2880:25ff:5b::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-79917deb69asm92905497b3.10.2026.03.16.15.29.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Mar 2026 15:29:22 -0700 (PDT) From: Bobby Eshleman Date: Mon, 16 Mar 2026 15:29:13 -0700 Subject: [PATCH net-next 2/6] selftests: drv-net: extract _find_bss_map_id helper in NetDrvContEnv Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260316-scratch-bobbyeshleman-tcp-dm-netkit5-v1-2-b53c8cd72b23@meta.com> References: <20260316-scratch-bobbyeshleman-tcp-dm-netkit5-v1-0-b53c8cd72b23@meta.com> In-Reply-To: <20260316-scratch-bobbyeshleman-tcp-dm-netkit5-v1-0-b53c8cd72b23@meta.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Andrew Lunn , Shuah Khan Cc: Stanislav Fomichev , Mina Almasry , Wei Wang , David Wei , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, bpf@vger.kernel.org, Bobby Eshleman X-Mailer: b4 0.14.3 From: Bobby Eshleman Factor out a _find_bss_map_id() helper from _attach_bpf() so it can be reused by other BPF attachment methods. This will be used by subsequent patches in this series that add support for netkit devmem TX testing. No functional change to existing tests. Signed-off-by: Bobby Eshleman --- tools/testing/selftests/drivers/net/lib/py/env.py | 21 ++++++++++---------= -- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/tools/testing/selftests/drivers/net/lib/py/env.py b/tools/test= ing/selftests/drivers/net/lib/py/env.py index ccff345fe1c1..08e90448f48d 100644 --- a/tools/testing/selftests/drivers/net/lib/py/env.py +++ b/tools/testing/selftests/drivers/net/lib/py/env.py @@ -467,6 +467,15 @@ class NetDrvContEnv(NetDrvEpEnv): return (bpf['pref'], bpf['options']['prog']['id']) raise Exception("Failed to get BPF prog ID") =20 + def _find_bss_map_id(self, prog_id): + """Find the .bss map ID for a loaded BPF program.""" + prog_info =3D bpftool(f"prog show id {prog_id}", json=3DTrue) + for map_id in prog_info.get("map_ids", []): + map_info =3D bpftool(f"map show id {map_id}", json=3DTrue) + if map_info.get("name", "").endswith("bss"): + return map_id + raise Exception(f"Failed to find .bss map for prog {prog_id}") + def _attach_bpf(self): bpf_obj =3D self.test_dir / "nk_forward.bpf.o" if not bpf_obj.exists(): @@ -478,17 +487,7 @@ class NetDrvContEnv(NetDrvEpEnv): self._tc_attached =3D True =20 (self._bpf_prog_pref, self._bpf_prog_id) =3D self._get_bpf_prog_id= s() - prog_info =3D bpftool(f"prog show id {self._bpf_prog_id}", json=3D= True) - map_ids =3D prog_info.get("map_ids", []) - - bss_map_id =3D None - for map_id in map_ids: - map_info =3D bpftool(f"map show id {map_id}", json=3DTrue) - if map_info.get("name").endswith("bss"): - bss_map_id =3D map_id - - if bss_map_id is None: - raise Exception("Failed to find .bss map") + bss_map_id =3D self._find_bss_map_id(self._bpf_prog_id) =20 ipv6_addr =3D ipaddress.IPv6Address(self.ipv6_prefix) ipv6_bytes =3D ipv6_addr.packed --=20 2.52.0 From nobody Tue Apr 7 01:19:01 2026 Received: from mail-yx1-f44.google.com (mail-yx1-f44.google.com [74.125.224.44]) (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 B34A937269F for ; Mon, 16 Mar 2026 22:29:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773700168; cv=none; b=glKmkj9pN/bCVDqPRP0FFrdDsekt/XEU/Qh9SFEFLxT3mKTaUSDRZosfGRP0TINwvD0xynTvbwZAh3VAE63w1WVxnrObEmm8Z1k9l3/H9P/UQRabq1v9nCGZ1KqRqIsFEIa3yl7upQ2uWE5DVn0qsE5BIa/xcyG8XvCX7uFHTNg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773700168; c=relaxed/simple; bh=/P0d+nw6nfgOf/J+mWp3OvTpE+gexpCsKViZnKl4q1U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YztKFaZ9GFgnuTw3S9sK3A8eMGF56yYutfW/rr7kln9hYXx28AR7WhQZGwlPvmAUETVGfWsQ+LQP58e0yGPDWgqGCDQXegzv+AP+o+XtoKdIPQ0tvf3DI1cCsjzYe0gyTqIKcgiv/ykkUzU5d05RTIdysVaSJxWzKp+tlROSQio= 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=QAqOjnGG; arc=none smtp.client-ip=74.125.224.44 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="QAqOjnGG" Received: by mail-yx1-f44.google.com with SMTP id 956f58d0204a3-64ca2b32f46so3924857d50.3 for ; Mon, 16 Mar 2026 15:29:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773700163; x=1774304963; 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=S96bHHsurulXmzp5TnD3Oxl/rMQZJqmo/NVotofYdL8=; b=QAqOjnGG0Jv2OURrXwx7PmcDsowNCIK0MRaxWCN6KFwiag+AaCAw1Cf5WGo8N33byL 4s4eHKURikLcxJ9LFDzULH3YOfKLg3LGBAoiKTwrB3rBlBbl5GXU6xmOIjmZOHXozb/R JLWWf5uT+FoUNeLVgMYFl9VgllYkQKjIDJbACYNL+ct2der+FYRYI4+6ywMcusyEYyJT bb6t6TO41s/afoJveIB2x6db6mIqIDT6ouH0whvqw0h9gFGR5InF79IFV2veFr0RsHYY CKXaI1r7LX2d5VxV6xVSyncJgVZAVrBS1slXdF/vYWXInwUGoqD2GVHxzldNBAALQXUx IIrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773700163; x=1774304963; 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=S96bHHsurulXmzp5TnD3Oxl/rMQZJqmo/NVotofYdL8=; b=aVWgxiVGMYjv6xkUoqGEXK0oaAbvzrA5I5LT3raAcezIxEEYKoDrBzci4UEJrmkPGm x8pce/JT7veR2PNqC9Q0YQQQNpdzoXzg+d7TJxmpaJU0qbmoyByH2osnoeZpaDn8JqTR 0+qojeO5vUKYY24xEqePIRmkZDX0/mpuOs1ytGqFexvRHczDEhN9GXpQt8Xrmxye17cv mPz4X0eE+NpHVeK0grgaEWFjMy+MZplSgqTnL7RK2AhTHyCeCrWt5QIyoql8Lo2EzC2r yvTfbmwG30Wg4mExd4e4fJ/g/0iyx5PHSxpWkvTXNPfceHNUz1FY9K5JttT/ajTWygln 0Sww== X-Forwarded-Encrypted: i=1; AJvYcCVrAAXmKb/+NnH78NtYa4Iyg9ggy+mkvtt2fVLgZzOkGAz4lu172pcivNeQW42IzLstcMc19LeJmqplZTw=@vger.kernel.org X-Gm-Message-State: AOJu0YymhWG39ULh5prbbxmmQpQn3D+7UvrELjFhdfhjIjbSjsdUnoSH S9bw9kn6cvngjPzqIbGkL4cHWZ2lGUll3lteFbyExAPtkDvx9maQwt9G X-Gm-Gg: ATEYQzxEJrqrhWrFISdC98iRbELCrP4QpKDiBep8/n9jlXV5TatGGlhkDdOtB6mMzYs OuR0XLsoQAv3/3JVyxTcinXyHSoFVQv1xPpunjKvIENZxBuamc8n/fe45jKnFmj+SgXTCNVuAKy 8+uV6G7sP6kFEP3yHBcVr5IhSXm1iLGgBQGrdif1o7jD3dedlsEWt1e5p08A3gqO6gdpY+NZ2cw jlzUloyfk9yQkzonHq7B1z1PtGxBLRqXOt8AMYHde/oTM0vh5wzz45dLy/QeFRKYlijzsb9/iN7 VKMAr6IWHUKEkZGj0bwIow0P2cpm2s7rOQTTJjUHSIXgHzNYbgHUdJvQ7MaoXU6fVZumhEZ07OE 3FBELo4XPnox5ikEa+NbE5rfHGMfPpMBeNyjSQLX32ao/18JxdICweUgwiEmVROmTWH2DhUxtK8 2RKtfITjR3Z03ur7Zxon4aOQ== X-Received: by 2002:a53:7404:0:b0:64c:97ae:2e75 with SMTP id 956f58d0204a3-64e6309ab39mr10701854d50.69.1773700163558; Mon, 16 Mar 2026 15:29:23 -0700 (PDT) Received: from localhost ([2a03:2880:25ff:4a::]) by smtp.gmail.com with ESMTPSA id 956f58d0204a3-64e65a3bedcsm6286875d50.1.2026.03.16.15.29.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Mar 2026 15:29:23 -0700 (PDT) From: Bobby Eshleman Date: Mon, 16 Mar 2026 15:29:14 -0700 Subject: [PATCH net-next 3/6] selftests: drv-net: add skip-config flag to ncdevmem Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260316-scratch-bobbyeshleman-tcp-dm-netkit5-v1-3-b53c8cd72b23@meta.com> References: <20260316-scratch-bobbyeshleman-tcp-dm-netkit5-v1-0-b53c8cd72b23@meta.com> In-Reply-To: <20260316-scratch-bobbyeshleman-tcp-dm-netkit5-v1-0-b53c8cd72b23@meta.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Andrew Lunn , Shuah Khan Cc: Stanislav Fomichev , Mina Almasry , Wei Wang , David Wei , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, bpf@vger.kernel.org, Bobby Eshleman X-Mailer: b4 0.14.3 From: Bobby Eshleman Add a -n flag to ncdevmem that skips hardware configuration (header split, RSS, flow steering). This is needed when ncdevmem is run inside a netkit namespace where hardware configuration is managed externally by the test harness. When -n is set, ncdevmem skips configure_headersplit(), configure_rss(), and configure_flow_steering(). The calling environment is expected to perform this setup prior to invoking ncdevmem. This is used in subsequent patches of this series that bring up netkit devmem TX testing. ncdevmem will only have access to the netkit inside the namespace, and not the physical device. Therefore, in those tests, the test harness itself does the physical device setup. Signed-off-by: Bobby Eshleman --- tools/testing/selftests/drivers/net/hw/ncdevmem.c | 58 +++++++++++++------= ---- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/tools/testing/selftests/drivers/net/hw/ncdevmem.c b/tools/test= ing/selftests/drivers/net/hw/ncdevmem.c index e098d6534c3c..d96e8a3b5a65 100644 --- a/tools/testing/selftests/drivers/net/hw/ncdevmem.c +++ b/tools/testing/selftests/drivers/net/hw/ncdevmem.c @@ -93,6 +93,7 @@ static char *port; static size_t do_validation; static int start_queue =3D -1; static int num_queues =3D -1; +static int skip_config; static char *ifname; static unsigned int ifindex; static unsigned int dmabuf_id; @@ -828,7 +829,7 @@ static struct netdev_queue_id *create_queues(void) =20 static int do_server(struct memory_buffer *mem) { - struct ethtool_rings_get_rsp *ring_config; + struct ethtool_rings_get_rsp *ring_config =3D NULL; char ctrl_data[sizeof(int) * 20000]; size_t non_page_aligned_frags =3D 0; struct sockaddr_in6 client_addr; @@ -851,27 +852,29 @@ static int do_server(struct memory_buffer *mem) return -1; } =20 - ring_config =3D get_ring_config(); - if (!ring_config) { - pr_err("Failed to get current ring configuration"); - return -1; - } + if (!skip_config) { + ring_config =3D get_ring_config(); + if (!ring_config) { + pr_err("Failed to get current ring configuration"); + return -1; + } =20 - if (configure_headersplit(ring_config, 1)) { - pr_err("Failed to enable TCP header split"); - goto err_free_ring_config; - } + if (configure_headersplit(ring_config, 1)) { + pr_err("Failed to enable TCP header split"); + goto err_free_ring_config; + } =20 - /* Configure RSS to divert all traffic from our devmem queues */ - if (configure_rss()) { - pr_err("Failed to configure rss"); - goto err_reset_headersplit; - } + /* Configure RSS to divert all traffic from our devmem queues */ + if (configure_rss()) { + pr_err("Failed to configure rss"); + goto err_reset_headersplit; + } =20 - /* Flow steer our devmem flows to start_queue */ - if (configure_flow_steering(&server_sin)) { - pr_err("Failed to configure flow steering"); - goto err_reset_rss; + /* Flow steer our devmem flows to start_queue */ + if (configure_flow_steering(&server_sin)) { + pr_err("Failed to configure flow steering"); + goto err_reset_rss; + } } =20 if (bind_rx_queue(ifindex, mem->fd, create_queues(), num_queues, &ys)) { @@ -1052,13 +1055,17 @@ static int do_server(struct memory_buffer *mem) err_unbind: ynl_sock_destroy(ys); err_reset_flow_steering: - reset_flow_steering(); + if (!skip_config) + reset_flow_steering(); err_reset_rss: - reset_rss(); + if (!skip_config) + reset_rss(); err_reset_headersplit: - restore_ring_config(ring_config); + if (!skip_config) + restore_ring_config(ring_config); err_free_ring_config: - ethtool_rings_get_rsp_free(ring_config); + if (!skip_config) + ethtool_rings_get_rsp_free(ring_config); return err; } =20 @@ -1404,7 +1411,7 @@ int main(int argc, char *argv[]) int is_server =3D 0, opt; int ret, err =3D 1; =20 - while ((opt =3D getopt(argc, argv, "Lls:c:p:v:q:t:f:z:")) !=3D -1) { + while ((opt =3D getopt(argc, argv, "Lls:c:p:v:q:t:f:z:n")) !=3D -1) { switch (opt) { case 'L': fail_on_linear =3D true; @@ -1436,6 +1443,9 @@ int main(int argc, char *argv[]) case 'z': max_chunk =3D atoi(optarg); break; + case 'n': + skip_config =3D 1; + break; case '?': fprintf(stderr, "unknown option: %c\n", optopt); break; --=20 2.52.0 From nobody Tue Apr 7 01:19:01 2026 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 764EE373C02 for ; Mon, 16 Mar 2026 22:29:25 +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=1773700170; cv=none; b=KxVM5O4Tk+rLtFyIzObi2tFi0/osRtHx4MPlfIlCNQK8BDcInFHyi0+nVZ6II/1HNGkr6zKJhA5NNVebX0pdI1plQh7tO4AGyIScDRPU9AWblxQBaUomGHoD3gTAFpR8Pc4Z6TSFhbunl5vcjBM8NtzBwNoWBjtzGJoAyiZzizM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773700170; c=relaxed/simple; bh=gPQdSLHqgxDCRlTaUp4gDb596s3Bu8ry/823mecq5og=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jPydkIya5kvrRSkhXOPZKE/gpgh5HsL/mBzQD8uvcQSFBI3SfRCa03ugJU6r7m2JoUdH2HTSbV8Tr0iy1SKoxDhQ8P9m+JyOtBxsc9hT+s6+MskuVGzvuZGj3wDh/qNHjVDpPE8cti8h6Dtqj+wtAdl1v0AJJJ6uObfZlTBZ28Y= 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=AIHoMSei; 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="AIHoMSei" Received: by mail-yx1-f43.google.com with SMTP id 956f58d0204a3-64aedd812baso5078087d50.3 for ; Mon, 16 Mar 2026 15:29:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773700164; x=1774304964; 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=xYnevcqjsWNhoFXHuzMgmlhvEe4roXm2EbEcJEFKLu8=; b=AIHoMSeieDYr+bk4oEBBPZCcyzXRFm2aq8681FdDcs8TNwx4yWrhn1TxluOrsbwM2l Leptb2DSSpAa/bmQCnfy2QlyiqhkqDnFwis3t0TYLCKYLckc4w0bfU5zSLTx3EzqAwNw 1jECWiEwiGTUjci0NwlcA+29RZNi65i51pU+JIJLSzzcfEHunbu16mGkJl0t1kyc7mqn 4Y0qcapJCWSkgfQrEEoHjwKTMM5M8/OgLK1SWy8VbWkF9TQE+4HENFS9IPh2A58WOoJx 6rwv6F1KmxQmop+Stn0red1lwOXHwTpi9+uzGsS4avpz1hD9/B10rv7tI9OwnMBAkts1 IvRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773700164; x=1774304964; 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=xYnevcqjsWNhoFXHuzMgmlhvEe4roXm2EbEcJEFKLu8=; b=NI56ruOVk9yoCS0Q660dbGxPfxnu6Sv3kCjh+ORDZ7G9gLmrm+y7Ulj3NZ1YIGA6OM 7QaB2fpZ4RjJj+nou7BI/W4TEG/CdNGuKqdfm89ugzrKQ4d9pXMJCvjudUAh2yM0nehL 8F1XOin3iMwEs8cGKPk4dnCfvL1hlao3/cTCA4Cst1/vRSSNsRfRlCHohJKjeR5To7cl st7s/7VmuGWiMABUs6lLn7ZUG5J7iczuCiTtwU+uGxy/P9FEgX6x51GryLgxoclJ1yVF O2abs/Dibyb0/Cyx2E3t/PDmHAVzkYddtEV56zm+zvpQH5NsuGLegGwGaoSUxRtEl9/h P/+w== X-Forwarded-Encrypted: i=1; AJvYcCVBY15shf94gBQrR6ZniCY7iS7txJxtSVpYCzMArqYNzOq2tSwgGPTLc71idkeNIayy+3S1MB/xeSSwIkk=@vger.kernel.org X-Gm-Message-State: AOJu0Yz6lWLxFLb3vmVNb9wsqiISLU1h/MMoKRqrqT9/nbOXVZd6M77q tcri1WDK5CA5SzuUEdobSlxR6fyhMxKy1dlqIdCR7x/ORFqaFSGLW7d6 X-Gm-Gg: ATEYQzyGOLiBY7CkE+X9PxvYeyVDDiH6jOo3HOS/Qg+J89TBQ5WKdTw2Q5uNnAL9gWD zMDBx80Uu549QO3BGM1P252ycJoqxSIg1Bmd+ilftZx39s5UozcX4jsUhSTK2nxRUE9SYIZFDEW 2DRFtYrlOrsROIFLx6YmqClSetKSPPwdLaDjxLJKRiuPlGmE/RN7fqgOXiY43GLOY+XPcX3UtBZ i+o5aEEhSB3CF7TKXPTGaWaPUUFrBCIWzorV+enSROM/9+sz5sQvOsvk2yq3ABLHbfoYtp/0aLQ tBgoA61imttNd2TuXkwQiFWA1b9BPYFDQ/3zIHChMKySkIxptf4HywfBs/KZ1ywqHWvtR9du+ga h1j6MSJWnQTWvpe+zriDDNwnontd3WPf0gMWpnQGHbJgz/gv1fAdbmPhDT64jYhZ4f2PEYG2+FU zNW6NjiM1LVycv4xRcuqIb X-Received: by 2002:a05:690c:201c:b0:79a:55f5:a3fa with SMTP id 00721157ae682-79a55f5ecabmr26736657b3.20.1773700164261; Mon, 16 Mar 2026 15:29:24 -0700 (PDT) Received: from localhost ([2a03:2880:25ff:8::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-79917ee5757sm96813577b3.31.2026.03.16.15.29.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Mar 2026 15:29:24 -0700 (PDT) From: Bobby Eshleman Date: Mon, 16 Mar 2026 15:29:15 -0700 Subject: [PATCH net-next 4/6] selftests: drv-net: add primary RX redirect support to NetDrvContEnv Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260316-scratch-bobbyeshleman-tcp-dm-netkit5-v1-4-b53c8cd72b23@meta.com> References: <20260316-scratch-bobbyeshleman-tcp-dm-netkit5-v1-0-b53c8cd72b23@meta.com> In-Reply-To: <20260316-scratch-bobbyeshleman-tcp-dm-netkit5-v1-0-b53c8cd72b23@meta.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Andrew Lunn , Shuah Khan Cc: Stanislav Fomichev , Mina Almasry , Wei Wang , David Wei , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, bpf@vger.kernel.org, Bobby Eshleman X-Mailer: b4 0.14.3 From: Bobby Eshleman Add a primary_rx_redirect parameter to NetDrvContEnv that enables a BPF tc program (nk_primary_rx_redirect.bpf.c) on the primary netkit ingress. This program redirects traffic to the physical NIC via bpf_redirect_neigh(), while letting ICMPv6 through for neighbor discovery. This will be used by the devmem netkit TX tests where the nk peer is sending to the nk primary for redirection to the physical NIC. Signed-off-by: Bobby Eshleman --- tools/testing/selftests/drivers/net/hw/.gitignore | 1 + .../drivers/net/hw/nk_primary_rx_redirect.bpf.c | 41 ++++++++++++++++++= ++++ tools/testing/selftests/drivers/net/lib/py/env.py | 39 ++++++++++++++++++= +- 3 files changed, 80 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/drivers/net/hw/.gitignore b/tools/test= ing/selftests/drivers/net/hw/.gitignore index 46540468a775..3e5c51f8e1c7 100644 --- a/tools/testing/selftests/drivers/net/hw/.gitignore +++ b/tools/testing/selftests/drivers/net/hw/.gitignore @@ -1,4 +1,5 @@ # SPDX-License-Identifier: GPL-2.0-only iou-zcrx ncdevmem +nk_primary_rx_redirect toeplitz diff --git a/tools/testing/selftests/drivers/net/hw/nk_primary_rx_redirect.= bpf.c b/tools/testing/selftests/drivers/net/hw/nk_primary_rx_redirect.bpf.c new file mode 100644 index 000000000000..fe3c127a4fd0 --- /dev/null +++ b/tools/testing/selftests/drivers/net/hw/nk_primary_rx_redirect.bpf.c @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include + +#define TC_ACT_OK 0 +#define ETH_P_IPV6 0x86DD +#define IPPROTO_ICMPV6 58 + +#define ctx_ptr(field) ((void *)(long)(field)) + +volatile __u32 phys_ifindex; + +SEC("tc/ingress") +int nk_primary_rx_redirect(struct __sk_buff *skb) +{ + void *data_end =3D ctx_ptr(skb->data_end); + void *data =3D ctx_ptr(skb->data); + struct ethhdr *eth; + struct ipv6hdr *ip6h; + + eth =3D data; + if ((void *)(eth + 1) > data_end) + return TC_ACT_OK; + + if (eth->h_proto !=3D bpf_htons(ETH_P_IPV6)) + return TC_ACT_OK; + + ip6h =3D data + sizeof(struct ethhdr); + if ((void *)(ip6h + 1) > data_end) + return TC_ACT_OK; + + if (ip6h->nexthdr =3D=3D IPPROTO_ICMPV6) + return TC_ACT_OK; + + return bpf_redirect_neigh(phys_ifindex, NULL, 0, 0); +} + +char __license[] SEC("license") =3D "GPL"; diff --git a/tools/testing/selftests/drivers/net/lib/py/env.py b/tools/test= ing/selftests/drivers/net/lib/py/env.py index 08e90448f48d..e124b9c7c95c 100644 --- a/tools/testing/selftests/drivers/net/lib/py/env.py +++ b/tools/testing/selftests/drivers/net/lib/py/env.py @@ -327,12 +327,13 @@ class NetDrvContEnv(NetDrvEpEnv): +---------------+ """ =20 - def __init__(self, src_path, rxqueues=3D1, **kwargs): + def __init__(self, src_path, rxqueues=3D1, primary_rx_redirect=3DFalse= , **kwargs): self.netns =3D None self._nk_host_ifname =3D None self._nk_guest_ifname =3D None self._tc_clsact_added =3D False self._tc_attached =3D False + self._primary_rx_redirect_attached =3D False self._bpf_prog_pref =3D None self._bpf_prog_id =3D None self._init_ns_attached =3D False @@ -387,8 +388,14 @@ class NetDrvContEnv(NetDrvEpEnv): =20 self._setup_ns() self._attach_bpf() + if primary_rx_redirect: + self._attach_primary_rx_redirect_bpf() =20 def __del__(self): + if self._primary_rx_redirect_attached: + cmd(f"tc qdisc del dev {self._nk_host_ifname} clsact", fail=3D= False) + self._primary_rx_redirect_attached =3D False + if self._tc_attached: cmd(f"tc filter del dev {self.ifname} ingress pref {self._bpf_= prog_pref}") self._tc_attached =3D False @@ -450,6 +457,8 @@ class NetDrvContEnv(NetDrvEpEnv): ip(f"-6 addr add {self.nk_guest_ipv6}/64 dev {self._nk_guest_ifnam= e} nodad", ns=3Dself.netns) ip(f"-6 route add default via fe80::1 dev {self._nk_guest_ifname}"= , ns=3Dself.netns) =20 + ip(f"-6 route add {self.nk_guest_ipv6}/128 via {self.addr_v['6']}"= , host=3Dself.remote) + def _tc_ensure_clsact(self): qdisc =3D json.loads(cmd(f"tc -j qdisc show dev {self.ifname}").st= dout) for q in qdisc: @@ -495,3 +504,31 @@ class NetDrvContEnv(NetDrvEpEnv): value =3D ipv6_bytes + ifindex_bytes value_hex =3D ' '.join(f'{b:02x}' for b in value) bpftool(f"map update id {bss_map_id} key hex 00 00 00 00 value hex= {value_hex}") + + def _attach_primary_rx_redirect_bpf(self): + """Attach BPF redirect program on the primary netkit ingress.""" + bpf_obj =3D self.test_dir / "nk_primary_rx_redirect.bpf.o" + if not bpf_obj.exists(): + raise KsftSkipEx("Primary RX redirect BPF prog not found") + + cmd(f"tc qdisc add dev {self._nk_host_ifname} clsact") + cmd(f"tc filter add dev {self._nk_host_ifname} ingress" + f" bpf obj {bpf_obj} sec tc/ingress direct-action") + self._primary_rx_redirect_attached =3D True + + filters =3D json.loads( + cmd(f"tc -j filter show dev {self._nk_host_ifname} ingress").s= tdout) + redirect_prog_id =3D None + for bpf in filters: + if 'options' not in bpf: + continue + if bpf['options']['bpf_name'].startswith('nk_primary_rx_redire= ct'): + redirect_prog_id =3D bpf['options']['prog']['id'] + break + if redirect_prog_id is None: + raise Exception("Failed to get primary RX redirect BPF prog ID= ") + + bss_map_id =3D self._find_bss_map_id(redirect_prog_id) + phys_ifindex_bytes =3D self.ifindex.to_bytes(4, byteorder=3D'littl= e') + value_hex =3D ' '.join(f'{b:02x}' for b in phys_ifindex_bytes) + bpftool(f"map update id {bss_map_id} key hex 00 00 00 00 value hex= {value_hex}") --=20 2.52.0 From nobody Tue Apr 7 01:19:01 2026 Received: from mail-yx1-f47.google.com (mail-yx1-f47.google.com [74.125.224.47]) (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 7DED8372EC4 for ; Mon, 16 Mar 2026 22:29:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773700172; cv=none; b=u0vv35NWFG1s8Xlm8YoxDo1wpc3JFIcZjU/0ug4YBHBFQtOC22IBc6qzi4eqKU8Mu4C7TlgdU0QwZ7T8vxR1knySglXEnzMWRfcqYnmbQzJaLtmUWH1soo2ae5gMQFzHIf3m9Vaf/5WPk7rzMti6IbTHXHsiS2Oq8vThek6gEv0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773700172; c=relaxed/simple; bh=TJUE0YZjr8qS29hN4Kb3HPMI9J1uBFgP4u2/cCl3Stc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=R7ZJn0kofD2MZgdTCC+RJVHOgYkFx8cBwPSWn2of5I4oJuBdnsMaZbbeDvjOCuJhd5NNdSu81NeqzHNmwZ2P2wI/f1FHYK7DDddoCf5dZsn1zGTD577hT1ROokxo8MEPn3eXRcBTl8trFtr3l3/6haxC0s+9MIvhHv9uf2NUJwM= 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=CSxB1vks; arc=none smtp.client-ip=74.125.224.47 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="CSxB1vks" Received: by mail-yx1-f47.google.com with SMTP id 956f58d0204a3-64c31ca77b4so5358125d50.2 for ; Mon, 16 Mar 2026 15:29:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773700165; x=1774304965; 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=UGzDBYrNGuehuWC5MjFuZIsLcoMWVRHHpRI2TFaYui0=; b=CSxB1vks59K2mlLAR1MKdMupabTmhEcuKJINmIA2TYDqYnQ50JdcBj/gm0X+1OJhNb aRO+VBDLXdEXmH4PRKChwqIVEcJsYqY2o0hNVjAGudZcNoVUZ7Ks4C3d770r2Q9MUYY4 URRm244tZ4y1FS1udqfl3Aptvsj3koZG9cFV5gMfLMnew4n/9hZweANhGJnNJ7l1eU5T LvdpH9Z9JiYrW8jVMb7DUGaIyvWARbkELykizwBltzJKcQ57itdMU9xaqehFeB4Kd4GG lawhISLf1lBaK9JCYwIL+lOnX6CBmd4qlHUVMnBMhk4o88q2JxANfjMKXbq75ErOE4J6 NL+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773700165; x=1774304965; 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=UGzDBYrNGuehuWC5MjFuZIsLcoMWVRHHpRI2TFaYui0=; b=VxH6wOB3HSOlsmQC1TGgbGlFiDBVwvrCvoqw4aWi3612GzeXzRk/phgd9V4dW3sFpc MSsyF//Xk92JlHAs1HFOGjqGhsJ/Be0BuuWnLRSsUgzMzMQcfcxQGt5ckqCwteKkTc9I bdMwI8+OghGVE6ieCrwjP08h1FkQtebsWJr5mZGGHf7I0M9aD1jpXr9vBjYamo5bYgtB O0g6slfasWry+jWSGIK85fNxOz2bhRB2LXGvBPdNkCk3rWy102BSmt3d4N+aXmYfsVWK JUulSqTCj5Af+rnsSp+Wz9EdQhJx0PPliQwJhaeA+V+Qapek2HtF6Masyi5L3udvGyQM CSPw== X-Forwarded-Encrypted: i=1; AJvYcCV0sHnYy2h2kY04aikzvIPs+xjvoIdxrJ1RIaQOJPAjx03yuZkBrWmG2CEAPfmKWBtOQDeftcjaW+KzK2o=@vger.kernel.org X-Gm-Message-State: AOJu0YyquaChmYKQ/W6rn/EhmK3eoQe0KqgpZ2PTkEJ+3oKVmc4mMHb0 m5juut6qNfrEiffZyJ2bbWbNoZZquqBO0TgDNaAqNukvVdMOEnQ85zMP X-Gm-Gg: ATEYQzxoLm9jXVXlU4IcZCAQkePCdu1Nmmyd6fNbcHZoDUdC4gGcRLLSbBE3NHA03pz ubYtjph04gt5LEEQnKFwu7BZN2fZGAsa8qlyIfpWCaZ3sQb+JZaMskayqOryeIR8kakRJiGMuoM RR/+YnnKPlxcMD7PlHWXtrcp5ZAhZ9qxYQZ9J6fVojqlRd0NigQrEtpAblFOlBkNR3AHRHBd653 pFydbZObbqIRvQk9hyLohUAz7QFACuB8gvEuvFrO2QGvoFom1rwXhYf4IsuQmSsCASPalw9G+RD d+3ak5Q22a8x6c3Hd5bE73zbmEanmiTQrZ1prMXtsq6N2Bf7mj+jXrnvr3F0okZ4nFCK3qV73ZG Uz6jqdYMz0k6BY8uaZ+OEthvpuzxIe/jAfDkccO82prCe7VQU6RvCo/5FPWyGakqV5x1XGPoxVp wNUW+T5lReLmgmrS5i8Ibd X-Received: by 2002:a05:690e:448d:b0:649:b943:2caa with SMTP id 956f58d0204a3-64e6309cf75mr11816353d50.59.1773700164998; Mon, 16 Mar 2026 15:29:24 -0700 (PDT) Received: from localhost ([2a03:2880:25ff:c::]) by smtp.gmail.com with ESMTPSA id 956f58d0204a3-64e65a5411dsm6391196d50.9.2026.03.16.15.29.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Mar 2026 15:29:24 -0700 (PDT) From: Bobby Eshleman Date: Mon, 16 Mar 2026 15:29:16 -0700 Subject: [PATCH net-next 5/6] selftests: drv-net: add netkit devmem RX test Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260316-scratch-bobbyeshleman-tcp-dm-netkit5-v1-5-b53c8cd72b23@meta.com> References: <20260316-scratch-bobbyeshleman-tcp-dm-netkit5-v1-0-b53c8cd72b23@meta.com> In-Reply-To: <20260316-scratch-bobbyeshleman-tcp-dm-netkit5-v1-0-b53c8cd72b23@meta.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Andrew Lunn , Shuah Khan Cc: Stanislav Fomichev , Mina Almasry , Wei Wang , David Wei , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, bpf@vger.kernel.org, Bobby Eshleman X-Mailer: b4 0.14.3 From: Bobby Eshleman Add tests for devmem RX over a netkit device with a leased queue. This is the same as the other devmem RX test except for ncdevmem executes in a namespace, binds to a netkit, and skips the ethtool NIC configuration steps (relying on the test runner for that setup). The RX path is setup as the following: RX Path ------- Remote Physical NIC Netkit Host Netkit Guest (n= etns) | | | | |--- TCP send ------>| | | |-------------------->| | dmabuf |--- BPF redirect -->| Signed-off-by: Bobby Eshleman --- tools/testing/selftests/drivers/net/hw/Makefile | 1 + .../testing/selftests/drivers/net/hw/nk_devmem.py | 104 +++++++++++++++++= ++++ 2 files changed, 105 insertions(+) diff --git a/tools/testing/selftests/drivers/net/hw/Makefile b/tools/testin= g/selftests/drivers/net/hw/Makefile index 91df028abfc0..3cd68e06f592 100644 --- a/tools/testing/selftests/drivers/net/hw/Makefile +++ b/tools/testing/selftests/drivers/net/hw/Makefile @@ -32,6 +32,7 @@ TEST_PROGS =3D \ irq.py \ loopback.sh \ nic_timestamp.py \ + nk_devmem.py \ nk_netns.py \ pp_alloc_fail.py \ rss_api.py \ diff --git a/tools/testing/selftests/drivers/net/hw/nk_devmem.py b/tools/te= sting/selftests/drivers/net/hw/nk_devmem.py new file mode 100755 index 000000000000..0a66ff85db9d --- /dev/null +++ b/tools/testing/selftests/drivers/net/hw/nk_devmem.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0 +"""Test devmem TCP through netkit with queue leasing.""" + +import re +from os import path +from lib.py import ksft_run, ksft_exit, ksft_eq, KsftSkipEx +from lib.py import NetDrvContEnv, NetNSEnter, EthtoolFamily, NetdevFamily +from lib.py import bkg, cmd, defer, ethtool, rand_port, wait_port_listen + + +def set_flow_rule(cfg): + """Insert an ethtool flow rule steering traffic to the leased queue.""" + output =3D ethtool( + f"-N {cfg.ifname} flow-type tcp6 dst-port {cfg.port}" + f" action {cfg.src_queue}" + ).stdout + values =3D re.search(r'ID (\d+)', output).group(1) + return int(values) + + +def configure_nic(cfg): + """Common setup for devmem tests: channels, rings, RSS, queue lease.""" + cfg.require_ipver('6') + ethnl =3D EthtoolFamily() + + channels =3D ethnl.channels_get({'header': {'dev-index': cfg.ifindex}}) + channels =3D channels['combined-count'] + if channels < 2: + raise KsftSkipEx( + 'Test requires NETIF with at least 2 combined channels' + ) + + rings =3D ethnl.rings_get({'header': {'dev-index': cfg.ifindex}}) + rx_rings =3D rings['rx'] + hds_thresh =3D rings.get('hds-thresh', 0) + orig_data_split =3D rings.get('tcp-data-split', 'unknown') + + ethnl.rings_set({'header': {'dev-index': cfg.ifindex}, + 'tcp-data-split': 'enabled', + 'hds-thresh': 0, + 'rx': min(64, rx_rings)}) + defer(ethnl.rings_set, {'header': {'dev-index': cfg.ifindex}, + 'tcp-data-split': orig_data_split, + 'hds-thresh': hds_thresh, + 'rx': rx_rings}) + + cfg.src_queue =3D channels - 1 + ethtool(f"-X {cfg.ifname} equal {cfg.src_queue}") + defer(ethtool, f"-X {cfg.ifname} default") + + if hasattr(cfg, 'nk_queue'): + return + + with NetNSEnter(str(cfg.netns)): + netdevnl =3D NetdevFamily() + lease_result =3D netdevnl.queue_create( + { + "ifindex": cfg.nk_guest_ifindex, + "type": "rx", + "lease": { + "ifindex": cfg.ifindex, + "queue": {"id": cfg.src_queue, "type": "rx"}, + "netns-id": 0, + }, + } + ) + cfg.nk_queue =3D lease_result['id'] + + +def test_devmem(cfg) -> None: + """Test devmem RX: send from remote, receive on netkit guest.""" + configure_nic(cfg) + + flow_rule_id =3D set_flow_rule(cfg) + defer(ethtool, f"-N {cfg.ifname} delete {flow_rule_id}") + + rx_cmd =3D (f"ip netns exec {cfg.netns.name} {cfg.bin_local}" + f" -l -f {cfg._nk_guest_ifname} -s {cfg.nk_guest_ipv6}" + f" -p {cfg.port} -t {cfg.nk_queue} -q 1 -v 7 -n") + socat =3D f"socat -u - TCP6:[{cfg.nk_guest_ipv6}]:{cfg.port}" + + with bkg(rx_cmd, exit_wait=3DTrue) as ncdevmem_rx: + wait_port_listen(cfg.port, proto=3D"tcp", ns=3Dcfg.netns) + cmd(f"yes $(echo -e \x01\x02\x03\x04\x05\x06) | head -c 1K" + f" | {socat}", + host=3Dcfg.remote, shell=3DTrue) + + ksft_eq(ncdevmem_rx.ret, 0) + + +def main() -> None: + """Run netkit devmem tests.""" + with NetDrvContEnv(__file__, rxqueues=3D2) as cfg: + cfg.bin_local =3D path.abspath( + path.dirname(__file__) + "/ncdevmem" + ) + cfg.port =3D rand_port() + ksft_run([test_devmem], args=3D(cfg,)) + ksft_exit() + + +if __name__ =3D=3D "__main__": + main() --=20 2.52.0 From nobody Tue Apr 7 01:19:01 2026 Received: from mail-yw1-f170.google.com (mail-yw1-f170.google.com [209.85.128.170]) (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 1FCF935F5F3 for ; Mon, 16 Mar 2026 22:29:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773700171; cv=none; b=qxtnmv7ZtSpG5Yt42timI9iNDFqlxtBdMpG+s/N+0Oi0eNQutjAn4hzLq8W/SmBDle46yRipJNQlxoIgwhhV5/GvukkRLMFcSJJmNy2f5yNsLl6JHhihd65bIwAO15EAhhRpFMJ8YhMFF4/X10hr72KqFz085iJJY1KUWTP0SVM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773700171; c=relaxed/simple; bh=QLmJCoIEgk7bY1Etv2KHuHMRxJlYbMdrmYRAb1O/174=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Fs5I74ZBzV1iRbdGdQhmdMgthVUBh7/cOvBCtfqZADDlcqHM9BEVieo31ObXiGDylWVSyEZ1NiOcmW2fQM2UlosLR1DcuYhENH5kr+TRswgiEBRIQiv9NYtk/WWn3zx0uVfJqCOt5stpU0hPoHy4S+J0+6GhK353kekRwjLjBPQ= 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=YU+4+DAK; arc=none smtp.client-ip=209.85.128.170 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="YU+4+DAK" Received: by mail-yw1-f170.google.com with SMTP id 00721157ae682-79a5ad7cc52so10949577b3.2 for ; Mon, 16 Mar 2026 15:29:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773700166; x=1774304966; 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=zGghREiBSn7MQCKj4TXr4KN+77lBvMCqoaCeBo9lJNY=; b=YU+4+DAKS0Xi1+S5LfgawBzAiOjfnQ1zadUoqKwnE3T0oo5zVn6j0chqDn4W514zX6 IC7f0HDP/i5HIxgtJH44lVAe1THefFbTdXDB94DGKX2+FGi5NAjMUvYrDaMRocJfQ7Ua rcdkGczSUqXVgFN63quPo5fSowPBOzLFf4zUQWPv5eRYskXogfjkO+3ID5n+0ZciyBdU NWPflAKJ/hxEZjDKEn0p6zchzprqfIUm5EgK2kTqUmPG/ItIU5PGXMYYLa9JefgNsIQ4 sbyMQdxlg8A5HK0E5Ku5Edg/z9DDrvH/95Yea0efpZ09SXHRBcAsw0uzfr1MvO1N4+4b uxPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773700166; x=1774304966; 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=zGghREiBSn7MQCKj4TXr4KN+77lBvMCqoaCeBo9lJNY=; b=KIsM9JlYfxCZvNjonhQ5oADqD9WGX5gO8p/1E7HfpRR1TehAJtbtMoR/mBQ8ErvO67 emca9jeTXWDFf3koF37oPnTJ/z7utn4k5+ErHl7ioUjn3XI8Rn5vqAgzXAAKP503adG6 H5THSInKnTB7r/q+pFPZ7sB+bgLVcVW5mA1jhPwgcOS64HM9Kw6/RVh0XbjuErFHnJko zsd9UqC4f7dJYpPbqDpIIWt1vNM3vKL+Pt4fZ8QzrOx3xAwOFq2h87NmFnMe+bLSvfZz opCPimBCz8cIdboryL5S/na4Hvw3LGDMUVTwgQ3O6MrsMlzy4z4pR8FWwNHqdEwTRghr TlEg== X-Forwarded-Encrypted: i=1; AJvYcCUnn3ZPV4Dyirr6FKRScxAzZ0TsLBmzGc/DE+ZApDWSgDrNOL2gX8i1yowS9pljyylau6bvqaSjtnj5Hcg=@vger.kernel.org X-Gm-Message-State: AOJu0YwAalnDPTyS2AdkXC4KPDwUaqRXgQPLr+lVbOrwqIBMzkhrW7Jx 7ZzhlB+7UEtyu/A5gOx7npLC5Oxag7MH94zjWL9raMrq05xf4Anz1okO X-Gm-Gg: ATEYQzz7qqRXLwlYMFq0pSOrZKMngaKsMDXBoI0Yr3McIFErE6JDUk33KNeITKfPDkh h07+rw7ejtaRl9pQbjUcQenQ5dJ72pugyG/3jksw9KxBq4ZYypwDpuyFnMzbH0XFMla1sNfeVhe mkYDh4Fe+zwpR3Ggjec79VIBgJQv13FvfUl+82Db7+7ZqjTL+55itNFKbcfWEiGp9nOZ10EvPtE a4ljJkE6HGzcCMJ+4RGVZv/Y7M5qswPgdPktSagthe3Ll4zhYRBc/tBthkkYnDCAlVnMOf1hekr f+rwmfOKkdwNKTo8Thpv2lLoimXdB4cKZljhvdOv2ecLV3Ppu8NopVtaw6/Nxru6SrQnD2NL1lc 3dqvGitz+uK5YqbW9Nvav+rt2j+K87M681amkOezj8O4vc9wEzXloXrxfRXh1ivHhPcmr+XurwH eNaRXm0z1WQ3m1kPrxEUQaIQ== X-Received: by 2002:a05:690c:f08:b0:796:6da9:bf97 with SMTP id 00721157ae682-79a1c1c002emr149829567b3.43.1773700165699; Mon, 16 Mar 2026 15:29:25 -0700 (PDT) Received: from localhost ([2a03:2880:25ff:5b::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-79917ee5757sm96813787b3.31.2026.03.16.15.29.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Mar 2026 15:29:25 -0700 (PDT) From: Bobby Eshleman Date: Mon, 16 Mar 2026 15:29:17 -0700 Subject: [PATCH net-next 6/6] selftests: drv-net: add netkit devmem TX test Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260316-scratch-bobbyeshleman-tcp-dm-netkit5-v1-6-b53c8cd72b23@meta.com> References: <20260316-scratch-bobbyeshleman-tcp-dm-netkit5-v1-0-b53c8cd72b23@meta.com> In-Reply-To: <20260316-scratch-bobbyeshleman-tcp-dm-netkit5-v1-0-b53c8cd72b23@meta.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Andrew Lunn , Shuah Khan Cc: Stanislav Fomichev , Mina Almasry , Wei Wang , David Wei , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, bpf@vger.kernel.org, Bobby Eshleman X-Mailer: b4 0.14.3 From: Bobby Eshleman Extend the netkit devmem selftest with a TX test case. The TX path uses the primary RX redirect BPF program to redirect traffic from the primary netkit ingress to the physical NIC via bpf_redirect_neigh(). The actual TX path looks like the following: TX Path ------- Netkit Guest (netns) Netkit Host Physical NIC Remote | | | | |--- TCP send --------->| | | |--- BPF redirect --->| | |---- transmit ----->| dmabuf Signed-off-by: Bobby Eshleman --- .../testing/selftests/drivers/net/hw/nk_devmem.py | 23 ++++++++++++++++++= ++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/drivers/net/hw/nk_devmem.py b/tools/te= sting/selftests/drivers/net/hw/nk_devmem.py index 0a66ff85db9d..0e3c5aab6423 100755 --- a/tools/testing/selftests/drivers/net/hw/nk_devmem.py +++ b/tools/testing/selftests/drivers/net/hw/nk_devmem.py @@ -89,14 +89,33 @@ def test_devmem(cfg) -> None: ksft_eq(ncdevmem_rx.ret, 0) =20 =20 +def test_devmem_tx(cfg) -> None: + """Test devmem TX: send from netkit guest, receive on remote.""" + configure_nic(cfg) + + socat =3D f"socat -U - TCP6-LISTEN:{cfg.port},reuseaddr" + tx_cmd =3D (f"ip netns exec {cfg.netns.name} bash -c" + f" 'echo test_devmem_tx | {cfg.bin_local}" + f" -f {cfg._nk_guest_ifname} -s {cfg.remote_addr_v['6']}" + f" -p {cfg.port} -t 0 -q 1 -n'") + + with bkg(socat, host=3Dcfg.remote, exit_wait=3DTrue) as receiver: + wait_port_listen(cfg.port, proto=3D"tcp", host=3Dcfg.remote) + cmd(tx_cmd, shell=3DTrue) + + ksft_eq(receiver.ret, 0) + ksft_eq(receiver.stdout.strip(), "test_devmem_tx") + + def main() -> None: """Run netkit devmem tests.""" - with NetDrvContEnv(__file__, rxqueues=3D2) as cfg: + with NetDrvContEnv(__file__, rxqueues=3D2, + primary_rx_redirect=3DTrue) as cfg: cfg.bin_local =3D path.abspath( path.dirname(__file__) + "/ncdevmem" ) cfg.port =3D rand_port() - ksft_run([test_devmem], args=3D(cfg,)) + ksft_run([test_devmem, test_devmem_tx], args=3D(cfg,)) ksft_exit() =20 =20 --=20 2.52.0