From nobody Thu Jun 11 14:47:30 2026 Received: from mail-yx1-f45.google.com (mail-yx1-f45.google.com [74.125.224.45]) (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 6B74838E5F9 for ; Thu, 14 May 2026 17:22:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778779364; cv=none; b=F9IWYRxkxnfQSxTsjHAxn0xTIuhJFwXCfUdI7Rg1LfwbtfU8qsGCRC89hr/uOkacfHUvosmvbJs3WDhpgmopCw1iQRs3TucqCoPYBGmxw+RvTKb6u3SpTW2KfkgenhQf9GDM94O0RvmrwS7yz85txFJ7SOd2t5Pe2EE6Iy4IY80= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778779364; c=relaxed/simple; bh=Axn+PNJbdQIKENviBaH16X9CGQ2qXERThK3Y3nrH0mw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=E2wo5cT9Io2Q1gO1zZj76dazPgzjJK2DgW9dzwGhhj3sQCy3GbQR6w9Udisb9PGDAyAbwyo30Gp+9I8zaN9pdIQDn/ViFqif/TZnk/kRTTcdkFpalGBcT/2Mgb7K/fCmuQdHPsfj0xmCS7dGpvDpusziKCG1Kn+z+aOYUwUnLls= 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=JWjQQI6V; arc=none smtp.client-ip=74.125.224.45 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="JWjQQI6V" Received: by mail-yx1-f45.google.com with SMTP id 956f58d0204a3-6563f83ae9fso10532810d50.1 for ; Thu, 14 May 2026 10:22:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778779361; x=1779384161; 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=eYjurhmeiuV8Nqd+zpLe/ERTdzqtmQMlSYyDiJ3WcRE=; b=JWjQQI6V5hwGZZbg4VB9y1teFLjXB8IT/LPZ6fAsm8/kKChhRsLXEdZvKktEqUkUd7 rdWd0G+8NlueDBPbL5CktiOrh1wOKGE/D4tcv9OfpBqZkFIFJ5tDL1YX5C0CTAy4f5m1 3cWmtGgXzmY2CmGVG+3eEHtTeuAE0wfMBnZwWakP1U4WCl2K+V8D2GzUttOucAPiRCE/ NZOBHtaWxuBMr1TguS4dH5PEGrylNJJAuYxe387xSJ+N4hIA0oyjKBklHGNosPMXtJpi 8BSsXk6o6+4eCGj0VkH9GkuDBK9MIotx/oiA3LABouEMku6/FBGrabNkXcgcDRBkCQTn us0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778779361; x=1779384161; 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=eYjurhmeiuV8Nqd+zpLe/ERTdzqtmQMlSYyDiJ3WcRE=; b=lEYwVb91J118kV4txMLdfArVNbShEy0kpREkJTpr0j3A8H22TW5hvl2FHPpJ+5u92V KWcus9UR56+UgkLqykXNd/YFOcCx1DAbw4kzjOxyNb6JOtqvu8NfOa2JVF3/7b6iQ8al jBQIMkipg5ECl9XhhxMG4ox8Nfy1ERopx1C/eQ0VQ7qQFh0Yj308cVmXnjcTTAFT4fao FKcvKClfqPvnxyipC1JF6BOx2Jk+4T7n0ZpYnhgW9TxwPSOxTH5/qqDuXhWn052qyFQE 1Ec9hR6ecKOPSKVJ4jGuliWbaDP1+eAK2k5sGXiZUWYibUs56PX9ggudiz2MMMNHuhq5 /KIQ== X-Forwarded-Encrypted: i=1; AFNElJ9V4bATRjX8l0Agkw1xcwceXYiE8DqIfhjDn/rplxyOUMNA+NdgwpyzKfUiTuvUltYQ9f6U4bsY6UlTcvY=@vger.kernel.org X-Gm-Message-State: AOJu0YyianarCHTUa85H4EFngOtmMDx7tQMpkA4JHuOdqT7oPBr5iXdB 9LapB96zZuRopL7jvsoqnJXdwE9I9ZdFJUb+t3A0NEObIQY0chv+coI3 X-Gm-Gg: Acq92OEgWPL8IzbxUO5uOz/thkXzuRSvaShMIOgVMgww2yrOkFd08rEzb0ItCcfAXDB 14Rz+8ajfqrCR1NmOey18+tbALPaev4BN94+8JaGcSQdXeGxPUJ54fS9Br4ofNcRfYRyS5d8c0G cB4BqlIN4klIq9R7ZW1PQ5bBd+iG1GTKIFmhxT0fcbx4rZEtFIAsy57pADlS8nLBdjr1KebKGN3 Yy1xvVdnlap7HGveIg0lRJl/sBVF0EWJj8kYEQ9Rc/NstgMJXbY7PcLeCf28qigmaZBN+e+dY+v CPycyiLwKBrV/eDJIQOFXpX3zBBSAT5y0KKR4kzVsfbXe2YXVXKhzHy2FCvd4K8tIiMGAnL6x/d 8N1dtbWw2ZB0GlG78l3jkdAxQtyo5ueGuxnoMe85Tyrfm9apXWdP39UjVb6keaL3PXAt7Bm0sMP FFFnK1b76+wxhTTnHjO3UieQ== X-Received: by 2002:a05:690c:6e86:b0:7bd:8d1b:b2d9 with SMTP id 00721157ae682-7c95c5ef58dmr2296487b3.47.1778779361418; Thu, 14 May 2026 10:22:41 -0700 (PDT) Received: from localhost ([2a03:2880:f806:3b::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-7c7f2ba567csm16544767b3.18.2026.05.14.10.22.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 10:22:41 -0700 (PDT) From: Bobby Eshleman Date: Thu, 14 May 2026 10:22:28 -0700 Subject: [PATCH net-next v5 1/8] net: convert netmem_tx flag to enum 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: <20260514-tcp-dm-netkit-v5-1-408c59b91e66@meta.com> References: <20260514-tcp-dm-netkit-v5-0-408c59b91e66@meta.com> In-Reply-To: <20260514-tcp-dm-netkit-v5-0-408c59b91e66@meta.com> To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Jonathan Corbet , Shuah Khan , Alex Shi , Yanteng Si , Dongliang Mu , Michael Chan , Pavan Chebbi , Joshua Washington , Harshitha Ramamurthy , Saeed Mahameed , Tariq Toukan , Mark Bloch , Leon Romanovsky , Alexander Duyck , kernel-team@meta.com, Daniel Borkmann , Nikolay Aleksandrov , Shuah Khan , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Jonathan Corbet , Shuah Khan , Alex Shi , Yanteng Si , Dongliang Mu , Michael Chan , Pavan Chebbi , Joshua Washington , Harshitha Ramamurthy , Saeed Mahameed , Tariq Toukan , Mark Bloch , Leon Romanovsky , Alexander Duyck , kernel-team@meta.com, Daniel Borkmann , Nikolay Aleksandrov , Shuah Khan Cc: dw@davidwei.uk, sdf.kernel@gmail.com, mohsin.bashr@gmail.com, willemb@google.com, jiang.kun2@zte.com.cn, xu.xin16@zte.com.cn, wang.yaxin@zte.com.cn, netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Stanislav Fomichev , Mina Almasry , netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Bobby Eshleman X-Mailer: b4 0.13.0 From: Bobby Eshleman Devices that support netmem TX previously set dev->netmem_tx =3D true. This was checked in validate_xmit_unreadable_skb() to drop unreadable skbs (skbs with dmabuf-backed frags) before they reach drivers that would mishandle them or devices that would not have the iommu mappings for them. A subsequent patch will introduce a third state for virtual devices that forward unreadable skbs without ever performing DMA on them. To prepare for that, convert the boolean dev->netmem_tx into an enum: NETMEM_TX_NONE - no netmem TX support (drop unreadable skbs) NETMEM_TX_DMA - full support, device does DMA Update the existing NIC drivers (bnxt, gve, mlx5, fbnic) and the validators in net/core to use the new enum. No functional change. Acked-by: Harshitha Ramamurthy Acked-by: Stanislav Fomichev Signed-off-by: Bobby Eshleman --- Changes in v4: - netdevice.h: netmem_tx enum list -> only "device netmem TX mode" in comment (Stan) Changes in v3: - Split NO_DMA changes into subsequent commit (Jakub) - Move !netdev->netmem_tx -> netdev->netmem_tx =3D=3D NETMEM_TX_NONE conversions to this patch (Jakub) Changes in v2: - Squash driver conversion patches (2-5) into patch 1 (Jakub) --- Documentation/networking/netmem.rst | 5 ++++- Documentation/translations/zh_CN/networking/netmem.rst | 4 +++- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- drivers/net/ethernet/google/gve/gve_main.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 2 +- drivers/net/ethernet/meta/fbnic/fbnic_netdev.c | 2 +- include/linux/netdevice.h | 7 ++++++- net/core/dev.c | 2 +- net/core/netdev-genl.c | 2 +- 9 files changed, 19 insertions(+), 9 deletions(-) diff --git a/Documentation/networking/netmem.rst b/Documentation/networking= /netmem.rst index b63aded46337..5ccadba4f373 100644 --- a/Documentation/networking/netmem.rst +++ b/Documentation/networking/netmem.rst @@ -95,4 +95,7 @@ Driver TX Requirements netdev@, or reach out to the maintainers and/or almasrymina@google.com = for help adding the netmem API. =20 -2. Driver should declare support by setting `netdev->netmem_tx =3D true` +2. Driver should declare support by setting `netdev->netmem_tx` to the + appropriate mode: + + - `NETMEM_TX_DMA`: for physical devices that perform DMA. diff --git a/Documentation/translations/zh_CN/networking/netmem.rst b/Docum= entation/translations/zh_CN/networking/netmem.rst index fe351a240f02..9c84423b7528 100644 --- a/Documentation/translations/zh_CN/networking/netmem.rst +++ b/Documentation/translations/zh_CN/networking/netmem.rst @@ -89,4 +89,6 @@ dma-mapping API =E5=8E=BB=E5=A4=84=E7=90=86=E3=80=82 =E4=BD=BF=E7=94=A8=E6=9F=90=E4=B8=AA=E8=BF=98=E4=B8=8D=E5=AD=98=E5=9C=A8= =E7=9A=84 netmem API=EF=BC=8C=E4=BD=A0=E5=8F=AF=E4=BB=A5=E8=87=AA=E8=A1=8C= =E6=B7=BB=E5=8A=A0=E5=B9=B6=E6=8F=90=E4=BA=A4=E5=88=B0 netdev@=EF=BC=8C=E4= =B9=9F=E5=8F=AF=E4=BB=A5=E8=81=94=E7=B3=BB=E7=BB=B4=E6=8A=A4 =E4=BA=BA=E5=91=98=E6=88=96=E8=80=85=E5=8F=91=E9=80=81=E9=82=AE=E4=BB=B6= =E8=87=B3 almasrymina@google.com =E5=AF=BB=E6=B1=82=E5=B8=AE=E5=8A=A9=E3=80= =82 =20 -2. =E9=A9=B1=E5=8A=A8=E7=A8=8B=E5=BA=8F=E5=BA=94=E9=80=9A=E8=BF=87=E8=AE= =BE=E7=BD=AE netdev->netmem_tx =3D true =E6=9D=A5=E8=A1=A8=E6=98=8E=E8=87= =AA=E8=BA=AB=E6=94=AF=E6=8C=81 netmem =E5=8A=9F=E8=83=BD=E3=80=82 +2. =E9=A9=B1=E5=8A=A8=E7=A8=8B=E5=BA=8F=E5=BA=94=E5=B0=86 `netdev->netmem_= tx` =E8=AE=BE=E7=BD=AE=E4=B8=BA=E9=80=82=E5=BD=93=E7=9A=84=E6=A8=A1=E5=BC= =8F=EF=BC=9A + + - `NETMEM_TX_DMA`=EF=BC=9A=E9=80=82=E7=94=A8=E4=BA=8E=E6=89=A7=E8=A1=8C= DMA =E7=9A=84=E7=89=A9=E7=90=86=E8=AE=BE=E5=A4=87=E3=80=82 diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 945a86696f2f..d4f93e62f583 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -17123,7 +17123,7 @@ static int bnxt_init_one(struct pci_dev *pdev, cons= t struct pci_device_id *ent) dev->queue_mgmt_ops =3D &bnxt_queue_mgmt_ops_unsupp; if (BNXT_SUPPORTS_QUEUE_API(bp)) dev->queue_mgmt_ops =3D &bnxt_queue_mgmt_ops; - dev->netmem_tx =3D true; + dev->netmem_tx =3D NETMEM_TX_DMA; =20 rc =3D register_netdev(dev); if (rc) diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ether= net/google/gve/gve_main.c index 00750643e614..e4d78ae52daf 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -2894,7 +2894,7 @@ static int gve_probe(struct pci_dev *pdev, const stru= ct pci_device_id *ent) goto abort_with_wq; =20 if (!gve_is_gqi(priv) && !gve_is_qpl(priv)) - dev->netmem_tx =3D true; + dev->netmem_tx =3D NETMEM_TX_DMA; =20 err =3D register_netdev(dev); if (err) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/ne= t/ethernet/mellanox/mlx5/core/en_main.c index 85b1ccbd351f..90d2979f1a4f 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -5966,7 +5966,7 @@ static void mlx5e_build_nic_netdev(struct net_device = *netdev) =20 netdev->priv_flags |=3D IFF_UNICAST_FLT; =20 - netdev->netmem_tx =3D true; + netdev->netmem_tx =3D NETMEM_TX_DMA; =20 netif_set_tso_max_size(netdev, GSO_MAX_SIZE); mlx5e_set_xdp_feature(priv); diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c b/drivers/net/e= thernet/meta/fbnic/fbnic_netdev.c index 4dea2bb58d2f..f99ca551c1ce 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c @@ -752,7 +752,7 @@ struct net_device *fbnic_netdev_alloc(struct fbnic_dev = *fbd) netdev->netdev_ops =3D &fbnic_netdev_ops; netdev->stat_ops =3D &fbnic_stat_ops; netdev->queue_mgmt_ops =3D &fbnic_queue_mgmt_ops; - netdev->netmem_tx =3D true; + netdev->netmem_tx =3D NETMEM_TX_DMA; =20 fbnic_set_ethtool_ops(netdev); =20 diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index e7af71491a47..b7a4503f7cdb 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -1794,6 +1794,11 @@ enum netdev_stat_type { NETDEV_PCPU_STAT_DSTATS, /* struct pcpu_dstats */ }; =20 +enum netmem_tx_mode { + NETMEM_TX_NONE, /* no netmem TX support */ + NETMEM_TX_DMA, /* DMA-capable netmem TX (real HW) */ +}; + enum netdev_reg_state { NETREG_UNINITIALIZED =3D 0, NETREG_REGISTERED, /* completed register_netdevice */ @@ -1815,7 +1820,7 @@ enum netdev_reg_state { * @lltx: device supports lockless Tx. Deprecated for real HW * drivers. Mainly used by logical interfaces, such as * bonding and tunnels - * @netmem_tx: device support netmem_tx. + * @netmem_tx: device netmem TX mode * * @name: This is the first field of the "visible" part of this structure * (i.e. as seen by users in the "Space.c" file). It is the name diff --git a/net/core/dev.c b/net/core/dev.c index b0691e03dd6b..2da2688fe490 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3996,7 +3996,7 @@ static struct sk_buff *validate_xmit_unreadable_skb(s= truct sk_buff *skb, if (likely(skb_frags_readable(skb))) goto out; =20 - if (!dev->netmem_tx) + if (dev->netmem_tx =3D=3D NETMEM_TX_NONE) goto out_free; =20 shinfo =3D skb_shinfo(skb); diff --git a/net/core/netdev-genl.c b/net/core/netdev-genl.c index b8f6076d8007..4d2c49371cdb 100644 --- a/net/core/netdev-genl.c +++ b/net/core/netdev-genl.c @@ -1164,7 +1164,7 @@ int netdev_nl_bind_tx_doit(struct sk_buff *skb, struc= t genl_info *info) goto err_unlock_netdev; } =20 - if (!netdev->netmem_tx) { + if (netdev->netmem_tx =3D=3D NETMEM_TX_NONE) { err =3D -EOPNOTSUPP; NL_SET_ERR_MSG(info->extack, "Driver does not support netmem TX"); --=20 2.53.0-Meta From nobody Thu Jun 11 14:47:30 2026 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (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 30C5639184B for ; Thu, 14 May 2026 17:22:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778779370; cv=none; b=IkQ8KxK4icRAcf3EoduNqg82m0QNp6Qe25AzLPMxDGjAkcWoCYEufyNLxvrYopLVPVBF3kQNUUm0S+9tzFS563GTz9XzfgcCg906My7eTta1jnJwt3LkF1PzI9W2chiCct9z4gPhdSP0U9Wp900fWvcs2JynYw/FNnEhZ7XopiE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778779370; c=relaxed/simple; bh=AUkEXZ9shK/AEw9rish8lLHvzIx+b3il3PP8PxYF4lk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gjKAj4g3jh0YlnExgI1E0xXHqX7d4ck7XMDTHWoNHJ96lelhgI1BR4j1Y5BC0vmCkHhpoP8WZWbAINluhMiC7kegE7F+zUMDm04XxO/P5tbbox6chazJE9cSw/UPSoPUvM3nfrip5Kwu7b/wkb6iY6oQKCFhp/XuXaqsHfTYCPI= 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=hhC9n54V; arc=none smtp.client-ip=209.85.214.177 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="hhC9n54V" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-2b7d3ecc10dso81513725ad.2 for ; Thu, 14 May 2026 10:22:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778779366; x=1779384166; 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=7yopC/9MxA39yKranAJ5Os3jyJpUN93ONWaDD2qEA7s=; b=hhC9n54VZ84cvwcMzJlpSU1MH0hA1f/oYJpnYy/Q1Bz8o2YAC4g4b1KRCIJFj7jbcG 17MbTa+7oIHCkTa3U7ukQjglNo2cP4KYEHgqt7DbWkjppbSR2O1yagSEEwfrjbBOq+Gz GFg+70CFvzzzzVT48L9ooA+aipUvQwOe7Pnu8GEVIka24yUbXA5Y4pTkCX5s17E9jXd7 uQif0SqOsAPWI3KFa5IE3rHZW1rgBxNJEHltQ20cCMwkVvA/Kvw1Wd+IvnJQOpF6vNrJ t++uC3Eehj9/it/gXWn/eN8FvV9UfvrTgOQz7bPJJ11kXFagMzCIf6BbT8iyr/kniXPU tlPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778779366; x=1779384166; 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=7yopC/9MxA39yKranAJ5Os3jyJpUN93ONWaDD2qEA7s=; b=ijWdUZh+9N5DY/p0W+Zn8oz27iT+EIp1niwMwSB9yl0kI19wE0s9AqRE1n8RUVpkq7 z9+g2pLUxO7YF5XppNz0B4JBlixrBBKUvkyDQf9Fl0i41Ex9LKYusObQ8dy0EBVkodIJ j24fAly+srlD0vffMkG65KorMJp61tvymDOkZPkCdM2V2uHARrpJSwS3tKRjR+h0mXqh UIpsLBKxeUZCN8qnhjLiEHtmRPtPtg0dQKdsyCMS5IpGuXpc/BEjki+w0eTbPqk9hGBu voNfD/tNZVBCUXq+vKZCztVePrbC+YtPT9dhS3UCbe41eQMnSSknGI1iI1K6I8B2XLNd KySA== X-Forwarded-Encrypted: i=1; AFNElJ/0MTjuRS39EdIVmsuCPd/wcH8DmWKRxbExWnvN9a3zdzT41rc/Uz7i2xkH7Hpm4320Y1nmA5d2ekTM6T4=@vger.kernel.org X-Gm-Message-State: AOJu0Yz1Ev4cqDeRdzGWET5eN7qJ52c4ugq/22S4tlgf/1GrFxPePW89 L/24Zk4unNh2iz0p6ibvoWu/u/TyiI98+DNUaCgOy+3hpVXxFrEryrMk X-Gm-Gg: Acq92OEDuzRDSmHsSYavUPRhH1W4dl9C2ZiE+wrwecl6CS7XV5bKQWZtJSxZAmJ9tOl hrJjNc93BAsEYzNUqqEAFNzCIUMXsid6N/U6aqWTc61+gAhnqRg6+cp22OyeB5jpEFeFUjwmdin J1E0QxTVFszD9MzClCXrkrxlrPhJ3fnJsvb6loNDdcN1MiIQ1fr1WNAEh93cYtnO4rNRyP8PaeW F2NMEB5/SRXuFg0tpGhpuykKDYaFHGV/EEvHgiSX4P0id1Ua0oX4bQ9WJcZlheCG7iDwc5uLxRi jVooW5FVXlyWT8RkP6i2NFCSZPzFyL5uudeD14MwEbwR0RJiX1ql1Ue5wlJZq9kAlApwrGdkL0T YMbp9nO814GB2TjxtPVDaHa5A/grO2H3l8S7FrkNUcytaUgIJeI1jQ/x1dUZqgx4DTQcV6AwWZI EtOL3SNviIlu4ds8bZ9YPe X-Received: by 2002:a17:903:46d0:b0:2bd:657f:3a1a with SMTP id d9443c01a7336-2bd7e77ab65mr5300005ad.8.1778779366071; Thu, 14 May 2026 10:22:46 -0700 (PDT) Received: from localhost ([2a03:2880:f80c:1::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2bd5d0fcb10sm32152215ad.60.2026.05.14.10.22.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 10:22:45 -0700 (PDT) From: Bobby Eshleman Date: Thu, 14 May 2026 10:22:29 -0700 Subject: [PATCH net-next v5 2/8] net: netkit: declare NETMEM_TX_NO_DMA mode 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: <20260514-tcp-dm-netkit-v5-2-408c59b91e66@meta.com> References: <20260514-tcp-dm-netkit-v5-0-408c59b91e66@meta.com> In-Reply-To: <20260514-tcp-dm-netkit-v5-0-408c59b91e66@meta.com> To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Jonathan Corbet , Shuah Khan , Alex Shi , Yanteng Si , Dongliang Mu , Michael Chan , Pavan Chebbi , Joshua Washington , Harshitha Ramamurthy , Saeed Mahameed , Tariq Toukan , Mark Bloch , Leon Romanovsky , Alexander Duyck , kernel-team@meta.com, Daniel Borkmann , Nikolay Aleksandrov , Shuah Khan , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Jonathan Corbet , Shuah Khan , Alex Shi , Yanteng Si , Dongliang Mu , Michael Chan , Pavan Chebbi , Joshua Washington , Harshitha Ramamurthy , Saeed Mahameed , Tariq Toukan , Mark Bloch , Leon Romanovsky , Alexander Duyck , kernel-team@meta.com, Daniel Borkmann , Nikolay Aleksandrov , Shuah Khan Cc: dw@davidwei.uk, sdf.kernel@gmail.com, mohsin.bashr@gmail.com, willemb@google.com, jiang.kun2@zte.com.cn, xu.xin16@zte.com.cn, wang.yaxin@zte.com.cn, netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Stanislav Fomichev , Mina Almasry , netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Bobby Eshleman X-Mailer: b4 0.13.0 From: Bobby Eshleman Some virtual devices like netkit (or ifb) never DMA and never touch frag contents, they just forward the skb to another device. They are unable to forward unreadable skbs, however, because they fail to pass TX validation checks on dev->netmem_tx. The existing two-state NETMEM_TX_NONE / NETMEM_TX_DMA doesn't give the TX validator enough information to differentiate devices that will attempt DMA on the unreadable skb from those that will simply route it untouched. Add a third mode to the enum so drivers can indicate 1) if they have netmem TX support, and 2) if they do, whether they are DMA-capable: NETMEM_TX_NO_DMA - pass-through, device never DMAs Widen dev->netmem_tx from a 1-bit field to 2 bits to fit the new value, and declare netkit as NETMEM_TX_NO_DMA. Devmem TX support over these devices comes in a follow-up patch. Acked-by: Stanislav Fomichev Signed-off-by: Bobby Eshleman --- Changes in v3: - net_cachelines/net_device.rst: align the netmem_tx row's type column with the rest of the table by using "unsigned_long:2" instead of "unsigned long:2" - Split this into a distinct patch (Jakub) --- Documentation/networking/net_cachelines/net_device.rst | 2 +- Documentation/networking/netmem.rst | 3 +++ Documentation/translations/zh_CN/networking/netmem.rst | 3 +++ drivers/net/netkit.c | 1 + include/linux/netdevice.h | 3 ++- 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Documentation/networking/net_cachelines/net_device.rst b/Docum= entation/networking/net_cachelines/net_device.rst index 1c19bb7705df..7b3392553fd6 100644 --- a/Documentation/networking/net_cachelines/net_device.rst +++ b/Documentation/networking/net_cachelines/net_device.rst @@ -10,7 +10,7 @@ Type Name = fastpath_tx_acce =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D unsigned_long:32 priv_flags read_mostl= y __dev_queue_xmit(tx) unsigned_long:1 lltx read_mostl= y HARD_TX_LOCK,HARD_TX_TRYLOCK,HARD_TX_UNLOCK(t= x) -unsigned long:1 netmem_tx:1; read_mostly +unsigned_long:2 netmem_tx:2; read_mostly char name[16] struct netdev_name_node* name_node struct dev_ifalias* ifalias diff --git a/Documentation/networking/netmem.rst b/Documentation/networking= /netmem.rst index 5ccadba4f373..217869d1108d 100644 --- a/Documentation/networking/netmem.rst +++ b/Documentation/networking/netmem.rst @@ -99,3 +99,6 @@ Driver TX Requirements appropriate mode: =20 - `NETMEM_TX_DMA`: for physical devices that perform DMA. + + - `NETMEM_TX_NO_DMA`: for virtual or passthrough devices that do + not DMA, but still support handling of netmem-backed skbs. diff --git a/Documentation/translations/zh_CN/networking/netmem.rst b/Docum= entation/translations/zh_CN/networking/netmem.rst index 9c84423b7528..320f3eacf51b 100644 --- a/Documentation/translations/zh_CN/networking/netmem.rst +++ b/Documentation/translations/zh_CN/networking/netmem.rst @@ -92,3 +92,6 @@ dma-mapping API =E5=8E=BB=E5=A4=84=E7=90=86=E3=80=82 2. =E9=A9=B1=E5=8A=A8=E7=A8=8B=E5=BA=8F=E5=BA=94=E5=B0=86 `netdev->netmem_= tx` =E8=AE=BE=E7=BD=AE=E4=B8=BA=E9=80=82=E5=BD=93=E7=9A=84=E6=A8=A1=E5=BC= =8F=EF=BC=9A =20 - `NETMEM_TX_DMA`=EF=BC=9A=E9=80=82=E7=94=A8=E4=BA=8E=E6=89=A7=E8=A1=8C= DMA =E7=9A=84=E7=89=A9=E7=90=86=E8=AE=BE=E5=A4=87=E3=80=82 + + - `NETMEM_TX_NO_DMA`=EF=BC=9A=E9=80=82=E7=94=A8=E4=BA=8E=E4=B8=8D=E6=89= =A7=E8=A1=8C DMA =E7=9A=84=E8=99=9A=E6=8B=9F=E6=88=96=E9=80=8F=E4=BC=A0=E8= =AE=BE=E5=A4=87=EF=BC=8C=E4=BD=86=E4=BB=8D=E6=94=AF=E6=8C=81 + =E5=A4=84=E7=90=86 netmem =E6=94=AF=E6=8C=81=E7=9A=84 skb=E3=80=82 diff --git a/drivers/net/netkit.c b/drivers/net/netkit.c index 5e2eecc3165d..0ad6a806d7d5 100644 --- a/drivers/net/netkit.c +++ b/drivers/net/netkit.c @@ -466,6 +466,7 @@ static void netkit_setup(struct net_device *dev) dev->priv_flags |=3D IFF_NO_QUEUE; dev->priv_flags |=3D IFF_DISABLE_NETPOLL; dev->lltx =3D true; + dev->netmem_tx =3D NETMEM_TX_NO_DMA; =20 dev->netdev_ops =3D &netkit_netdev_ops; dev->ethtool_ops =3D &netkit_ethtool_ops; diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index b7a4503f7cdb..bf3dd9b2c1a7 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -1797,6 +1797,7 @@ enum netdev_stat_type { enum netmem_tx_mode { NETMEM_TX_NONE, /* no netmem TX support */ NETMEM_TX_DMA, /* DMA-capable netmem TX (real HW) */ + NETMEM_TX_NO_DMA, /* no DMA, e.g. passthrough for virtual devs */ }; =20 enum netdev_reg_state { @@ -2143,7 +2144,7 @@ struct net_device { struct_group(priv_flags_fast, unsigned long priv_flags:32; unsigned long lltx:1; - unsigned long netmem_tx:1; + unsigned long netmem_tx:2; ); const struct net_device_ops *netdev_ops; const struct header_ops *header_ops; --=20 2.53.0-Meta From nobody Thu Jun 11 14:47:30 2026 Received: from mail-oa1-f49.google.com (mail-oa1-f49.google.com [209.85.160.49]) (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 BFBCA390987 for ; Thu, 14 May 2026 17:22:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778779371; cv=none; b=BtW5ZxzrrxqQyEegMTKi+LjjnSjVFf7XQkGrlazL0lw3/ls67hKCaJlXa0c1ooYcE8RcE/wW1okOzTMXVv4eaoPpdayODtwiTWBkq126E7c4JT17N9LxtV4xjvDQa1aAidZnguP8lLNgdVWhkh05CRVlwCKMVpl0q2YgEmKP4M8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778779371; c=relaxed/simple; bh=8LTP/NFszKg1m9DiKbOV+XH39o0HnFYg4YrJ0MdNLT8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=miWGfallx9HD0OtzWWXe3PHzg97vpYepnWo0xMnX4R0syftGiGWFiRXqTTEdz/olJcN5dVzG5afJPMkOXTM/ifoTFGTu1ofAWiwe9MkB3sComszMM9wTkxU64iMj4Nxx+lsX1disbls4XeiPH/mdakPXmNZAApn8nW7w4rh/nXU= 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=Kld/8bot; arc=none smtp.client-ip=209.85.160.49 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="Kld/8bot" Received: by mail-oa1-f49.google.com with SMTP id 586e51a60fabf-439e43d16bdso1230461fac.2 for ; Thu, 14 May 2026 10:22:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778779368; x=1779384168; 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=J0KuaJtzt3M5KTpkegLP3WJoGkmy0+cTdZFwIB1803c=; b=Kld/8botLzMtziur/NgC9ORB7H7UHJ4Kvz/87/bZ33M/gzjsUl9f34RDD1dC9amY8V TbCfDNwkAPKiDD/vx5Q/Mzr+OcrP15X/EUlVaDlmQXQmpDLD/diisXq4wtmLHdg2RIvO UGJl9pss/unFf0spD5qJlfrRVJVahXteT2mbviGCPvDR1IjcKL/GQHP6+4c/PKV9GW7A n7358s3rNUVo/Re3EaHMfBsg6g9g7w7pGulL7oOv6Up6TfmSczAMRDb+vmTUf4S8C5Kc DcZ9xMJ4F81XlVxzvQGJXmR/7NxVd50HhnEYzeDTLdracpikl3Xtm0VEs/dHF8V8xDZB X5GQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778779368; x=1779384168; 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=J0KuaJtzt3M5KTpkegLP3WJoGkmy0+cTdZFwIB1803c=; b=IbKY84B+8FILtwX8ywDy1x3YwxE85Asm8UR+rvZgG07o4anmssRkHHzEMecRnR1/w+ r1zrYNVy0GccfhOi/PwiY2euzJJUZb9lANLUlLTSK/DlzPrs1hei799mU7XYdUeJkRiq IZ3SxZBpRybjzzoVdlj3bx3siuwBN9VM1zrmt4ZtfmkHOX73RVYtzhud2TvefkO81D0P 1o3xezjthP+OysLtk5sVyjRhY/gbwhE0H6C/iE1DFoSVK+MKfruyAIsBtkL5S/3rzpsr aE99WamsV0NmTohiZ4C+l633MxXqeXaZspmKM20u0DinT1QYCGz205RWABVv/EIVdtCT PgiA== X-Forwarded-Encrypted: i=1; AFNElJ9qMHJH276JpEyrfnfFhe+W+2JnUhC08e8u+a1Nxvqtj48heMV4puzPRhJF5hHbdaXYxyfZ4H6N2ZfzoFs=@vger.kernel.org X-Gm-Message-State: AOJu0Yx/n5/AklsxEfdkHcs2TQi4n/9VIEb6eGPSnhKkXUW6AcTurLRV fR3cvGS5cuC2h0UxqGsuc9tK9HLHoxV+X7CGxBUkrxHFagTO+QyhASz5 X-Gm-Gg: Acq92OFQK5BEIxRznZ8RyFCyMqvRD4WmlXv24AUtYj1Dhvdx8FoK5X9GUX0uAA6A9qg 3kZ/ee8ojnzf9dhMjbSmEoGq0J5+arcBlimUYGxFhxS8EMC0+gYP8XZQxc31Tr8rFvNx3H5kqUc y20jAcnWKppAjQluMC9tl/wtVudnOXkIrf/U2/vSg7y9GPhXP9S7D58dW2s17yG+7YJakskw8dt LnwIWCyoG+NsQ46SI1X6U3QNJ7ydzPrnw+cQInQ+t0dOvrTYNNFFwxDZFeBpLNaxy8Yl9rS4NPk 5OfuI5ijEsePXKbB37zaIDlYGfrd2ThSqvpMij5xzGyhKiBM4L27/q4kC4JbGzh36QQtQpp4xMp u9xG9sIpW39+Ljj10p/621x7Fb8WOo7QbCxn/YWPgbQALBrgwi1SAbCuYat/I0qWvCQ7mB+XSh0 l2FfK5bTRvLyT3rrX3KY7JSw== X-Received: by 2002:a05:6870:90ca:b0:417:3be0:4e4e with SMTP id 586e51a60fabf-43a2da2c6acmr366882fac.16.1778779368215; Thu, 14 May 2026 10:22:48 -0700 (PDT) Received: from localhost ([2a03:2880:f812:51::]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-439fc542218sm2206434fac.16.2026.05.14.10.22.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 10:22:47 -0700 (PDT) From: Bobby Eshleman Date: Thu, 14 May 2026 10:22:30 -0700 Subject: [PATCH net-next v5 3/8] net: devmem: support TX over NETMEM_TX_NO_DMA devices 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: <20260514-tcp-dm-netkit-v5-3-408c59b91e66@meta.com> References: <20260514-tcp-dm-netkit-v5-0-408c59b91e66@meta.com> In-Reply-To: <20260514-tcp-dm-netkit-v5-0-408c59b91e66@meta.com> To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Jonathan Corbet , Shuah Khan , Alex Shi , Yanteng Si , Dongliang Mu , Michael Chan , Pavan Chebbi , Joshua Washington , Harshitha Ramamurthy , Saeed Mahameed , Tariq Toukan , Mark Bloch , Leon Romanovsky , Alexander Duyck , kernel-team@meta.com, Daniel Borkmann , Nikolay Aleksandrov , Shuah Khan , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Jonathan Corbet , Shuah Khan , Alex Shi , Yanteng Si , Dongliang Mu , Michael Chan , Pavan Chebbi , Joshua Washington , Harshitha Ramamurthy , Saeed Mahameed , Tariq Toukan , Mark Bloch , Leon Romanovsky , Alexander Duyck , kernel-team@meta.com, Daniel Borkmann , Nikolay Aleksandrov , Shuah Khan Cc: dw@davidwei.uk, sdf.kernel@gmail.com, mohsin.bashr@gmail.com, willemb@google.com, jiang.kun2@zte.com.cn, xu.xin16@zte.com.cn, wang.yaxin@zte.com.cn, netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Stanislav Fomichev , Mina Almasry , netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Bobby Eshleman X-Mailer: b4 0.13.0 From: Bobby Eshleman When a netkit virtual device leases queues from a physical NIC, devmem TX bindings created on the netkit device must still result in the dmabuf being mapped for dma by the physical device. This patch accomplishes this by teaching the bind handler to search for the underlying DMA-capable device by looking it up via leased rx queues. The function netdev_find_netmem_tx_dev(), used for finding the underlying DMA-capable device, can be extended to support other non-netkit NETMEM_TX_NO_DMA devices in the future if needed. Additionally, this patch extends 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. Acked-by: Stanislav Fomichev Signed-off-by: Bobby Eshleman --- Changes in v4: - Fold the `NETMEM_TX_NO_DMA` check in `validate_xmit_unreadable_skb()` (Stan, Jakub) - Convert `binding->vdev` to void* opaque cookie with comment (Jakub) Changes in v3: - Fix validate_xmit_unreadable_skb() bug for non-devmem unreadable niovs (should not be dropped) - Major simplification of validate_xmit_unreadable_skb() - Fix prematurely released lock in bind-tx handler (Jakub) Changes in v2: - In validate_xmit_unreadable_skb() to check netmem_tx mode before inspecting frags (Jakub) - Lock bind_dev around netdev_queue_get_dma_dev() when bind_dev !=3D netdev to fix lockdep (Sashiko) --- net/core/dev.c | 3 ++- net/core/devmem.c | 6 +++-- net/core/devmem.h | 10 ++++++-- net/core/netdev-genl.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++= ---- 4 files changed, 72 insertions(+), 10 deletions(-) diff --git a/net/core/dev.c b/net/core/dev.c index 2da2688fe490..bbc93b181ef9 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3993,7 +3993,8 @@ static struct sk_buff *validate_xmit_unreadable_skb(s= truct sk_buff *skb, struct skb_shared_info *shinfo; struct net_iov *niov; =20 - if (likely(skb_frags_readable(skb))) + if (likely(skb_frags_readable(skb) || + dev->netmem_tx =3D=3D NETMEM_TX_NO_DMA)) goto out; =20 if (dev->netmem_tx =3D=3D NETMEM_TX_NONE) diff --git a/net/core/devmem.c b/net/core/devmem.c index 468344739db2..893643909f6a 100644 --- a/net/core/devmem.c +++ b/net/core/devmem.c @@ -181,7 +181,7 @@ 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, void *vdev, struct device *dma_dev, enum dma_data_direction direction, unsigned int dmabuf_fd, struct netdev_nl_sock *priv, @@ -212,6 +212,7 @@ net_devmem_bind_dmabuf(struct net_device *dev, } =20 binding->dev =3D dev; + binding->vdev =3D vdev; xa_init_flags(&binding->bound_rxqs, XA_FLAGS_ALLOC); =20 err =3D percpu_ref_init(&binding->ref, @@ -396,7 +397,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->vdev))) { err =3D -ENODEV; goto out_unlock; } diff --git a/net/core/devmem.h b/net/core/devmem.h index 1c5c18581fcb..3852a56036cb 100644 --- a/net/core/devmem.h +++ b/net/core/devmem.h @@ -19,7 +19,13 @@ struct net_devmem_dmabuf_binding { struct dma_buf *dmabuf; struct dma_buf_attachment *attachment; struct sg_table *sgt; + /* Physical NIC that does the actual DMA for this binding. */ struct net_device *dev; + /* Opaque cookie identifying the virtual device (e.g. netkit) the user + * called bind-tx on. Used only for pointer comparison. Never + * dereferenced. + */ + void *vdev; struct gen_pool *chunk_pool; /* Protect dev */ struct mutex lock; @@ -84,7 +90,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, void *vdev, struct device *dma_dev, enum dma_data_direction direction, unsigned int dmabuf_fd, struct netdev_nl_sock *priv, @@ -165,7 +171,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, void *vdev, 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 4d2c49371cdb..b4d48f3672a5 100644 --- a/net/core/netdev-genl.c +++ b/net/core/netdev-genl.c @@ -1077,7 +1077,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); @@ -1119,9 +1119,43 @@ int netdev_nl_bind_rx_doit(struct sk_buff *skb, stru= ct genl_info *info) return err; } =20 +/* Find the DMA-capable device for a netmem TX binding. + * + * For NETMEM_TX_DMA devices, return the device itself. + * For NETMEM_TX_NO_DMA devices, walk leased RX queues to find the underly= ing + * physical device and return it. + */ +static struct net_device * +netdev_find_netmem_tx_dev(struct net_device *dev) +{ + struct netdev_rx_queue *lease_rxq; + struct net_device *phys_dev; + int i; + + if (dev->netmem_tx =3D=3D NETMEM_TX_DMA) + return dev; + + if (dev->netmem_tx !=3D NETMEM_TX_NO_DMA) + return NULL; + + for (i =3D 0; i < dev->real_num_rx_queues; i++) { + lease_rxq =3D READ_ONCE(__netif_get_rx_queue(dev, i)->lease); + if (!lease_rxq) + continue; + + phys_dev =3D lease_rxq->dev; + if (netif_device_present(phys_dev) && + phys_dev->netmem_tx =3D=3D NETMEM_TX_DMA) + return phys_dev; + } + + return NULL; +} + int netdev_nl_bind_tx_doit(struct sk_buff *skb, struct genl_info *info) { struct net_devmem_dmabuf_binding *binding; + struct net_device *bind_dev; struct netdev_nl_sock *priv; struct net_device *netdev; struct device *dma_dev; @@ -1171,22 +1205,41 @@ int netdev_nl_bind_tx_doit(struct sk_buff *skb, str= uct genl_info *info) goto err_unlock_netdev; } =20 - dma_dev =3D netdev_queue_get_dma_dev(netdev, 0, NETDEV_QUEUE_TYPE_TX); - binding =3D net_devmem_bind_dmabuf(netdev, dma_dev, DMA_TO_DEVICE, - dmabuf_fd, priv, info->extack); + bind_dev =3D netdev_find_netmem_tx_dev(netdev); + if (!bind_dev) { + err =3D -EOPNOTSUPP; + NL_SET_ERR_MSG(info->extack, + "No DMA-capable device found for netmem TX"); + goto err_unlock_netdev; + } + + if (bind_dev !=3D netdev) + netdev_lock(bind_dev); + + dma_dev =3D netdev_queue_get_dma_dev(bind_dev, 0, NETDEV_QUEUE_TYPE_TX); + + binding =3D net_devmem_bind_dmabuf(bind_dev, + bind_dev !=3D netdev ? netdev : NULL, + dma_dev, DMA_TO_DEVICE, dmabuf_fd, + priv, info->extack); if (IS_ERR(binding)) { err =3D PTR_ERR(binding); - goto err_unlock_netdev; + goto err_unlock_bind_dev; } =20 nla_put_u32(rsp, NETDEV_A_DMABUF_ID, binding->id); genlmsg_end(rsp, hdr); =20 + if (bind_dev !=3D netdev) + netdev_unlock(bind_dev); netdev_unlock(netdev); mutex_unlock(&priv->lock); =20 return genlmsg_reply(rsp, info); =20 +err_unlock_bind_dev: + if (bind_dev !=3D netdev) + netdev_unlock(bind_dev); err_unlock_netdev: netdev_unlock(netdev); err_unlock_sock: --=20 2.53.0-Meta From nobody Thu Jun 11 14:47:30 2026 Received: from mail-yx1-f46.google.com (mail-yx1-f46.google.com [74.125.224.46]) (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 13ED6392C52 for ; Thu, 14 May 2026 17:22:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778779373; cv=none; b=B9VcZEzQ4hVCu2/cGd3WdLRdk1rEuMRZvknE3d8R2C5PB4bnY9feam2L1O+8MmgU8I6w4LsLt/E8vlarpC83JjH6WGVPzEw6cSpwvMopVzMSLxjcYLYLQw9lXQG0vH++bdAVL5OY1M0xrMccQeai5Hb0qXn+ttl1pYG3AayM/jc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778779373; c=relaxed/simple; bh=1QC4PkD36OXhmrBejw/9qqlS5pST0Kv6rS1HYH/Wsr4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RZudS8AvHq6bjeEdcrI8uNX0+JV6GM3FhDB7dwRx+PGulX1dHp7lgsrvZY5Uz/w/FopySBMf3t8l93ZMX5FpmxoG+6Eetoj0kV5ab8wDO0376It7LBqFZoZBJZprVVV1f9LVrm4oy2A0X7xiib7tVYjewL6mQgyzGbk6vPKamAE= 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=ScAMzkbl; arc=none smtp.client-ip=74.125.224.46 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="ScAMzkbl" Received: by mail-yx1-f46.google.com with SMTP id 956f58d0204a3-654672a6d68so10325024d50.0 for ; Thu, 14 May 2026 10:22:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778779370; x=1779384170; 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=rXRLmOaeN9M4AwY3iBISX01P3DWw0uS/LnGVtbElBLg=; b=ScAMzkblT7qEDln9wMUuYFMaxTnmSPjhz0noMVYe7tl0vUi6ucNEVtdY1cJtNBOtjk sAymgASCXcLuM//46H/kTzQ6Xr66JALSSoTxBDDCqbtaKmbUHEv0kILlmm+pgzhqyZ9t XeZPotVpZWVdcSj/tELH6sFH51fzmyxwj7Bkh+RuuYR9aoSEr6tsfrED7itTGsnP3v1T 4Iu8SKZ+cn0XiwfBsw5mr5e5sZMa2I1GJ3pMTMssMBKwD5SC43//EIDoOtO1Xng9Qn2W vj8sSipZgjs6tqut4Kk4aFETcio9B28Xq7lS6Rd9M6cxZq/pGPCD4cnTIYSyziDQEgxk gQIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778779370; x=1779384170; 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=rXRLmOaeN9M4AwY3iBISX01P3DWw0uS/LnGVtbElBLg=; b=YSEctfiXhZ9+OtRUMSbQVIunoQ4s2S1tsBzcNI+l3D2XXoB9BKe8Xu/iu/W29QLVEa yS8rVNlqt84saEkUoGduwOsvMFSXVr6JJSj/QGZYeexkVeFhUEDqUO2pX+BNFN4SKC+d QYAz1zRZeZTOPnE6E9whd5a2bD+Citop9Ufic3CTtYWLImLsto+hwrPUowMuOVQJDV9Z 9lP+IxBvBJiZKQQgZloVY6FdSUK2hoaU0Pa39Xwlf2meffhJZ8Yu9ZHhdXi7m88Oc7+d MMuryQYT+N/sspv3/lbxhtUVkLYB713ieS3yZ49VEy2+4t6KSp7tVcT00A22jd49LUjy x1BA== X-Forwarded-Encrypted: i=1; AFNElJ+PHtHo+eFzblyf/5DjRmgkJlb+Q/kGDQVzQwxzbQnMH1xGgh267Rz0dwUmu8r04mlfRNYuAya+/NaG6Qc=@vger.kernel.org X-Gm-Message-State: AOJu0YxbOaHJQPxFqb4ZEL3ov2Xj8NZE70w1XYKH7K0fukC/fMuCtHqT OkPT3LeW5gv4Cys/Ts/T57REBfzqUD3nLk7O0lzl+K/K1LUNXNQAUO4y X-Gm-Gg: Acq92OHbV0uFU9nnZNivc1SQ7hQ8GfdhFoQdY0KPV4MDVvuqpw0Btnnd2l80vMVAUKz aHfaQxP/XDA596XpieqYgwj7Z4AvhVAL7JRNi/cGq28qMSzs/mj4U6a/PZ0cSdB/ZYvTw9NpJYk +DtLuj5QmTplPsLFFNPRI2KtgeNOC5IBcdmtfHrVFp+XeV8HkrIdgTzQs+Ys490rHhhlBK3m41d wbt4i6dRi8XcyMAM+rSJ4yqiisYOk3xE88ccTqe7+MM0Esg7zNC1nu1VNDEez0M0pvxnDKsqR6P RNMg/oLIkmfei0gp4PEWNAB3iCKu4neMFNHgMNzd0I2Y9iArQ+4y7wH0Nlhq6yz5GjGBAWvLkXi tAvxM0Ai0eMVDFlnlsX5sQsHXaBK6t/9KwcbMY33mQNowYtZx/lBVsUjCO+sT4GkCb5RevFjVga 1SrorSLDpX5e1+dygY3Uy/qA== X-Received: by 2002:a53:d046:0:10b0:65d:f14d:8651 with SMTP id 956f58d0204a3-65e226e0182mr151093d50.24.1778779369718; Thu, 14 May 2026 10:22:49 -0700 (PDT) Received: from localhost ([2a03:2880:f806:19::]) by smtp.gmail.com with ESMTPSA id 956f58d0204a3-65e0d8e701fsm1373608d50.8.2026.05.14.10.22.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 10:22:49 -0700 (PDT) From: Bobby Eshleman Date: Thu, 14 May 2026 10:22:31 -0700 Subject: [PATCH net-next v5 4/8] selftests: drv-net: ncdevmem: add -n flag to skip NIC configuration 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: <20260514-tcp-dm-netkit-v5-4-408c59b91e66@meta.com> References: <20260514-tcp-dm-netkit-v5-0-408c59b91e66@meta.com> In-Reply-To: <20260514-tcp-dm-netkit-v5-0-408c59b91e66@meta.com> To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Jonathan Corbet , Shuah Khan , Alex Shi , Yanteng Si , Dongliang Mu , Michael Chan , Pavan Chebbi , Joshua Washington , Harshitha Ramamurthy , Saeed Mahameed , Tariq Toukan , Mark Bloch , Leon Romanovsky , Alexander Duyck , kernel-team@meta.com, Daniel Borkmann , Nikolay Aleksandrov , Shuah Khan , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Jonathan Corbet , Shuah Khan , Alex Shi , Yanteng Si , Dongliang Mu , Michael Chan , Pavan Chebbi , Joshua Washington , Harshitha Ramamurthy , Saeed Mahameed , Tariq Toukan , Mark Bloch , Leon Romanovsky , Alexander Duyck , kernel-team@meta.com, Daniel Borkmann , Nikolay Aleksandrov , Shuah Khan Cc: dw@davidwei.uk, sdf.kernel@gmail.com, mohsin.bashr@gmail.com, willemb@google.com, jiang.kun2@zte.com.cn, xu.xin16@zte.com.cn, wang.yaxin@zte.com.cn, netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Stanislav Fomichev , Mina Almasry , netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Bobby Eshleman X-Mailer: b4 0.13.0 From: Bobby Eshleman Add a -n (skip_config) flag that causes ncdevmem to skip NIC configuration when operating as an RX server. When -n is passed, ncdevmem skips configuring header split, RSS, and flow steering, as well as their teardown on exit. This allows ksft tests to pre-configure the NIC in the host namespace before launching ncdevmem in the guest namespace. This is needed for netkit devmem tests where the test harness namespace has direct access to the NIC and the ncdevmem namespace does not. Acked-by: Stanislav Fomichev 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.53.0-Meta From nobody Thu Jun 11 14:47:30 2026 Received: from mail-yx1-f50.google.com (mail-yx1-f50.google.com [74.125.224.50]) (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 6EB02390CA6 for ; Thu, 14 May 2026 17:22:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778779374; cv=none; b=qpeDpMx9GEj/9lomj/ek3T8PHPr7xa6009MdR5fbWC2+ldU293OHF7Arrg+uBdQKNIU9ol0oQA4hJA5yxN/cmXDqQMX3upoJz7LuCn0+2OcGX8zkK7TkoLCFCHz2OBmnzOQh66neqM4L/H36tHzlQnVcfeCodV4ELgvaMUs+rek= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778779374; c=relaxed/simple; bh=wptIkvH9L489Qlo2T7M1mLc4bl4xRw6+9h17Bso5o/8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ftmA5ljfuZJCVnLSapFzmlNfidX0ilxBT2SJ/LEO5eGxkNbQGd7el3dyJJc6WyLKjJoI9/W4aT7tskvNRRgAJC42JmzcRccNBsK/r5goZxqNh5fa7lY37XvPMNKabiHjvvSzvKSQQ/wJsZlO/ZLbP5yTwcQ/lE4RUOINAtQpVy4= 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=enzGIqOg; arc=none smtp.client-ip=74.125.224.50 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="enzGIqOg" Received: by mail-yx1-f50.google.com with SMTP id 956f58d0204a3-65dd9b25829so4697509d50.3 for ; Thu, 14 May 2026 10:22:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778779371; x=1779384171; 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=9HA/ybwawhpYacQbiJl7tU2w4tisbAXIL92cuydme34=; b=enzGIqOgEYzB+6SyUyh1GN7EtLmoHeyU4CvqLV7imOsRX80EPJUvnhA3ePoLFNuydj B/G+6ZsDp+kP8XH3g1xVSDF0/cKMIrDRO6g55ZG+iTN2soA8hVtsjj2QTIJrpEYZgywK FSiblWES/YabS2q+5MgwDRaWlH+Ly+DiesfBjdZH15V8vVw3pvLaq8jxGJyTTBXBWhW/ Lm/TAjVgvgRfotf85PY/QPe5Kqg4w/qMGPqP7q1VUhIVSiiEiFf+JRQCbubeSgDTSvuE FAwHqUaD4TTxoMKrqt0a5tD/aaVaq5/S46IDFcC8LjQME9um8PmvbTgj+p0+widX/d3z fr8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778779371; x=1779384171; 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=9HA/ybwawhpYacQbiJl7tU2w4tisbAXIL92cuydme34=; b=ZClB8UK2qDCTiJbhJbpRueEXDWMe17Q+CWfKqE9fMdkMnWUwQsHy5idF7GAAGPL+Ip hMVDML1XVYlFyz6kg0FeXLmZaHY90ftMn9yDLE0+iWMzRjUkBIhtCsNH+lINDG48W+pw AlJew7Cma7NuN+SfxWORvESgze/2L3Z3LPd0o18D860Gc8IUzFTAgh+Lfyy6o9s36acA 6z0IdkjjCYFzvJ4l23VFmDrtcw5Ey3FmblnZG7CzHv/bP39+CJiUjAMS4OnpHcdHkLOy atetlqlWTBxyk6JykEtVGAQOrbw2nMPuj4NswlBIDaBnmu8NsJ+tJp0uuh7sj4ZMg1X+ DFUw== X-Forwarded-Encrypted: i=1; AFNElJ/fOTl1JvGC4igWRf3CgyEOKatbqCMzX5JKCW4oFN9RySPHVMU9lMfbOmoozy0w5hQNBCabF19XfAdn0ms=@vger.kernel.org X-Gm-Message-State: AOJu0YweJ3pS5fa+JYbz1IaAJS5ARQGTrRgffIS1ixKu0n9DmwFveD1y lG4nhydBxPPGHrY+r/I4VmNdW1cABPVRWKXF5pPZxMUNl6Qr2AGZSO9c X-Gm-Gg: Acq92OF/0oQ0LjH8CjjznOYgj1LPDo4ltMMk5GfPLPYnDziy4obWs5Maqp1BGcAUYRM RfESkAVuhjGBJgRtalQs66aRIiVz/StlwhPXuacpui3oSVPXVDUkjlCUN6Kdff67Czbi2iexNO5 IKEr8WJ7voWZQdWfpvelqiLJyVD2NWazi33H3vC4nGpQ3rtJTmJcN8QM5+IWyZnCmQ4m6ja+HQj otNLvo3jDrMd7jcZOrc9zdv23Oyn9SaaUUbyD/5+1yox8YszyCXOVgTFeQ58uooIUS/nYI8sZ1+ pRnf+9taAXet9kPS57/IP5eeiph9eqaJAyMnSv/ttHHoF6z0e4MkPyu9j/4Gamo3jX/3BIjsovd rYiGkDorRXm4dUdrLAPkdpq48TtyYXwA6E5G8/qWog/9DGZg9YmJ1CJ4xgbQrID/648TxV2B/hk YL2zUy2lem9NLcH0oOUcCV4w== X-Received: by 2002:a53:d051:0:20b0:650:ea3:de9b with SMTP id 956f58d0204a3-65e226de860mr156252d50.21.1778779371526; Thu, 14 May 2026 10:22:51 -0700 (PDT) Received: from localhost ([2a03:2880:f806:23::]) by smtp.gmail.com with ESMTPSA id 956f58d0204a3-65e0dbcda4bsm1363004d50.18.2026.05.14.10.22.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 10:22:51 -0700 (PDT) From: Bobby Eshleman Date: Thu, 14 May 2026 10:22:32 -0700 Subject: [PATCH net-next v5 5/8] selftests: drv-net: make attr _nk_guest_ifname public 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: <20260514-tcp-dm-netkit-v5-5-408c59b91e66@meta.com> References: <20260514-tcp-dm-netkit-v5-0-408c59b91e66@meta.com> In-Reply-To: <20260514-tcp-dm-netkit-v5-0-408c59b91e66@meta.com> To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Jonathan Corbet , Shuah Khan , Alex Shi , Yanteng Si , Dongliang Mu , Michael Chan , Pavan Chebbi , Joshua Washington , Harshitha Ramamurthy , Saeed Mahameed , Tariq Toukan , Mark Bloch , Leon Romanovsky , Alexander Duyck , kernel-team@meta.com, Daniel Borkmann , Nikolay Aleksandrov , Shuah Khan , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Jonathan Corbet , Shuah Khan , Alex Shi , Yanteng Si , Dongliang Mu , Michael Chan , Pavan Chebbi , Joshua Washington , Harshitha Ramamurthy , Saeed Mahameed , Tariq Toukan , Mark Bloch , Leon Romanovsky , Alexander Duyck , kernel-team@meta.com, Daniel Borkmann , Nikolay Aleksandrov , Shuah Khan Cc: dw@davidwei.uk, sdf.kernel@gmail.com, mohsin.bashr@gmail.com, willemb@google.com, jiang.kun2@zte.com.cn, xu.xin16@zte.com.cn, wang.yaxin@zte.com.cn, netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Stanislav Fomichev , Mina Almasry , netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Bobby Eshleman X-Mailer: b4 0.13.0 From: Bobby Eshleman Subsequent patches will use the _nk_guest_ifname as a public attr for setting up devmem. Rename to nk_guest_ifname to avoid angering the linter about the '_' prefix being used for a non-private attr. Acked-by: Stanislav Fomichev Signed-off-by: Bobby Eshleman --- tools/testing/selftests/drivers/net/hw/nk_qlease.py | 8 ++++---- tools/testing/selftests/drivers/net/lib/py/env.py | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tools/testing/selftests/drivers/net/hw/nk_qlease.py b/tools/te= sting/selftests/drivers/net/hw/nk_qlease.py index aa83dc321328..139a91ebd229 100755 --- a/tools/testing/selftests/drivers/net/hw/nk_qlease.py +++ b/tools/testing/selftests/drivers/net/hw/nk_qlease.py @@ -71,7 +71,7 @@ def test_iou_zcrx(cfg) -> None: flow_rule_id =3D set_flow_rule(cfg) defer(ethtool, f"-N {cfg.ifname} delete {flow_rule_id}") =20 - rx_cmd =3D f"ip netns exec {cfg.netns.name} {cfg.bin_local} -s -p {cfg= .port} -i {cfg._nk_guest_ifname} -q {cfg.nk_queue}" + rx_cmd =3D f"ip netns exec {cfg.netns.name} {cfg.bin_local} -s -p {cfg= .port} -i {cfg.nk_guest_ifname} -q {cfg.nk_queue}" tx_cmd =3D f"{cfg.bin_remote} -c -h {cfg.nk_guest_ipv6} -p {cfg.port} = -l 12840" with bkg(rx_cmd, exit_wait=3DTrue): wait_port_listen(cfg.port, proto=3D"tcp", ns=3Dcfg.netns) @@ -128,7 +128,7 @@ def test_attach_xdp_with_mp(cfg) -> None: =20 netdevnl =3D NetdevFamily() =20 - rx_cmd =3D f"ip netns exec {cfg.netns.name} {cfg.bin_local} -s -p {cfg= .port} -i {cfg._nk_guest_ifname} -q {cfg.nk_queue}" + rx_cmd =3D f"ip netns exec {cfg.netns.name} {cfg.bin_local} -s -p {cfg= .port} -i {cfg.nk_guest_ifname} -q {cfg.nk_queue}" with bkg(rx_cmd): wait_port_listen(cfg.port, proto=3D"tcp", ns=3Dcfg.netns) =20 @@ -178,7 +178,7 @@ def test_destroy(cfg) -> None: ethtool(f"-X {cfg.ifname} equal {cfg.src_queue}") defer(ethtool, f"-X {cfg.ifname} default") =20 - rx_cmd =3D f"ip netns exec {cfg.netns.name} {cfg.bin_local} -s -p {cfg= .port} -i {cfg._nk_guest_ifname} -q {cfg.nk_queue}" + rx_cmd =3D f"ip netns exec {cfg.netns.name} {cfg.bin_local} -s -p {cfg= .port} -i {cfg.nk_guest_ifname} -q {cfg.nk_queue}" rx_proc =3D cmd(rx_cmd, background=3DTrue) wait_port_listen(cfg.port, proto=3D"tcp", ns=3Dcfg.netns) =20 @@ -196,7 +196,7 @@ def test_destroy(cfg) -> None: ip(f"link del dev {cfg._nk_host_ifname}") kill_timer.join() cfg._nk_host_ifname =3D None - cfg._nk_guest_ifname =3D None + cfg.nk_guest_ifname =3D None =20 queue_info =3D netdevnl.queue_get( {"ifindex": cfg.ifindex, "id": cfg.src_queue, "type": "rx"} diff --git a/tools/testing/selftests/drivers/net/lib/py/env.py b/tools/test= ing/selftests/drivers/net/lib/py/env.py index 24ce122abd9c..409b41922245 100644 --- a/tools/testing/selftests/drivers/net/lib/py/env.py +++ b/tools/testing/selftests/drivers/net/lib/py/env.py @@ -339,7 +339,7 @@ class NetDrvContEnv(NetDrvEpEnv): def __init__(self, src_path, rxqueues=3D1, **kwargs): self.netns =3D None self._nk_host_ifname =3D None - self._nk_guest_ifname =3D None + self.nk_guest_ifname =3D None self._tc_clsact_added =3D False self._tc_attached =3D False self._bpf_prog_pref =3D None @@ -390,7 +390,7 @@ class NetDrvContEnv(NetDrvEpEnv): =20 netkit_links.sort(key=3Dlambda x: x['ifindex']) self._nk_host_ifname =3D netkit_links[1]['ifname'] - self._nk_guest_ifname =3D netkit_links[0]['ifname'] + self.nk_guest_ifname =3D netkit_links[0]['ifname'] self.nk_host_ifindex =3D netkit_links[1]['ifindex'] self.nk_guest_ifindex =3D netkit_links[0]['ifindex'] =20 @@ -409,7 +409,7 @@ class NetDrvContEnv(NetDrvEpEnv): if self._nk_host_ifname: cmd(f"ip link del dev {self._nk_host_ifname}") self._nk_host_ifname =3D None - self._nk_guest_ifname =3D None + self.nk_guest_ifname =3D None =20 if self._init_ns_attached: cmd("ip netns del init", fail=3DFalse) @@ -448,16 +448,16 @@ class NetDrvContEnv(NetDrvEpEnv): cmd("ip netns attach init 1") self._init_ns_attached =3D True ip("netns set init 0", ns=3Dself.netns) - ip(f"link set dev {self._nk_guest_ifname} netns {self.netns.name}") + ip(f"link set dev {self.nk_guest_ifname} netns {self.netns.name}") ip(f"link set dev {self._nk_host_ifname} up") ip(f"-6 addr add fe80::1/64 dev {self._nk_host_ifname} nodad") ip(f"-6 route add {self.nk_guest_ipv6}/128 via fe80::2 dev {self._= nk_host_ifname}") =20 ip("link set lo up", ns=3Dself.netns) - ip(f"link set dev {self._nk_guest_ifname} up", ns=3Dself.netns) - ip(f"-6 addr add fe80::2/64 dev {self._nk_guest_ifname}", ns=3Dsel= f.netns) - 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) + ip(f"link set dev {self.nk_guest_ifname} up", ns=3Dself.netns) + ip(f"-6 addr add fe80::2/64 dev {self.nk_guest_ifname}", ns=3Dself= .netns) + ip(f"-6 addr add {self.nk_guest_ipv6}/64 dev {self.nk_guest_ifname= } nodad", ns=3Dself.netns) + ip(f"-6 route add default via fe80::1 dev {self.nk_guest_ifname}",= ns=3Dself.netns) =20 def _tc_ensure_clsact(self): qdisc =3D json.loads(cmd(f"tc -j qdisc show dev {self.ifname}").st= dout) --=20 2.53.0-Meta From nobody Thu Jun 11 14:47:30 2026 Received: from mail-ot1-f43.google.com (mail-ot1-f43.google.com [209.85.210.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 2153E397E8A for ; Thu, 14 May 2026 17:22:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778779377; cv=none; b=P+DBvOxo5oMomM1UR1skClgWbWOm5phieClLJO4KWrfkHlLKcQIk+HMNRal6SSLyKeFusYxyfdJ0S7rsuo4IV/ryELZ/A+9A2mWe0/3HTnfehrU65N6EXP/hIQyqO9Rn9PKjeX+OP+A7UshUllHezt4ol7AK7Rx9bZXAnM3qg9s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778779377; c=relaxed/simple; bh=EU9ZBpoJdaFxYKpmawY9mdzykXKbvRFYJxugsw9Mas4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=K1TK/EvHly8yv7n7dR2cIZlD7UgQOf219qXxU4b1s1wVrTxqAVDJ/F0plK0hxP3BGaOKJybdSzUm9PNBiiPdpjgk3muIxLLiHBP5Qu6QFVsoPJ6c80nkscUKJZy/6oGdhXb0hCIRR2VsupnVPPaIA1WM9Qv2WUoniV6BIuztanU= 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=QRLIfVF4; arc=none smtp.client-ip=209.85.210.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="QRLIfVF4" Received: by mail-ot1-f43.google.com with SMTP id 46e09a7af769-7de4e6c5a30so8892981a34.0 for ; Thu, 14 May 2026 10:22:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778779373; x=1779384173; 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=nY0dwvbA6qJ8JWuyPiT/5d1TzcV7OfD48oBbWXIaXRM=; b=QRLIfVF45inj6qN/QffwY3nqlkccXmMjtqN7oTfPaG+ndIULZDH2tC2iuEUCxQRFpN aTq3gFLK9MlJOs7f/9B78Pp1laNZwpzhyxF//KHn4Ytt4uvnZJ/v/zN8AjKUVIMR+41r zdSq6Kej3xhRvdjDNGhfnpqABpch5gvzP01GC0FNQO0CzAFbR9AkFS+RAC1p7C3g6pvc 31PIBsNj9CpT9Tv/E83JONf+msuKNJkeQwZeSXnVpwWe3VRBffRLhn74Id6BRbD5ce/Q 0m4is7lvbcbTfN0dbDDL+fR4etls2lKXzxvW3Bp6QN8Odfk7oLYMAKqhsg2pQEbPZhtV l42A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778779373; x=1779384173; 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=nY0dwvbA6qJ8JWuyPiT/5d1TzcV7OfD48oBbWXIaXRM=; b=cCNVXkeuSlCNHSvtKoOJQmVO3jc9lP4Of3Js76JTlAWkcRduujivaaEQx4puafU7x1 Ql61Ve2VAiivLFUfZ1k2ZLg5CrtWkX6A3ul+M8s4VeLltx3N7zgFRGO5Q3FYR1gNoafa WLmWNUpPmx7eTORzrk8xlblCMZ1os4mcs/Iptz9Yy4tbcPdsBOglJTzfDaJY96ILzIhR K2U/gL4dKlKdf3t6uOTzvPjaoMG/6BH+ig0mDzl+tznYFGETf2a6RidnweHxTC64YC7Q XXojzSYYsI43IdThNPxymlh/C8N3SRGUyRdAUUJUTJETo2jvlsq3Hj68/VzGSpFnfvR3 1u5Q== X-Forwarded-Encrypted: i=1; AFNElJ97qIba6AR1WEHTUtD2BAXX5rVijrPdjK/IadUDAv+WPLu+VXoSwbd+2nwMh+eh12Na1cjC0kXkz4GbHxM=@vger.kernel.org X-Gm-Message-State: AOJu0YyO01pAOQ8/lKV8ih35bNN5NpiIsyMJkPExl0M7pMGk0c5fQcwt T8w1TGsBL7f8PYhbDN2DWPdVbzPA122huePvEFyzOnAp7YNCQuGky9Y5 X-Gm-Gg: Acq92OHDV9VG/3nOl4U1DW3FsGgONEXFQ5rnFh2Y+TBnECbgFsKMXAL7PvgRhY1jrlo 6fXZUezcbIWX2anzwcSA3n1+gdB8PpO6c+skil57G1gXDyv1b+lTsFm+KpqoCOYboRBPIqoBeG+ +CrEDGM7IapjAynLWZfe9kDWZZhTtXS/5yS3fxePORwtQ1L1CjVxLeDwTzCqbp5pfD8jYDv5p4+ wHnS3LZDnwCOEOqFDuOo3Z5CQMReDeOt33kgtNllSUizDmoB4Q+AZURBrpc+9f/0weaaDpTf7pk mh2JzMZLdttkqsmS8fhkE4tp3xwZiwWDx7ppclOLMQrPMsDOp+Zq34ddeJM5Y/dgWSWwxCeVeNk aiKWiQEs551qxNc6ZDHC1/HJsR2wnVkfxgT2B0ORcqfzyasIsfB0wtvoQ2+oaMDk6t96+qxA6a0 aJPc/WKvbNshtPisXH5UxV3w== X-Received: by 2002:a05:6820:1525:b0:69b:8c27:8b7 with SMTP id 006d021491bc7-69c9bfc7be6mr187297eaf.56.1778779373011; Thu, 14 May 2026 10:22:53 -0700 (PDT) Received: from localhost ([2a03:2880:f812:16::]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-439fc4d7ff3sm2266976fac.9.2026.05.14.10.22.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 10:22:52 -0700 (PDT) From: Bobby Eshleman Date: Thu, 14 May 2026 10:22:33 -0700 Subject: [PATCH net-next v5 6/8] selftests: drv-net: refactor devmem command builders into lib module 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: <20260514-tcp-dm-netkit-v5-6-408c59b91e66@meta.com> References: <20260514-tcp-dm-netkit-v5-0-408c59b91e66@meta.com> In-Reply-To: <20260514-tcp-dm-netkit-v5-0-408c59b91e66@meta.com> To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Jonathan Corbet , Shuah Khan , Alex Shi , Yanteng Si , Dongliang Mu , Michael Chan , Pavan Chebbi , Joshua Washington , Harshitha Ramamurthy , Saeed Mahameed , Tariq Toukan , Mark Bloch , Leon Romanovsky , Alexander Duyck , kernel-team@meta.com, Daniel Borkmann , Nikolay Aleksandrov , Shuah Khan , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Jonathan Corbet , Shuah Khan , Alex Shi , Yanteng Si , Dongliang Mu , Michael Chan , Pavan Chebbi , Joshua Washington , Harshitha Ramamurthy , Saeed Mahameed , Tariq Toukan , Mark Bloch , Leon Romanovsky , Alexander Duyck , kernel-team@meta.com, Daniel Borkmann , Nikolay Aleksandrov , Shuah Khan Cc: dw@davidwei.uk, sdf.kernel@gmail.com, mohsin.bashr@gmail.com, willemb@google.com, jiang.kun2@zte.com.cn, xu.xin16@zte.com.cn, wang.yaxin@zte.com.cn, netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Stanislav Fomichev , Mina Almasry , netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Bobby Eshleman X-Mailer: b4 0.13.0 From: Bobby Eshleman Adding netkit-based devmem tests is a straight-forward copy of devmem test commands plus some args for the nk cases, so this patch breaks out these command builders into helpers used by both. Though we tried to avoid libraries to avoid increasing the barrier of entry/complexity (see selftests/drivers/net/README.md, section "Avoid libraries and frameworks"), factoring out these functions seemed like the lesser of two evils in this case of using the same commands, just with slightly different args per environment. I experimented with just having all of the tests in the same file to avoid having helpers in a library file, but because ksft_run() is limited to a single call per file, and the new tests will require different environments (NetDrvContEnv/NetDrvEpEnv), it would have been necessary to have each test set up its own environment instead of sharing one for the entire ksft_run() run. This came at the cost of ballooning the test time (from under 5s to 30s on my test system), so to strike a balance these tests were placed in separate files so they could keep a shared environment across a single ksft_run() run shared across all tests using the same env type (introduced in subsequent patches). The helpers work transparently with both plain and netkit environments by inspecting cfg for netkit-specific attributes (netns, nk_queue, etc...). Acked-by: Stanislav Fomichev Signed-off-by: Bobby Eshleman --- Changes in v5: - Place the shared helpers in devmem_lib.py next to the test scripts rather than under lib/py/ (Jakub). - Add devmem_lib.py to TEST_FILES (Jakub). - configure_nic(): register cleanup via defer() and drop the separate cleanup_nic() helper. (Sashiko) - Move configure_nic() into the run_*() helpers (with an early return outside a netkit env) so the queue lease doesn't break require_devmem()'s bind-rx check. - Make the queue lease idempotent across run_*() calls. - Fix pylint import-error and import-order. Changes in v4: - Fixed bad change list version, v4 -> v3 (Stan) Changes in v3: - Make socat_send() always bind the source; drop its bind=3D parameter and the matching bind=3Dnot_ns at the run_rx call site. - Drop socat_send()'s nodelay=3D arg; have buf_size>0 imply TCP_NODELAY since they are only meaningful together. - configure_nic(): stash originals on cfg instead of using defer(); add paired cleanup_nic() helper. Drop the per-test configure_nic() calls from run_rx/run_tx/run_tx_chunks/run_rx_hds; the netkit test file invokes configure_nic/cleanup_nic once around ksft_run(). - make cfg.devmem_supported and cfg.devmem_probed public attrs (no '_') for sake of linting - general cleanup of the code, linting fixes - In setup_test, drop the unused cfg.listen_ns =3D getattr(cfg, 'netns', None) assignment. - In run_rx, pass flow_steer=3Dnot_ns to ncdevmem_rx and bind=3Dnot_ns to socat_send to avoid changing functionality (we want just a straight refactor here) Changes in v2: - Move require_devmem() into individual test functions so KsftSkipEx goes u= p to ksft_run() (Sashiko) - in ncdevmem_rx(), move -v 7 to take effect for both netns and non-netns when verify=3DTrue --- tools/testing/selftests/drivers/net/hw/Makefile | 1 + tools/testing/selftests/drivers/net/hw/devmem.py | 77 ++----- .../testing/selftests/drivers/net/hw/devmem_lib.py | 222 +++++++++++++++++= ++++ 3 files changed, 236 insertions(+), 64 deletions(-) diff --git a/tools/testing/selftests/drivers/net/hw/Makefile b/tools/testin= g/selftests/drivers/net/hw/Makefile index 82809d5b2478..5e49d7bffced 100644 --- a/tools/testing/selftests/drivers/net/hw/Makefile +++ b/tools/testing/selftests/drivers/net/hw/Makefile @@ -52,6 +52,7 @@ TEST_PROGS =3D \ # =20 TEST_FILES :=3D \ + devmem_lib.py \ ethtool_lib.sh \ # =20 diff --git a/tools/testing/selftests/drivers/net/hw/devmem.py b/tools/testi= ng/selftests/drivers/net/hw/devmem.py index ee863e90d1e0..031cf9905f65 100755 --- a/tools/testing/selftests/drivers/net/hw/devmem.py +++ b/tools/testing/selftests/drivers/net/hw/devmem.py @@ -2,91 +2,40 @@ # SPDX-License-Identifier: GPL-2.0 =20 from os import path -from lib.py import ksft_run, ksft_exit -from lib.py import ksft_eq, KsftSkipEx +from devmem_lib import setup_test, run_rx, run_tx, run_tx_chunks, run_rx_h= ds +from lib.py import ksft_run, ksft_exit, ksft_disruptive from lib.py import NetDrvEpEnv -from lib.py import bkg, cmd, rand_port, wait_port_listen -from lib.py import ksft_disruptive - - -def require_devmem(cfg): - if not hasattr(cfg, "_devmem_probed"): - probe_command =3D f"{cfg.bin_local} -f {cfg.ifname}" - cfg._devmem_supported =3D cmd(probe_command, fail=3DFalse, shell= =3DTrue).ret =3D=3D 0 - cfg._devmem_probed =3D True - - if not cfg._devmem_supported: - raise KsftSkipEx("Test requires devmem support") =20 =20 @ksft_disruptive def check_rx(cfg) -> None: - require_devmem(cfg) - - port =3D rand_port() - socat =3D f"socat -u - TCP{cfg.addr_ipver}:{cfg.baddr}:{port},bind=3D{= cfg.remote_baddr}:{port}" - listen_cmd =3D f"{cfg.bin_local} -l -f {cfg.ifname} -s {cfg.addr} -p {= port} -c {cfg.remote_addr} -v 7" - - with bkg(listen_cmd, exit_wait=3DTrue) as ncdevmem: - wait_port_listen(port) - cmd(f"yes $(echo -e \x01\x02\x03\x04\x05\x06) | \ - head -c 1K | {socat}", host=3Dcfg.remote, shell=3DTrue) - - ksft_eq(ncdevmem.ret, 0) + """Run the devmem RX test.""" + run_rx(cfg) =20 =20 @ksft_disruptive def check_tx(cfg) -> None: - require_devmem(cfg) - - port =3D rand_port() - listen_cmd =3D f"socat -U - TCP{cfg.addr_ipver}-LISTEN:{port}" - - with bkg(listen_cmd, host=3Dcfg.remote, exit_wait=3DTrue) as socat: - wait_port_listen(port, host=3Dcfg.remote) - cmd(f"echo -e \"hello\\nworld\"| {cfg.bin_local} -f {cfg.ifname} -= s {cfg.remote_addr} -p {port}", shell=3DTrue) - - ksft_eq(socat.stdout.strip(), "hello\nworld") + """Run the devmem TX test.""" + run_tx(cfg) =20 =20 @ksft_disruptive def check_tx_chunks(cfg) -> None: - require_devmem(cfg) - - port =3D rand_port() - listen_cmd =3D f"socat -U - TCP{cfg.addr_ipver}-LISTEN:{port}" - - with bkg(listen_cmd, host=3Dcfg.remote, exit_wait=3DTrue) as socat: - wait_port_listen(port, host=3Dcfg.remote) - cmd(f"echo -e \"hello\\nworld\"| {cfg.bin_local} -f {cfg.ifname} -= s {cfg.remote_addr} -p {port} -z 3", shell=3DTrue) - - ksft_eq(socat.stdout.strip(), "hello\nworld") + """Run the devmem TX chunking test.""" + run_tx_chunks(cfg) =20 =20 def check_rx_hds(cfg) -> None: - """Test HDS splitting across payload sizes.""" - require_devmem(cfg) - - for size in [1, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192]: - port =3D rand_port() - listen_cmd =3D f"{cfg.bin_local} -L -l -f {cfg.ifname} -s {cfg.add= r} -p {port}" - - with bkg(listen_cmd, exit_wait=3DTrue) as ncdevmem: - wait_port_listen(port) - cmd(f"dd if=3D/dev/zero bs=3D{size} count=3D1 2>/dev/null | " + - f"socat -b {size} -u - TCP{cfg.addr_ipver}:{cfg.baddr}:{po= rt},nodelay", - host=3Dcfg.remote, shell=3DTrue) - - ksft_eq(ncdevmem.ret, 0, f"HDS failed for payload size {size}") + """Run the HDS test.""" + run_rx_hds(cfg) =20 =20 def main() -> None: + """Run the devmem test cases.""" with NetDrvEpEnv(__file__) as cfg: - cfg.bin_local =3D path.abspath(path.dirname(__file__) + "/ncdevmem= ") - cfg.bin_remote =3D cfg.remote.deploy(cfg.bin_local) - + setup_test(cfg, path.abspath(path.dirname(__file__) + "/ncdevmem")) ksft_run([check_rx, check_tx, check_tx_chunks, check_rx_hds], - args=3D(cfg, )) + args=3D(cfg,)) ksft_exit() =20 =20 diff --git a/tools/testing/selftests/drivers/net/hw/devmem_lib.py b/tools/t= esting/selftests/drivers/net/hw/devmem_lib.py new file mode 100644 index 000000000000..0921ff03eb81 --- /dev/null +++ b/tools/testing/selftests/drivers/net/hw/devmem_lib.py @@ -0,0 +1,222 @@ +# SPDX-License-Identifier: GPL-2.0 +"""Shared helpers for devmem TCP selftests.""" + +import re + +from lib.py import (bkg, cmd, defer, ethtool, rand_port, wait_port_listen, + ksft_eq, KsftSkipEx, NetNSEnter, EthtoolFamily, + NetdevFamily) + + +def require_devmem(cfg): + """Probe ncdevmem on cfg.ifname and SKIP the test if devmem isn't supp= orted.""" + if not hasattr(cfg, "devmem_probed"): + probe_command =3D f"{cfg.bin_local} -f {cfg.ifname}" + cfg.devmem_supported =3D cmd(probe_command, fail=3DFalse, shell=3D= True).ret =3D=3D 0 + cfg.devmem_probed =3D True + + if not cfg.devmem_supported: + raise KsftSkipEx("Test requires devmem support") + + +def configure_nic(cfg): + """Channels, rings, RSS, queue lease for netkit devmem.""" + if not hasattr(cfg, 'netns'): + return + + 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}}) + orig_rx_rings =3D rings['rx'] + orig_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, orig_rx_rings)}) + defer(ethnl.rings_set, {'header': {'dev-index': cfg.ifindex}, + 'tcp-data-split': orig_data_split, + 'hds-thresh': orig_hds_thresh, + 'rx': orig_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 not hasattr(cfg, 'nk_queue'): + 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 set_flow_rule(cfg, port): + """Install a flow rule steering to src_queue and return the flow rule = ID.""" + output =3D ethtool( + f"-N {cfg.ifname} flow-type tcp6 dst-port {port}" + f" action {cfg.src_queue}" + ).stdout + return int(re.search(r'ID (\d+)', output).group(1)) + + +def ncdevmem_rx(cfg, port, verify=3DTrue, fail_on_linear=3DFalse, flow_ste= er=3DFalse): + """Build the ncdevmem RX listener command.""" + if hasattr(cfg, 'netns'): + flow_rule_id =3D set_flow_rule(cfg, port) + defer(ethtool, f"-N {cfg.ifname} delete {flow_rule_id}") + + ifname =3D cfg.nk_guest_ifname + addr =3D cfg.nk_guest_ipv6 + extras =3D [f"-t {cfg.nk_queue}", "-q 1", "-n"] + else: + ifname =3D cfg.ifname + addr =3D cfg.addr + extras =3D [] + if flow_steer: + extras.append(f"-c {cfg.remote_addr}") + + if verify: + extras.append("-v 7") + if fail_on_linear: + extras.append("-L") + + parts =3D [cfg.bin_local, "-l", f"-f {ifname}", f"-s {addr}", + f"-p {port}", *extras] + return " ".join(parts) + + +def ncdevmem_tx(cfg, port, chunk_size=3D0): + """Build the ncdevmem TX send command.""" + if hasattr(cfg, 'netns'): + ifname =3D cfg.nk_guest_ifname + addr =3D cfg.remote_addr_v['6'] + extras =3D ["-t 0", "-q 1", "-n"] + else: + ifname =3D cfg.ifname + addr =3D cfg.remote_addr + extras =3D [] + + if chunk_size: + extras.append(f"-z {chunk_size}") + + parts =3D [cfg.bin_local, f"-f {ifname}", f"-s {addr}", + f"-p {port}", *extras] + return " ".join(parts) + + +def socat_send(cfg, port, buf_size=3D0): + """Socat command for sending to the devmem listener. + + When buf_size > 0, force one TCP segment per write of exactly that siz= e by + setting socat's buffer (-b) and disabling Nagle (TCP_NODELAY). + """ + proto =3D f"TCP{cfg.addr_ipver}" + + if hasattr(cfg, 'netns'): + addr =3D f"[{cfg.nk_guest_ipv6}]" + else: + addr =3D cfg.baddr + + suffix =3D f",bind=3D{cfg.remote_baddr}:{port}" + + buf =3D "" + if buf_size: + buf =3D f"-b {buf_size}" + suffix +=3D ",nodelay" + + return f"socat {buf} -u - {proto}:{addr}:{port}{suffix}" + + +def socat_listen(cfg, port): + """Socat listen command for TX tests.""" + return f"socat -U - TCP{cfg.addr_ipver}-LISTEN:{port}" + + +def setup_test(cfg, bin_local): + """Stash the local ncdevmem path on cfg and deploy it to the remote.""" + cfg.bin_local =3D bin_local + cfg.bin_remote =3D cfg.remote.deploy(cfg.bin_local) + + +def run_rx(cfg): + """Run the devmem RX test.""" + require_devmem(cfg) + configure_nic(cfg) + port =3D rand_port() + socat =3D socat_send(cfg, port) + data_pipe =3D (f"yes $(echo -e \x01\x02\x03\x04\x05\x06) | head -c 1K" + f" | {socat}") + netns =3D getattr(cfg, "netns", None) + + listen_cmd =3D ncdevmem_rx(cfg, port, flow_steer=3Dnot hasattr(cfg, 'n= etns')) + with bkg(listen_cmd, exit_wait=3DTrue, ns=3Dnetns) as ncdevmem: + wait_port_listen(port, proto=3D"tcp", ns=3Dnetns) + cmd(data_pipe, host=3Dcfg.remote, shell=3DTrue) + ksft_eq(ncdevmem.ret, 0) + + +def run_tx(cfg): + """Run the devmem TX test.""" + require_devmem(cfg) + configure_nic(cfg) + netns =3D getattr(cfg, "netns", None) + port =3D rand_port() + tx_cmd =3D ncdevmem_tx(cfg, port) + listen_cmd =3D socat_listen(cfg, port) + + with bkg(listen_cmd, host=3Dcfg.remote, exit_wait=3DTrue) as socat: + wait_port_listen(port, host=3Dcfg.remote) + cmd(f"bash -c 'echo -e \"hello\\nworld\" | {tx_cmd}'", ns=3Dnetns,= shell=3DTrue) + ksft_eq(socat.stdout.strip(), "hello\nworld") + + +def run_tx_chunks(cfg): + """Run the devmem TX chunking test.""" + require_devmem(cfg) + configure_nic(cfg) + netns =3D getattr(cfg, "netns", None) + port =3D rand_port() + tx_cmd =3D ncdevmem_tx(cfg, port, chunk_size=3D3) + listen_cmd =3D socat_listen(cfg, port) + + with bkg(listen_cmd, host=3Dcfg.remote, exit_wait=3DTrue) as socat: + wait_port_listen(port, host=3Dcfg.remote) + cmd(f"bash -c 'echo -e \"hello\\nworld\" | {tx_cmd}'", ns=3Dnetns,= shell=3DTrue) + ksft_eq(socat.stdout.strip(), "hello\nworld") + + +def run_rx_hds(cfg): + """Run the HDS test by running devmem RX across a segment size sweep."= "" + require_devmem(cfg) + configure_nic(cfg) + netns =3D getattr(cfg, "netns", None) + + for size in [1, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192]: + port =3D rand_port() + + listen_cmd =3D ncdevmem_rx(cfg, port, verify=3DFalse, + fail_on_linear=3DTrue) + socat =3D socat_send(cfg, port, buf_size=3Dsize) + + with bkg(listen_cmd, exit_wait=3DTrue, ns=3Dnetns) as ncdevmem: + wait_port_listen(port, proto=3D"tcp", ns=3Dnetns) + cmd(f"dd if=3D/dev/zero bs=3D{size} count=3D1 2>/dev/null | " + f"{socat}", host=3Dcfg.remote, shell=3DTrue) + ksft_eq(ncdevmem.ret, 0, f"HDS failed for payload size {size}") --=20 2.53.0-Meta From nobody Thu Jun 11 14:47:30 2026 Received: from mail-pf1-f178.google.com (mail-pf1-f178.google.com [209.85.210.178]) (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 92F2D39A068 for ; Thu, 14 May 2026 17:22:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778779381; cv=none; b=HZDPNgbqjngiOj1VB+0HpUSRapTNU5B4gkLNTTKEVQBDyBKmhtOzp+ayY+OiQLyZE4YH9ndZ3s7BsPIMKYWRqUTXizqtiu2x+IRprSPpOfe5lYMLVlivUK64fKvi2cNJf8C1sajO/D35PVnfEzEKppb9+d1XrULWnCskc7Hs0vg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778779381; c=relaxed/simple; bh=1B5WmvIXKayyC0J1kIEzwUa1npVuZacKTjKHONiDIzw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZX3UDvi/OKyJo9/oEtpsDYlNJ2r2BKeLb3pswbhsnsnawxLenFBIkAYz2eZxesBdrPHhl5rsKaCH2OOr3azo7ZMc2bzeFntEaqcl8MLOqk7H/+b5mBE4Ksa5g3F+u4tkc3cwQE1XOTWr79RLZgu8HIoiWYBNn4T3JuxhlP6WP7s= 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=UGtVw3d6; arc=none smtp.client-ip=209.85.210.178 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="UGtVw3d6" Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-83ef1d17904so3074389b3a.1 for ; Thu, 14 May 2026 10:22:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778779378; x=1779384178; 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=ruCmrFi4ZZAtIJvShmwp8WknmatgfQD4UVTCxiwhorw=; b=UGtVw3d6oT2+cXGA+1nLce3MUwWXzKvbci6CTKRXULPcqyGpIovU/GX/URXaqHpDAP n6cW214LX7B8X8XOoxRW8VJrNXf2LnMC+eburguuCutgHy/bNJ41nhGjN3hUoet2gL6U NPAEZ+27X1zOhV97IXKVd/5ymd73IodS1UJQdO1r/ZwMRDuYHoyV/3yV4WHv2ozqExSy YrE/gmKsVb8Xrm2N9jZIGQ3dPwJf7AxiWPQBISbIob52rw8GhOtF0a6m8HT5Vhk82lYz N8HJ4X8yFfST/obqZpIGyadRRxzqVI1vSlnTx4+R+o+jUgwtfzIALdA/rZF9U75/mCsx DU+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778779378; x=1779384178; 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=ruCmrFi4ZZAtIJvShmwp8WknmatgfQD4UVTCxiwhorw=; b=YD0zNmIN6vfhOY4/uQGA9lrDVgLrDyqXkas48lyQ8Lh6jBXRFfgCyFbi56gtHtrXOM xEwE14p682o82YO604UT5UErTjMxK1n3Pfq/ogAesBfEEghm1CARIMUD7quASlGWYZC/ G95Co4QrARAdIUN57rWv+Bu14OWnqwQ6W1q9clbFyHCpwhXymM7KUKQIuc+HcfLcj8qE ImcFGVBoOtn10Rd6hgWqG/DHCeIt+rWJLRQy4r9ad4YTvRuuIkIS4PtyrdM0ZcIyBpis /2WajTf01WM2RglGRb+CPcFeEpBAhEAeZZD8rPrGCfE2enETkrGcHfu6ULxJzMh4GJPI 4QiA== X-Forwarded-Encrypted: i=1; AFNElJ8pMA30FYju2dX4tXUtY9NcxP9WmyFXQ4jjBb3aL5u3eqYDgVgks4LrzLYgUiBTZU1bDJu1tdKNJ70sVOU=@vger.kernel.org X-Gm-Message-State: AOJu0Ywr+3CCNyJGU+LQ5ra7s/MpBkRMveBkFJwFuHjsImDnePNtdRVU bDUo2RMC8X+KvJw7ZmAxRAMnV6g8EYbtcBMhDGp4qyhVYvsX45k+jxiX X-Gm-Gg: Acq92OFuCH8YI4IudipdcpJaFIxE67ewE7TXGsdee+esdy3m5gG2/BPekzvSMV/Ldoe o6y6WT0TdGRYWlqeVy3cv0lIwTveQm8XgDSwIDS/qo1ywP7njjX3qySN5WWJTn1e3aEP1n9KW54 pXvU0CyFbCLG0gwha+0+CiEocuXEgSJB4FH7rx6E6MFvgziyKl+EiLcvf97FqwzAjua1nXQ95lU 0IXvpBy2cAacqXSnrEjpCV5krYWj0gVxUsOnMDYQrof5a9dRx17za3Gki5SbaMe5brqExGyL9Rq b/p2zuPvKteBCXpbBPdRt2ByHIElPKVrzOWDVd9tRch7DonwBrgIC2TJa+PsYjjVCvY7VGVmLaR 7avuVgSoYVlAkOb7BKcl4+mBTljJTH9uqFLYvSz5bjITweMBY/onJgQYetxYeFNf8nPCPYrR+KQ BJFeM60nEyJFgH6ssAkWx+fnKlqbD/EwU1 X-Received: by 2002:a05:6a00:8c5:b0:82c:9223:cc95 with SMTP id d2e1a72fcca58-83f33c4d6d7mr528527b3a.1.1778779377603; Thu, 14 May 2026 10:22:57 -0700 (PDT) Received: from localhost ([2a03:2880:f80c:23::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19c77162sm3685568b3a.40.2026.05.14.10.22.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 10:22:57 -0700 (PDT) From: Bobby Eshleman Date: Thu, 14 May 2026 10:22:34 -0700 Subject: [PATCH net-next v5 7/8] 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: <20260514-tcp-dm-netkit-v5-7-408c59b91e66@meta.com> References: <20260514-tcp-dm-netkit-v5-0-408c59b91e66@meta.com> In-Reply-To: <20260514-tcp-dm-netkit-v5-0-408c59b91e66@meta.com> To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Jonathan Corbet , Shuah Khan , Alex Shi , Yanteng Si , Dongliang Mu , Michael Chan , Pavan Chebbi , Joshua Washington , Harshitha Ramamurthy , Saeed Mahameed , Tariq Toukan , Mark Bloch , Leon Romanovsky , Alexander Duyck , kernel-team@meta.com, Daniel Borkmann , Nikolay Aleksandrov , Shuah Khan , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Jonathan Corbet , Shuah Khan , Alex Shi , Yanteng Si , Dongliang Mu , Michael Chan , Pavan Chebbi , Joshua Washington , Harshitha Ramamurthy , Saeed Mahameed , Tariq Toukan , Mark Bloch , Leon Romanovsky , Alexander Duyck , kernel-team@meta.com, Daniel Borkmann , Nikolay Aleksandrov , Shuah Khan Cc: dw@davidwei.uk, sdf.kernel@gmail.com, mohsin.bashr@gmail.com, willemb@google.com, jiang.kun2@zte.com.cn, xu.xin16@zte.com.cn, wang.yaxin@zte.com.cn, netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Stanislav Fomichev , Mina Almasry , netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Bobby Eshleman X-Mailer: b4 0.13.0 From: Bobby Eshleman When sending from a namespace that has access to a netkit device with a leased queue, the nk primary in the host namespace needs to redirect its RX to the physical device. This patch adds that redirection bpf program and teaches the harness to install it. Add primary_rx_redirect=3DFalse parameter to NetDrvContEnv.__init__(). When enabled, _attach_primary_rx_redirect_bpf() attaches a new BPF TC program (nk_primary_rx_redirect.bpf.c) to the primary (host-side) netkit interface. The program redirects non-ICMPv6 IPv6 packets to the physical NIC via bpf_redirect_neigh(), with the physical ifindex configured via the .bss map. ICMPv6 is left on the host's netkit primary so IPv6 neighbor discovery still work locally. Extract _find_bss_map_id() from _attach_bpf() into a reusable helper so other BPF attachment methods can use it. Acked-by: Stanislav Fomichev Signed-off-by: Bobby Eshleman --- Changes in v5: - Use sys.byteorder when packing phys_ifindex into the BPF .bss map (Sashiko). Changes in v3: - nk_primary_rx_redirect.bpf.c: add header includes to avoid hardcoding values - update commit message explaining why ICMP is passed through - env.py: re-use _tc_ensure_clsact() (had to add ifname paramater) - env.py: gate the remote IPv6 host route install on primary_rx_redirect by moving it from _setup_ns() into _attach_primary_rx_redirect_bpf() --- .../drivers/net/hw/nk_primary_rx_redirect.bpf.c | 39 +++++++++ tools/testing/selftests/drivers/net/lib/py/env.py | 94 +++++++++++++++++-= ---- 2 files changed, 115 insertions(+), 18 deletions(-) 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..46ff494b23de --- /dev/null +++ b/tools/testing/selftests/drivers/net/hw/nk_primary_rx_redirect.bpf.c @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include +#include +#include + +#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 409b41922245..ef317aef3a0a 100644 --- a/tools/testing/selftests/drivers/net/lib/py/env.py +++ b/tools/testing/selftests/drivers/net/lib/py/env.py @@ -2,6 +2,7 @@ =20 import ipaddress import os +import sys import time import json from pathlib import Path @@ -336,15 +337,18 @@ 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._primary_rx_redirect_clsact_added =3D False self._bpf_prog_pref =3D None self._bpf_prog_id =3D None self._init_ns_attached =3D False + self._remote_route_added =3D False self._old_fwd =3D None self._old_accept_ra =3D None =20 @@ -396,8 +400,18 @@ 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 filter del dev {self._nk_host_ifname} ingress", fail= =3DFalse) + self._primary_rx_redirect_attached =3D False + + if self._primary_rx_redirect_clsact_added: + cmd(f"tc qdisc del dev {self._nk_host_ifname} clsact", fail=3D= False) + self._primary_rx_redirect_clsact_added =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 @@ -406,6 +420,11 @@ class NetDrvContEnv(NetDrvEpEnv): cmd(f"tc qdisc del dev {self.ifname} clsact") self._tc_clsact_added =3D False =20 + if self._remote_route_added: + cmd(f"ip -6 route del {self.nk_guest_ipv6}/128", + host=3Dself.remote, fail=3DFalse) + self._remote_route_added =3D False + if self._nk_host_ifname: cmd(f"ip link del dev {self._nk_host_ifname}") self._nk_host_ifname =3D None @@ -459,13 +478,19 @@ class NetDrvContEnv(NetDrvEpEnv): ip(f"-6 addr add {self.nk_guest_ipv6}/64 dev {self.nk_guest_ifname= } nodad", ns=3Dself.netns) ip(f"-6 route add default via fe80::1 dev {self.nk_guest_ifname}",= ns=3Dself.netns) =20 - def _tc_ensure_clsact(self): - qdisc =3D json.loads(cmd(f"tc -j qdisc show dev {self.ifname}").st= dout) + def _tc_ensure_clsact(self, ifname=3DNone): + """Ensure a clsact qdisc exists on @ifname. + + Returns True if this call added the qdisc, otherwise returns False. + """ + if ifname is None: + ifname =3D self.ifname + qdisc =3D json.loads(cmd(f"tc -j qdisc show dev {ifname}").stdout) for q in qdisc: if q['kind'] =3D=3D 'clsact': - return - cmd(f"tc qdisc add dev {self.ifname} clsact") - self._tc_clsact_added =3D True + return False + cmd(f"tc qdisc add dev {ifname} clsact") + return True =20 def _get_bpf_prog_ids(self): filters =3D json.loads(cmd(f"tc -j filter show dev {self.ifname} i= ngress").stdout) @@ -476,28 +501,28 @@ 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(): raise KsftSkipEx("BPF prog not found") =20 - self._tc_ensure_clsact() + if self._tc_ensure_clsact(): + self._tc_clsact_added =3D True cmd(f"tc filter add dev {self.ifname} ingress bpf obj {bpf_obj}" " sec tc/ingress direct-action") 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 @@ -505,3 +530,36 @@ 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") + + if self._tc_ensure_clsact(self._nk_host_ifname): + self._primary_rx_redirect_clsact_added =3D True + 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 + + ip(f"-6 route add {self.nk_guest_ipv6}/128 via {self.addr_v['6']}", + host=3Dself.remote) + self._remote_route_added =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=3Dsys.by= teorder) + 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.53.0-Meta From nobody Thu Jun 11 14:47:30 2026 Received: from mail-ot1-f43.google.com (mail-ot1-f43.google.com [209.85.210.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 9D94D3A3E63 for ; Thu, 14 May 2026 17:23:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778779386; cv=none; b=YGJyTeR2U/uoUR0ciU6p31J5uYEgw76eeTwbEfgPmIelfwijzjyJI0/PCSAiUeXvryqTgTh/rv4gi8hYNmMuxUf3kF/CJzvhZZVxMe1R9cVD7sXt2/7BoYWf617fYVfsdaqYj+KLfNpJr2OjpESv/w4u/jIv1RTmHnE0FC1C/gs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778779386; c=relaxed/simple; bh=EDyBqkyN5bDm600u/I66EqsZzueKCojlerqIBUvyphs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ERHuCJvo5Mrq/S3ejC4QBBOBqHlQ3DszKgVu99P7W1dstj73W2p5HdkaxxJQDu0Etg4R1XLkYytBfcaJF9vd2s0EtY5MmNmgsrdDCYOO7SY3ftcnJGJiKVo1188oP4gTOrTP3BAE6mvIUBKzOTfURHTLj+7Q9sYADwmwVXYqsrg= 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=EbNE0fqG; arc=none smtp.client-ip=209.85.210.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="EbNE0fqG" Received: by mail-ot1-f43.google.com with SMTP id 46e09a7af769-7dca5f64e86so6499701a34.0 for ; Thu, 14 May 2026 10:23:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778779379; x=1779384179; 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=fK6Hgo3Ntm+Mk5vI9D7ReSoIcT5DoQh4kA5KdiywL8c=; b=EbNE0fqGgztfEhlDW8IO7XoiGkpsuYndZ6xw/l+/6KOaeGXducdM7IGPNHTwgx9Uyc IOnE3akvzeLJ/calq8q0VCT9+GIrxnoigU88AI5AqSKI7DkJOIyRAC0dym5wt8gQkuLn vYvkpL8oPwe1alB7ptzJD6B+WPBFT3G0ThHplSa7rZAHgkmGdWx1HWlx5ct6s+a6Pb+f pWBeolusN/C7fbIYzE/OrN10SjNljgi6j9FcGmD/zGXOxpDi2n41GKGXD5jrLoaGy6A8 IDc21bQ3Rlh6YVmQ5Q8ytHLLq3jU2NLB/rFJ645f9dpU9cEpvvVP5lbyj+fPvBiJ9DSb NHrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778779379; x=1779384179; 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=fK6Hgo3Ntm+Mk5vI9D7ReSoIcT5DoQh4kA5KdiywL8c=; b=Y7SoCQ0CLOjK+QRzjfcTRM69wFoMpxqcr4ko1GaMyl1bdPPjdXYUO84Bvd5r1LzrDI 04mOIqx1nlHYlAlQ43YyC68eOEcROCnHd5eJ63KcpWeP8H9ZyIp3QefEZxPPyGkwIgJe DHMVmR2/CJb8fmLzMiLZgvGb+Hx/sTuIke3EVLHAz/SZduCABk8yQVFyzG1QoyE2+ymu EkyNIigMdAPZmg069jugaLB1ndcp2wHhAetRb0dGqW0pJ8H0B1MULi+kpTTnklO3gkXw 1Y0n9Dl53lc1I3xVrPLyyMm0c2M2+79NdYichf5BBsRly3FbYnN1KGe4RY1FFx+nCak8 loAA== X-Forwarded-Encrypted: i=1; AFNElJ8xnl2c7zRddhz6lQCf1himsE33BPU8USXqR4E/KceE76ZaTobSeHW0azbmx1av7Gh4AuF3OQUbSov9mbA=@vger.kernel.org X-Gm-Message-State: AOJu0YyrvUipLXZMHdFLaFZOysKxk1YDqJTg1H8MLFx6Ih5gpDm1j6xP yZM8IFjn9eAIPXfiX4YKvctGdNCSLzzi5Sm8pAxvhmzv6c8m/aws4YSU X-Gm-Gg: Acq92OGkjAqzPmxu/3yvV4Sa49f7wOql6XMXlGVghji/rLEK7wD70yl/WrvZF5SCvCm mvK7nVWWSEN2/LqqGwqmV8CfjJqkWmjdcfSz+1jXxOFOys9Q2C1uk40pWiT/DMQzJ/aPoeQOKUL 4AJRsY/U33S9e83E79RtGvx3s2HpQIU+MznbPZzt/2kBIJGxKaMTwlP+v2D2J+AptGHRi1IfrGG UpZoNMxkp/nr7vtpOCnX1gcbyPMG0BLuyF4XXFC9dc32WVLQToIv2MDOrACq7zd2NdkTJYr8Wee Q+i52ueu05QJRRRvWQtSqqYog9Jkoxkjcib+hZudbKn6UdxvuEHXDFy3h+D5Tm+N/+STtN4H6N7 dlo/YxqKG1FtGjTvcYVGuNaEAJIwElVXPHDZc8aCMPbEYi5+hijtuOERbMVYwsGgwZKIbFN2dNV dFc+BOKcbnr608rkzYWQ3GRA== X-Received: by 2002:a05:6820:81c7:b0:69b:8c73:e921 with SMTP id 006d021491bc7-69c942ef1femr249405eaf.20.1778779379501; Thu, 14 May 2026 10:22:59 -0700 (PDT) Received: from localhost ([2a03:2880:f812:6b::]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-439fc1e7bc7sm2229037fac.7.2026.05.14.10.22.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 10:22:59 -0700 (PDT) From: Bobby Eshleman Date: Thu, 14 May 2026 10:22:35 -0700 Subject: [PATCH net-next v5 8/8] selftests: drv-net: add netkit devmem tests 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: <20260514-tcp-dm-netkit-v5-8-408c59b91e66@meta.com> References: <20260514-tcp-dm-netkit-v5-0-408c59b91e66@meta.com> In-Reply-To: <20260514-tcp-dm-netkit-v5-0-408c59b91e66@meta.com> To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Jonathan Corbet , Shuah Khan , Alex Shi , Yanteng Si , Dongliang Mu , Michael Chan , Pavan Chebbi , Joshua Washington , Harshitha Ramamurthy , Saeed Mahameed , Tariq Toukan , Mark Bloch , Leon Romanovsky , Alexander Duyck , kernel-team@meta.com, Daniel Borkmann , Nikolay Aleksandrov , Shuah Khan , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Jonathan Corbet , Shuah Khan , Alex Shi , Yanteng Si , Dongliang Mu , Michael Chan , Pavan Chebbi , Joshua Washington , Harshitha Ramamurthy , Saeed Mahameed , Tariq Toukan , Mark Bloch , Leon Romanovsky , Alexander Duyck , kernel-team@meta.com, Daniel Borkmann , Nikolay Aleksandrov , Shuah Khan Cc: dw@davidwei.uk, sdf.kernel@gmail.com, mohsin.bashr@gmail.com, willemb@google.com, jiang.kun2@zte.com.cn, xu.xin16@zte.com.cn, wang.yaxin@zte.com.cn, netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Stanislav Fomichev , Mina Almasry , netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Bobby Eshleman X-Mailer: b4 0.13.0 From: Bobby Eshleman Add nk_devmem.py with four tests for TCP devmem through a netkit device. These tests are just duplicates of the original devmem tests, with some adjusted parameters such as telling ncdevmem to avoid device setup (since it only has access to netkit, not a phys device). Each test uses NetDrvContEnv with primary_rx_redirect=3DTrue to set up the BPF redirect program on the primary netkit interface, then calls a shared run_*() helper which probes for devmem support and configures the NIC (HDS, RSS, queue lease) before driving the test. NIC state is restored per-test via defer() callbacks registered inside the helper. Acked-by: Stanislav Fomichev Signed-off-by: Bobby Eshleman --- Changes in v5: - Move require_devmem() inside test functions so ksft_run() reports it as a SKIP (Sashiko). - Drop the inaccurate "mirroring the nk_qlease.py pattern" claim from v4 (Sashiko). Changes in v4: - Call configure_nic()/cleanup_nic() once around ksft_run() rather than relying on per-test configuration inside the run_* helpers. Changes in v3: - Reorder os.path expressions - Drop @ksft_disruptive from check_nk_rx_hds to mirror the original check_rx_hds in devmem.py Changes in v2: - Add nk_devmem.py to TEST_PROGS in Makefile (Sashiko) --- tools/testing/selftests/drivers/net/hw/Makefile | 1 + .../testing/selftests/drivers/net/hw/nk_devmem.py | 46 ++++++++++++++++++= ++++ 2 files changed, 47 insertions(+) diff --git a/tools/testing/selftests/drivers/net/hw/Makefile b/tools/testin= g/selftests/drivers/net/hw/Makefile index 5e49d7bffced..c7a1206880ea 100644 --- a/tools/testing/selftests/drivers/net/hw/Makefile +++ b/tools/testing/selftests/drivers/net/hw/Makefile @@ -35,6 +35,7 @@ TEST_PROGS =3D \ irq.py \ loopback.sh \ nic_timestamp.py \ + nk_devmem.py \ nk_netns.py \ nk_qlease.py \ ntuple.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..300ed2a70ab4 --- /dev/null +++ b/tools/testing/selftests/drivers/net/hw/nk_devmem.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0 +"""Test devmem TCP with netkit.""" + +import os +from devmem_lib import setup_test, run_rx, run_tx, run_tx_chunks, run_rx_h= ds +from lib.py import ksft_run, ksft_exit, ksft_disruptive +from lib.py import NetDrvContEnv + + +@ksft_disruptive +def check_nk_rx(cfg) -> None: + """Run the devmem RX test through netkit.""" + run_rx(cfg) + + +@ksft_disruptive +def check_nk_tx(cfg) -> None: + """Run the devmem TX test through netkit.""" + run_tx(cfg) + + +@ksft_disruptive +def check_nk_tx_chunks(cfg) -> None: + """Run the devmem TX chunking test through netkit.""" + run_tx_chunks(cfg) + + +def check_nk_rx_hds(cfg) -> None: + """Run the HDS test through netkit.""" + run_rx_hds(cfg) + + +def main() -> None: + """Run the netkit devmem test cases.""" + with NetDrvContEnv(__file__, rxqueues=3D2, primary_rx_redirect=3DTrue)= as cfg: + setup_test(cfg, + os.path.join(os.path.dirname(os.path.abspath(__file__)), + "ncdevmem")) + ksft_run([check_nk_rx, check_nk_tx, check_nk_tx_chunks, + check_nk_rx_hds], args=3D(cfg,)) + ksft_exit() + + +if __name__ =3D=3D "__main__": + main() --=20 2.53.0-Meta