From nobody Sat Jun 13 10:06:28 2026 Received: from mail-qt1-f176.google.com (mail-qt1-f176.google.com [209.85.160.176]) (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 C8AE226B973 for ; Fri, 8 May 2026 02:28:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778207298; cv=none; b=lSxgokK2mlPJqUJr2Yd0OvVWRcacZNZpAIpweLhS+EZNwY/tMASFVaRKNg2TmOVNEaxWSQArW6NgaDwy0YW88lhFOZl7+oiwt/0NJYofmfhSixoFVhopUvoRM0PuX44IGV7umd7KXslPDEYS+tjMmDlHej6sR1iezYCvAOhTXkA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778207298; c=relaxed/simple; bh=YOPO3l7uxW+eRzLl3iossMvHREitWAyJ18Lz0CZa9ck=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cDRQCzeU77SF6wVVedO6cG5F/M5MUCuZlIGqlAcXGDDfrtuWKYmgH2ZcM4XvDX+cQTin+TukR14Yso60r6cFzv9uNhoD9QvrL+SSIfbgR2Gwgd15lfwfDDxf0TcHLRtl4JDvFfrUQV0LBmC4aJ75+cwxNVScwafRGWuEZd0RsGg= 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=NR9TECKg; arc=none smtp.client-ip=209.85.160.176 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="NR9TECKg" Received: by mail-qt1-f176.google.com with SMTP id d75a77b69052e-50e63771d91so15148691cf.0 for ; Thu, 07 May 2026 19:28:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778207295; x=1778812095; 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=oXhCyJ6Uqead6+Tw4IHtY2XSZdsbutwm7LNjDaKgNY0=; b=NR9TECKgCDvnBDSdVryQaDyHyk6WntnhwJ1VFHRUxmIgoAkslbJDP1XVn05Sb9B7sx KLEVR+R75YybhRUVPUKXEWFnrM8JgxuzDLF5UAy59/XIuAD/jhiKOOzVVrfTSeS3Nrve AvxK4s+plJfjDR93LUCFXygoO9hpAKyVd2vS1xDt77xR3B/z6Q6yZzhhuq2drBEQMES3 CuMggd0DUJiXiYd113sfULSzcpt5Wt5OH9XCaCibULoL+FYdw+GpiFngC76Aa7LmFNxW 8LsuLIG9ghf7qBbXq/D7fQXNef45gHblLUChnmq3uZNe/fM73KrGQ//Ma7lUUppUF9SK WigA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778207295; x=1778812095; 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=oXhCyJ6Uqead6+Tw4IHtY2XSZdsbutwm7LNjDaKgNY0=; b=sckOpeCluhmI3/lWY1HGWTcp4t7zmxV9S9jeXH4ZoKmrmM3PL6D8T2sy5kt/QRWZk6 H6vItMb3GO56rSaEE3puxqsulO6hjYdtgMw1dQYLGloutoO++hgnaeQ0UV7NiKVMgRXb A7HRN57SGYjbfXEyYo6NB4iXx/oK3TVyNzb1i5E7QlO+g+zD7pd1ExRcO9htEULGCzhk 4tKquKSmBLPE2TpZYES0iUCK/overALzhnVFN1EtsCoTYuOQCUGpG6ODyi1PoroSBavS QLnV0dK2O7zcyBcCjQZf6gxzAmvax2t0G2kgmX0lbKpNL+ovQfdQZM9aR8tFrfI/oiLh aL5A== X-Forwarded-Encrypted: i=1; AFNElJ8rLIANa1QmPJi3NSE/XctO8lqdtKAiDX6Qk+4r6VGd2tICuTfZHM+qmAJ1Y6AhF3kBL6zE8SytDwhVm58=@vger.kernel.org X-Gm-Message-State: AOJu0Yxq5Cuq8UFlTuJTw7nR/eu6R1Swb71Fd+ZxfrgOea3S91Q8Ys52 876jjOXGRbIUywB5v1rAgM4MG+/A83Avb6kWRPIztzFLhC6g3YcpFWvz X-Gm-Gg: AeBDieuXyx77sBJgnCdun0mLHTSBJP8Sk2ifjUrH30lQIMYys0K05uqMRbofW9MOAG9 ugfYc7/D9quukp8jds/Uz2AfHDRN/PaVQowN8YRJe9Ry/FassQGCEle4sClQqTjPcpI+DeuIPgY xtKVDrVjftRvKBeNdaZb4vSIFC9W2vyMFm6S4C3VACmu9FJroWRUdh5D4UMg4ModbMj0dlFfQGO JcG+GVt0YvT1HU26tYwqzhGIqbZ89CRxoqxeGG8D4kdRmDmSIoyWKAVp9sDFHzpli7C1RiRSAMq lzLZZPb+w6AFi9E/cjyQHXSBozmiVFk5O431vzfeEtlE6vWMUoQNAiy0IJFJ4i9uyLAAH5EINy+ SNh5G8q89A/LevcVYQf++QTpVqIVPv8DwEyPRhDf7zPxGGxT232YsGEQvuhWlTtkN/Ia0X0t5de 8d84xh4Oo01mrQUqvmw2I= X-Received: by 2002:ac8:594f:0:b0:512:e827:d844 with SMTP id d75a77b69052e-514621cea4emr152315561cf.58.1778207294723; Thu, 07 May 2026 19:28:14 -0700 (PDT) Received: from localhost ([2a03:2880:ff:71::]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-5148e7c0289sm5423071cf.18.2026.05.07.19.28.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 19:28:14 -0700 (PDT) From: Bobby Eshleman Date: Thu, 07 May 2026 19:27:46 -0700 Subject: [PATCH net-next v3 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: <20260507-tcp-dm-netkit-v3-1-52821445867c@meta.com> References: <20260507-tcp-dm-netkit-v3-0-52821445867c@meta.com> In-Reply-To: <20260507-tcp-dm-netkit-v3-0-52821445867c@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.14.3 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 Signed-off-by: Bobby Eshleman Acked-by: Stanislav Fomichev --- 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 | 8 +++++++- net/core/dev.c | 2 +- net/core/netdev-genl.c | 2 +- 9 files changed, 20 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 8c55874f44ca..ed9c22dc4a5a 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -17120,7 +17120,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 424d973c97f2..dd2b8f087163 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 5a46870c4b74..fc49aae38807 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -5924,7 +5924,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 c406a3b56b37..138e522ef9b9 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 0e1e581efc5a..580bccb118a0 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -1788,6 +1788,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 */ @@ -1809,7 +1814,8 @@ 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 (NETMEM_TX_NONE or + * NETMEM_TX_DMA). * * @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 06c195906231..fbe4c328a367 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 Sat Jun 13 10:06:28 2026 Received: from mail-qv1-f49.google.com (mail-qv1-f49.google.com [209.85.219.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 CF6EF274B2B for ; Fri, 8 May 2026 02:28:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778207300; cv=none; b=GNHalfpprZ3BIBgQZ7aPL8NbgXY9GZjC8xUpiXj2jdX1EpWbp+y+z0vFpCvCzT1qrUNNyF/8ZvqzhmdFRLSiEdFNqfQhQqVpvQyErN/yb3RXKLYwlQKyEW9oZoiiufFN6YTcsnH9IrkoajbWGK2uTipJN6X++L3nt1JbOT96hzg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778207300; c=relaxed/simple; bh=GjN+txHCuGhk6KpGtuJRi/w4OZ+vPPWTjBtg1/w6tJc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=A2oNGp86NdSPliGRZ/3yA2XsL7zlqryiawRRctSGJYPSLUaKT7dJtWNYxnj5BbwGS6WukU3gapETkHXwSJAFJTB54HPwLCigSXGukyHwoy5K2D7ZdLh4ezAQkRFQw6WnkKn60bzQTJEuIKUcecm7xfEJB6TZIGZDovcpw/nyznY= 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=dUimMc2F; arc=none smtp.client-ip=209.85.219.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="dUimMc2F" Received: by mail-qv1-f49.google.com with SMTP id 6a1803df08f44-8b4298d271fso24065046d6.3 for ; Thu, 07 May 2026 19:28:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778207297; x=1778812097; 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=AKyr+spA0neYAx9lJFUt4Ya16cMDVZqVWltu3Xv0UPc=; b=dUimMc2FX1tEOz5SEpCSqC7TsT5gpcpYp0+3Qa+utdT5OpVK2GH383nfeoHNlC9nAH 8naG7Dqvlj3XryW2GDl1nuZt5Voq66iKSnEhGZxtmUOb33BW+gwUs44wG02tUj0Xjalg wTJjInpFVAdBN8upHg1x6KN5qRm0I6Dc2tncNg6/wZGZjC/1+Di9bpl+r/tGMkHgK/JD Z2nPqWrjCm1rcAIZP8hgb0AMDgI4GbpSR7/3fSCTuwQZpDKQh4ZBwJYvub9Jc8GQpcsk VW/cBD0z6vJwuSDG+Ac0oxZKYOMRlf6xbd7lVZZjDSgPw95sjDRlFVfbXnZetl9a6Z64 CTSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778207297; x=1778812097; 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=AKyr+spA0neYAx9lJFUt4Ya16cMDVZqVWltu3Xv0UPc=; b=AHIIKaLjBxbt67v4oTNVBZF2Ep8zmW5XdehkTvGrks22Gu5BJofRd9aFqZAdoIDAm8 MWaAnE0JyaUF/ZC4CcR7r+wsKhEh1tQ+VCQhrbOftlCmSlRFBzy5kb+RxFmITXrXYwDE o/GWWB6Z6HFUd4e31Sm8kjtdPxaBDwBBwTfWPdugeKvVM/I+TNMkt7ArUgPvibYWdvOC AySvuTiJiK+cf4WiF00BfVesPN/AL0N3PKZPMIitFIWvqAVb+GRkiKMP24ERqFero7Pn jIxCFeyWiSVAlYV7GDQ3n6ru3lb/GU6AHzZ/JkxWIiSXm68RNl8GK+qrLWnEMKi64YHt 4eUw== X-Forwarded-Encrypted: i=1; AFNElJ/EgjHbZGCePPkJxYl3Ufr3DsWE02CrfwTCb7/G81ehZIBvvuMcoaLOJ1BaxusFt030DZTMf53T8bBP58c=@vger.kernel.org X-Gm-Message-State: AOJu0YzXCsp9lOvRTfMO+Fzs8G3p177XCnyct6FCWEb/8JF6A6OkT8Zi b5E5Zhw0DzPWLKEZHwdjoZbZWG+RbPyyuE+/quZS00/UBF8dasd+D4I8 X-Gm-Gg: Acq92OF8CTOLN55rUa7HtsHev0Q58IOYfLvsbnLrP58GD+KJLd8ZId3sHD0ns17sqB9 Qt6c5L+0mMMnIen08dcRc3yxxWaZ+4GzifYloIuBYU7JZEhZLPhlnSuztweoClNIOoiKHpg+XH5 tm9tTnAidtDt+oJXjWnmXn2jV/esnW0Xj+oC8d/qbG8Z9IVyGvpGaMl04B4YLUstVEggtdJEPdE pZB1JhjTnF3JeHsFqGQBdfHthIG86ioJG96WoJRN/H3iISj0zAi/OUngW8kuxtgNDy6VYpY8KC3 oOT3NXoYes+ntZK8BaNR03OYW6fFo+EDiNuW8Pup930zdrJDILeFTYp+5po44INYTFN32zktlbT f9vQACmxs3Vaq5hdi6RWo9RT84BEKMK9Ya7wlQBoIn6W+cA46LB7gFYymauaVAem11+a9LXGi9F DWfFAgIgK5eTW9I7yrQbBakg== X-Received: by 2002:a05:6214:5b85:b0:8a1:34df:bbe3 with SMTP id 6a1803df08f44-8bc443d5a41mr158397216d6.28.1778207296694; Thu, 07 May 2026 19:28:16 -0700 (PDT) Received: from localhost ([2a03:2880:f800:3e::]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-8bf3a43636fsm5524446d6.21.2026.05.07.19.28.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 19:28:16 -0700 (PDT) From: Bobby Eshleman Date: Thu, 07 May 2026 19:27:47 -0700 Subject: [PATCH net-next v3 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: <20260507-tcp-dm-netkit-v3-2-52821445867c@meta.com> References: <20260507-tcp-dm-netkit-v3-0-52821445867c@meta.com> In-Reply-To: <20260507-tcp-dm-netkit-v3-0-52821445867c@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.14.3 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. Signed-off-by: Bobby Eshleman Acked-by: Stanislav Fomichev --- 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 | 7 ++++--- 5 files changed, 12 insertions(+), 4 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 580bccb118a0..11d68e75eb4f 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -1791,6 +1791,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 { @@ -1814,8 +1815,8 @@ 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 netmem TX mode (NETMEM_TX_NONE or - * NETMEM_TX_DMA). + * @netmem_tx: device netmem TX mode (NETMEM_TX_NONE, NETMEM_TX_DMA, + * or NETMEM_TX_NO_DMA). * * @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 @@ -2138,7 +2139,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 Sat Jun 13 10:06:28 2026 Received: from mail-qk1-f172.google.com (mail-qk1-f172.google.com [209.85.222.172]) (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 09F4A280338 for ; Fri, 8 May 2026 02:28:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778207309; cv=none; b=UpsrJwRXSuj5RN1S+1yflXqVyQFJJHtBWaelBktiFjyKj0WjB+tIAaQbZ5pf7mELFtNGmshJnphTaQ7QgPSytzjQcX/bEic5+uelpVz48+OUKSYki41Vo4OAJhOO66j91I7KoRM0q8CoEd0iAaazX9UOAO/kbVg5dayPjKzRv7E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778207309; c=relaxed/simple; bh=+7QTIX5Jfo66d6mEZMrs1AEpc/60dOeYIBi72Pnw4Oc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LX/2ewVad4sRu8i4rAHboWVuFbHt7FvNGIeYw/znw1bqzilPg/qQlAFVWIuTLaBtQ53ehfNeKujFwZgy0iHyfoqfCbbohRU1z/09yuff8VdCtC2cbpECmx2I5uLECQVJTBRMY50jH4/ByyCVkZwXjuKYYlXDZk4cktYW+iLrqmA= 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=WLpKlMdD; arc=none smtp.client-ip=209.85.222.172 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="WLpKlMdD" Received: by mail-qk1-f172.google.com with SMTP id af79cd13be357-8f231f3b130so113812385a.3 for ; Thu, 07 May 2026 19:28:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778207299; x=1778812099; 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=KUYPma61DuZ861cw0OU1+Spsgt2qqloLMXWRlKAMWS0=; b=WLpKlMdDWf8ssoDqTXeiMepCA96DEA1XW7hGQxqGsGeLdlxdDtNoLM3wpEjNWyuNe3 cfLunuPjxcWCJ1J5eXbthIGzawsbSJRSrwXL5XCyC961BZfOA2+sX9qNTkxhicO/TsC8 77SPgredSwe/tLHa+9ZNPS8IB80caRPt67FU4LHsvRo/0BequWoPF4+mnIFsnCreqNCN kLEeg5pONNPf8Wxhda8EwLnHe6wCjJj4Jupm8Wab1WlMmdhDrM0kdbPv9GZMQ0b9PtOs kTvc8VgBSYRPw/7clbN2sKHer3AkBPIjlKMfA6jDy7I8vsENHdGBbQnPVyP3lgYrBU+9 AU8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778207299; x=1778812099; 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=KUYPma61DuZ861cw0OU1+Spsgt2qqloLMXWRlKAMWS0=; b=Af6ge/42MIcR6AzEorymHuOj9xPnO3so2fU6g9xsQjmBigGUSqLMfUIm/ulEuo0Ihl 7GF6aG9HiynkKIxzF6NB6trObYbPmVdEyUYYqoKX9RM8YK3wbQpjgPf0otv5vvZ2TRU6 h4M57HVE3d1ZgrnNCQ8zkPnHISFzh+f2UoBuxl1NIbuwr7G77ZZyihEtZETtRnkRtUt3 3HSael4924t3lare4mhCv/AGfRhjgZftzUiVG0LMHTbE8LDc4c+c/COCGpT2WLkUAuwU 5zWLxHpf3dU/RaWb9DSvNkehxL2Bk9XPzjlt1z9qmzqvf82ZK3bW9dl/OOM1fGBZDxpt oGUg== X-Forwarded-Encrypted: i=1; AFNElJ+9H4f/dpKLSC2KvxsQ7B4r6mWFQG1kXnMsimYZPfaQx9j+IaPNH9MJRE8cpNWdTB9EwHOE/02BmodCUUY=@vger.kernel.org X-Gm-Message-State: AOJu0YwA3VM2urvZcsOWHeDzU+bdllIx1gUyNOqtM+k1iG3Faj4NNTzJ RaNt6IDkHISrH0czkdbwupLAgn1/g/mvMWsQEPVtPs2Gt+QI8c/2p5UH X-Gm-Gg: AeBDietiXgJMaPqpBE0cU1/TNnXa/+4f7L9jo9OauLYI1twEt3Vfm1Sb5rdU1dGDit9 ZKLiCxtXFXxBGtRgB8ZNHeSks70b6dUL4Pd27PUqji+A7euvmUsCvhNCkW6dpg9GPAeaqH5myIu BoZYEMBiiYJZRpf4VNBsr5OUToJU1582RdtPvhb8jyzh10BxvvCdOUs69ndFw/HMI4dlg7U32kV ExrQxiUlI9HNkZEmRgZeSSEi0pF9kjalZEywIqEo0os+mT1WirDy+iggMa3/KhymHVM9vUX6pN3 2Gw2aRiEhL+03LeJYIO7pb3pUq/j4c/wpYr4sn1yeNVlPWb0lL0MXjCXpw5mV1HwDFYk51wFH28 JkA4CwNLqcRS3Qco9rvyAPOldnoGPtJZFdKjO1iAdTV+c6fmfxn1d+e4lbWILkC9UKwWuY8LG1W CJe+6FCiqatUmlQ1G9I3V6aRQGjipweeHz X-Received: by 2002:a05:620a:bd3:b0:8c6:d309:f9c0 with SMTP id af79cd13be357-904d3fa42e0mr1519549685a.8.1778207298730; Thu, 07 May 2026 19:28:18 -0700 (PDT) Received: from localhost ([2a03:2880:f800:45::]) by smtp.gmail.com with ESMTPSA id af79cd13be357-907b8d9eed0sm63298085a.19.2026.05.07.19.28.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 19:28:18 -0700 (PDT) From: Bobby Eshleman Date: Thu, 07 May 2026 19:27:48 -0700 Subject: [PATCH net-next v3 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: <20260507-tcp-dm-netkit-v3-3-52821445867c@meta.com> References: <20260507-tcp-dm-netkit-v3-0-52821445867c@meta.com> In-Reply-To: <20260507-tcp-dm-netkit-v3-0-52821445867c@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.14.3 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. Signed-off-by: Bobby Eshleman Acked-by: Stanislav Fomichev --- 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 | 9 ++++++-- net/core/netdev-genl.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++= ---- 4 files changed, 72 insertions(+), 9 deletions(-) diff --git a/net/core/dev.c b/net/core/dev.c index fbe4c328a367..268417c9ef22 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3999,6 +3999,9 @@ static struct sk_buff *validate_xmit_unreadable_skb(s= truct sk_buff *skb, if (dev->netmem_tx =3D=3D NETMEM_TX_NONE) goto out_free; =20 + if (dev->netmem_tx =3D=3D NETMEM_TX_NO_DMA) + goto out; + shinfo =3D skb_shinfo(skb); =20 if (shinfo->nr_frags > 0) { diff --git a/net/core/devmem.c b/net/core/devmem.c index cde4c89bc146..644c286b778f 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, struct net_device *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, @@ -397,7 +398,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..f399632b3c4b 100644 --- a/net/core/devmem.h +++ b/net/core/devmem.h @@ -19,7 +19,12 @@ 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; + /* Virtual device (e.g. netkit) the user called bind-tx on. Must be + * NETMEM_TX_NO_DMA. + */ + struct net_device *vdev; struct gen_pool *chunk_pool; /* Protect dev */ struct mutex lock; @@ -84,7 +89,7 @@ struct dmabuf_genpool_chunk_owner { =20 void __net_devmem_dmabuf_binding_free(struct work_struct *wq); struct net_devmem_dmabuf_binding * -net_devmem_bind_dmabuf(struct net_device *dev, +net_devmem_bind_dmabuf(struct net_device *dev, struct net_device *vdev, struct device *dma_dev, enum dma_data_direction direction, unsigned int dmabuf_fd, struct netdev_nl_sock *priv, @@ -165,7 +170,7 @@ static inline void net_devmem_put_net_iov(struct net_io= v *niov) } =20 static inline struct net_devmem_dmabuf_binding * -net_devmem_bind_dmabuf(struct net_device *dev, +net_devmem_bind_dmabuf(struct net_device *dev, struct net_device *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 Sat Jun 13 10:06:28 2026 Received: from mail-qk1-f169.google.com (mail-qk1-f169.google.com [209.85.222.169]) (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 ACA2027FD75 for ; Fri, 8 May 2026 02:28:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778207306; cv=none; b=pUy8nMuU/Ie0ePKizGvy+2EzoNzgutFLcbK0tjtx2DmqztC4ZEvDWWVSbUlrDPrRIMKdJE+rxQCLYOlONfFD4oRFEAxh39ii/V0H1FKWMP1VOVAod5DhaRfkjeZAzuGhollh+OJKgDmD/TnKac8OtQNhgYyu59vJsuXmgjRlaKo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778207306; c=relaxed/simple; bh=mRrVZ6uZ30MBcrGg/JUf1vadHPFlXqtkRqYN4sTjhTI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nZcphdNt04m3U6jdNNWZRfzXUXJZK2GPjr6gPw1ON3c1omwb0OkPTgla5rMcnPedJabQyXeGiFxfZ93l8LcrISzSp/ln6l9EZ61Um60XAQuK1Ws4nFvgciAT3zRhFaQFprPT2WfUiQmGLeDrIgi7SR0GfMs8DddB9qcVwLpTdBY= 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=qztNr3Sf; arc=none smtp.client-ip=209.85.222.169 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="qztNr3Sf" Received: by mail-qk1-f169.google.com with SMTP id af79cd13be357-8eae9229110so203585485a.1 for ; Thu, 07 May 2026 19:28:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778207301; x=1778812101; 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=stnI15SnX1ppHc39pta6JW4ijwXwltLNVPNKZ2aNoUA=; b=qztNr3SfnYWRbTjZ2DecgPJ4O4gE2c+TCNQxDbZere0lyk4Q6xcZYbLJmlH7FidATC ZGm4bTlu+MBKpjs9oXOOcZd35s0o4X3zjCh85Y9ernKP5Ce5oHBOHa6dydR7jNsvLGhO vqRJx5p6FPWeRuXJ5Q0vbiLlt6V+JJo9TReAGn+S+CER1c9tL5j8OG0eHI8b6C7fXwnF FItYT3lC/EPElXo78nQCUC66Vhfbi506SjT0dSsGQCnSXQYoe63LbSiX+PZbxQKKmCYQ U9g11fx4QNiW3VG6ysm1RSyggB2Aw7jG+rfzLae1MRxIU9I8ZwY3B1jcCKKywS32jQPX 5uNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778207301; x=1778812101; 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=stnI15SnX1ppHc39pta6JW4ijwXwltLNVPNKZ2aNoUA=; b=sBYoPXR16194XyIJkBLlNws/DlmBc29FgF1A816f4R3dr1ThXCUHwqM+YgHAah/DaK CqurFRlzNVWLT3kQSUe6e7hu67tzRU+iCKlf8DrkwwgaFpOg+OIA42uBB8q7vnbah0qX kzw8rlAiffxb8+iNNwJM45GZxN6ynsE+b4P6xdXtMWnbkc1jQ+3Wy3/QJQugSpFLBwny 2SIKzp2Z/5vgQBrgvJPFnt2EDjsH9Ept9NXpbxh4Krs83hbRW1cCwXgTqMdfS5nAQtw5 g/knV4mWTLGGtGt8FwYdOVEiNhCiG8gFMnLTWJx/pahLBKjil4bRYnPMZHGdSoB1Xr/w sgeQ== X-Forwarded-Encrypted: i=1; AFNElJ+K5YWJPDLCSZlg1tIHtBwQrIi1rwHQ8isW47HPRKPLCnHpSmnPh9utwLOjSUce9//A6II8sIpgpLdUFxw=@vger.kernel.org X-Gm-Message-State: AOJu0YzCTRQM1kJ6d8eWdxMBxU0u4Hg97GTP3olQhRM+ePkpagIxB2aW uuZ3m9nxbEUZK1BDN+7bDWvn/e28ZhT2SvCn4jwZy/uFp36awJ2wb2VA X-Gm-Gg: AeBDievNDHtqGnXvxTo5D1NRcGMndIZ3DycWcD1yK0XEiDqDa603ODbyXfveCKz7oO9 h4rkXmlJDXsu12yiOJmcmBuTJoMVoFdsxkze0w9zE3b5ikTmB7TbgygHqUyASNfTE7oE8jKqZON zBQDmdyho1DaDlEFsq5AtrAkwBjB+Xdr5Z+MYMPCN2c3oKEonHTJR2NgMXwsswpHnepQuiFePSX SkQ3xFqJDJYnRCVIahON+mHskF8zCUZws0y/B/0/meOWvg3YGSnRIypZ0daytFG8lVkzME3Ukio wC4mTtTIq1t1qOws4eTa50lNMwsKOZXhjrw/fRRvlloGdF3NvjZ0xMxeiY9Ozh6t65D/Wf74ikf PVgdDxXxt1BhFFkVoBDLtmVRCKrpezp+TrTORs5QKxp7/HeFLtK5/uci9TDlEEoh0hZPECUVNjy Gaawi/7XlaNcFHCUjiKzveOQ== X-Received: by 2002:a05:620a:29ca:b0:8e8:ffd2:efa5 with SMTP id af79cd13be357-904d4391f52mr1517946385a.11.1778207300712; Thu, 07 May 2026 19:28:20 -0700 (PDT) Received: from localhost ([2a03:2880:f800:3f::]) by smtp.gmail.com with ESMTPSA id af79cd13be357-907b966f5f1sm63166985a.8.2026.05.07.19.28.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 19:28:20 -0700 (PDT) From: Bobby Eshleman Date: Thu, 07 May 2026 19:27:49 -0700 Subject: [PATCH net-next v3 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: <20260507-tcp-dm-netkit-v3-4-52821445867c@meta.com> References: <20260507-tcp-dm-netkit-v3-0-52821445867c@meta.com> In-Reply-To: <20260507-tcp-dm-netkit-v3-0-52821445867c@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.14.3 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. Signed-off-by: Bobby Eshleman Acked-by: Stanislav Fomichev --- 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 Sat Jun 13 10:06:28 2026 Received: from mail-qt1-f175.google.com (mail-qt1-f175.google.com [209.85.160.175]) (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 7B40F282F3B for ; Fri, 8 May 2026 02:28:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778207310; cv=none; b=Kw0rBfZbLmAq+Dc7P+yxPj/r2GgloISSa4mOUXqtNlCFI3fHv/l10XNIT4TZvnqeN8pqBu58gSdQAU6P4ws+jSO0rTEXao/kLFWoe71tOsBWOreQgpGcFypOyetdiLyBG7hUVQUoRfcJjg8LVRCC3KfYNn9yZSD4U98wpOHQZYg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778207310; c=relaxed/simple; bh=d6eZsFBeT6SRd4hLrPMqK9XIMSn8RsdbgB33+GNTMVI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YE8NtfHLkYV8vdrSExnpPasXHNy9TlB2sIUpbimD+CY3jGcc9qIL0ZSW6qqup1XfNIDctgrkdQRcAf70V3mL8uo5CXqw0Y9ec853Cwe48di2n8twnacIhJiUu1N9iFYwr91bLolH5Ki97AGPCkCFLzQXTzo13bqzGS5yTvBKCXI= 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=Yc7yoTmR; arc=none smtp.client-ip=209.85.160.175 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="Yc7yoTmR" Received: by mail-qt1-f175.google.com with SMTP id d75a77b69052e-50faf8ed9c5so7976351cf.2 for ; Thu, 07 May 2026 19:28:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778207303; x=1778812103; 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=/Q5v9gHszU1RWAN1/wyAj48v0l++/KCLjJw6Cixcm4g=; b=Yc7yoTmR/uSvu0ocqttJ4Qdiu40Pymwy5k/5F1D/Wul6qx5U3QRCL3ybqoaHUKaDau DlK0AL84/u7B/BhuZzTXihK/Rz9g2IML8IPSHtAqitbrmi27IQDI2bfberOK1XaXa5VB luFH5o0PfzTnydJngDPe6YJxt5j/BBYvWGYw3kMNR94b1VKCGG295zpjuSJ1DpHrJLDa UqgvAaFOWJ1ACkklGOuIzMm+rsad8bC8hF1JoucMkAdZTuKWzgiPTmI0AJx9KRvIb4Uj CEKw4saP1Of0Nr+Cgh/Ix0lsbBogCvMmqPBd8bvHDsz29Ys01pKlJG9vwl/aazFkWSbC ykyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778207303; x=1778812103; 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=/Q5v9gHszU1RWAN1/wyAj48v0l++/KCLjJw6Cixcm4g=; b=EWsYE+JhHtqFboLc8XQJ5l3DB8GRl3H7jL8EqyIkd7mIArxeljvSgGED7KUeibKPGR HbKTIvKdSjfH/sssxfJTyH6MlTNAlvL22rTZX6SiPTQ7z414EJas5nrFPs2gOsvNt09I Ognci0r80ymOt95Tj0FuspCM7cy7BjaSFkUNQwP1fuinlaU6ZBzNBpQD+CVqGmxRwVST 4/BNoS0O04NAmJ9JxzvGO85t1qCnZ1LO3jCWsbtCahiUTQaDw1Zs3OyQ3LWvBicKaiEd UaApMv5T8q/qchFZyLw1eucyvPP2/jBX1xTahMHqdGbl5UMJd6Q6UsB6d6Ts8GIxPDvz 9caA== X-Forwarded-Encrypted: i=1; AFNElJ8+dsOIG41ThftNvx5x9owLhaZgGDs7jYPpGNfoMQYIGPwlSZ14UiK1JPx9v0T2vo7FwvcCfCi0ES07bSY=@vger.kernel.org X-Gm-Message-State: AOJu0YzUx0dPRtY9tcL2uE4e7vqhZ8UffF1pXrE2v4MavIQl2VptAL86 ficWg1/A4JSvFlGolxsn+EuIwNzseouEOI7a8kJ7EgyNZFEVj3TEzEOQ X-Gm-Gg: AeBDietIAdjMzSTZ/V+i3DERI5z+tnIZPu1bhYlfvwm4G7ySqD2/PEIXDWd8AVfCXhn UbcK9NycYH9kjs9035TCNfjYdPXBS9itg5RtcENHRtXQlmxEMsbwOxSqHhme8C7zaKKifxqDp7P 6wcB1VE/raxt99cUFBiVBRjCpXzcXYunp3V6gPuB8I15qZto1RCnvMm0CkL+qYyFaAqIYd9wmlf cJeRITxSxBVX6uy8TVyPcW9rt/r1CPs8H0fvRIXPmWtHk0EPwa/IRzlZc1izclxA30tEn/abkHg egNCJvGCSph3TOvPvlI/2kVi53pE6016tipPH/6nDMa6qH5SrkWascN9h20fr7Boh4TZ/pOwdeR 75telC1aB2QiAiPDgMuPT0LU9S8wQvalKoxQWVdG+Ny08wvCP6m02LUem2AdEVHkPAcRx4eGehP AtYp0is5uxBJX+VBsAIH0SFNe4JJyNBqZ0 X-Received: by 2002:a05:622a:2d5:b0:50d:9f02:86c7 with SMTP id d75a77b69052e-51461c11682mr155811861cf.13.1778207303232; Thu, 07 May 2026 19:28:23 -0700 (PDT) Received: from localhost ([2a03:2880:f800:32::]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-5148e7e3d90sm4711201cf.20.2026.05.07.19.28.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 19:28:22 -0700 (PDT) From: Bobby Eshleman Date: Thu, 07 May 2026 19:27:50 -0700 Subject: [PATCH net-next v3 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: <20260507-tcp-dm-netkit-v3-5-52821445867c@meta.com> References: <20260507-tcp-dm-netkit-v3-0-52821445867c@meta.com> In-Reply-To: <20260507-tcp-dm-netkit-v3-0-52821445867c@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.14.3 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. Signed-off-by: Bobby Eshleman Acked-by: Stanislav Fomichev --- 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 Sat Jun 13 10:06:28 2026 Received: from mail-qk1-f170.google.com (mail-qk1-f170.google.com [209.85.222.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C2DC627E049 for ; Fri, 8 May 2026 02:28:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778207312; cv=none; b=H1jxZyhEuom+lh//y6q1hEMnxqdDWfMsoTMjyXQJl7n7bhNJOBJ6xTLW5ecz4SlhM/7HmewvYiXBqj3jGhsqL2f0egJA+IS/BS3a73CyVobIQ8vVhSQgn3rbLtlAEnDfvljzzsaZdVy1Eog33opzmlM1Jl5S+zQbCEgWlMb9QPs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778207312; c=relaxed/simple; bh=wr5nOXXQbhXEnUpfkQ7Zz1wqfSv32AZh5IA6v1MiYWI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HTBl2Eq83+LguR8kHVXQUq/jsZJSiOBP//6jJtNj0JUSuo4wJNzPB30q0O60a4IpJKqZDuzMhpQGgVVEBbN9ZCsKhxdRmIGzjckLDW7MAXmW//BlHTQQOExQ0A+gf/LnfwqJZorqGj5h7JYQ2xph9XSm0YFQ2qZCyzkIMAWLjdY= 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=Ie0ipZKK; arc=none smtp.client-ip=209.85.222.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Ie0ipZKK" Received: by mail-qk1-f170.google.com with SMTP id af79cd13be357-8f984bddf4eso148414385a.1 for ; Thu, 07 May 2026 19:28:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778207306; x=1778812106; 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=aWcQzpCH4lUDwqOSoMTuBZLXwluzgAdtBYZzZZPaRJY=; b=Ie0ipZKKZsKfD9pFeSwmi5yyvI93riVlntxEIZz457M997K6+OT1JRr2ZCMznuMH9N Q2GFfMftnUNPeRYXlgkJRwS68bKJiVLvxsBAw5Rq0mvJ2OYE41psu8GHozLt9UKK++dR c26FrhzitJeewNLL3UbkOmEVItWNy2RQDzHn10YCi8XhSxsBdjhcIyzF8xBb+eM3xsRm u0UFjVholqSZPETOcWgbozvEWTgZsB0Uh+aXV0EieTsqzaz7YT+kcQsFS5NZ2LmVcvj7 4d1LpLwSQh6dqiT849d1K0SbaARG3OgOcqBtCWvgswjr5gnSnB4zvEnn7tHeIV3F0YnW +5fQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778207306; x=1778812106; 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=aWcQzpCH4lUDwqOSoMTuBZLXwluzgAdtBYZzZZPaRJY=; b=JP3aISO51ir1O5w0XCVjfwIOl07X6H/HlX67lHED2v08+6mQNWilwmtu10/Td0WR0f joMUb2D3gViW0Zv94LcM3f2P/CeQm5pkvr+z63+4y5hkuvOsvm+KF5pvvxnOkmqd1Fx1 reviBKHM4hR4bWYWGkjhBALKMMigiNEESaavATViP/sM7ZOwVPozmXduxbYcT38JoKSO bXNeDzClxCEQkvOp4c5fUETgtfzOIoofby2AtCanuPQFI0Wp+Wk/D4s6zyM+CYJ6WCyV 33y4H8Sf6UtOggiYx+FHvJS27KwbwARuy7rK6BJXn03uo/kJD3NCcUOeMCts1YbAu55M 8/IA== X-Forwarded-Encrypted: i=1; AFNElJ9Z32lY1Zv6ZWB0imqaq2XgtALHNMHv9qwDPfxv0eVjgYlLoCbuwIU0T1eFwzg9nf8cuRaZgNXRB8OVnE8=@vger.kernel.org X-Gm-Message-State: AOJu0YyJdzLaAr1dx0vQ+KdpDjpiX7WYUlLeyF7FuX5g5sbBWDSCQDFu wXcEz9lKZ3EV0i5pH29ieRxLhx8XzVczk7aOE+7WJnF6/7NuO1bxXmty X-Gm-Gg: AeBDiesZqqq0FVDElgKA1+OzuCYfLgibxOVVe8U1h486B704+amXBuMg2g2fSt12zsH j2y2FIpSmkzH7zNG09699UFAdz4+v9n49HFHcNXrimBwoPckrt/KfawLGJkcnZBl1OAaEwoDWBu zFpcDaoFNfPPX35zvxL7USjqLien4HWF98QaeBJAdCzHEsBqOgtTgTIiFCttbKnzXKlQ65oboHx qh1BrzPnvlkYhHYOpvyaqRX7v8khl3XI1pXo+GwGabI1zVpKSXZv1QxWNhivdGtj2R9BGe3+bqh 1xt0q2F+3d9PyGlDTy5VrchvlQy+OhQXFnwtZcdPFXpgOmFgAjjvksb0h837OxuRzIzJ0vLTB6X 6zjuXOjTK/JYtW9dTRNUgBvgD3PexPHL7CSIJ2WM9T5tBV0n1URM47LuwrgXxQXN084mcbEqbz4 hAS7WNdHbFdSvNbwiTKDVv X-Received: by 2002:a05:620a:448e:b0:8cd:871c:909d with SMTP id af79cd13be357-904d69e05d9mr1551888485a.53.1778207305584; Thu, 07 May 2026 19:28:25 -0700 (PDT) Received: from localhost ([2a03:2880:f800:b::]) by smtp.gmail.com with ESMTPSA id af79cd13be357-907b9380925sm63082585a.11.2026.05.07.19.28.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 19:28:25 -0700 (PDT) From: Bobby Eshleman Date: Thu, 07 May 2026 19:27:51 -0700 Subject: [PATCH net-next v3 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: <20260507-tcp-dm-netkit-v3-6-52821445867c@meta.com> References: <20260507-tcp-dm-netkit-v3-0-52821445867c@meta.com> In-Reply-To: <20260507-tcp-dm-netkit-v3-0-52821445867c@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.14.3 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...). Signed-off-by: Bobby Eshleman Acked-by: Stanislav Fomichev --- Changes in v4: - 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 Changes in v3: - 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/devmem.py | 77 ++------ .../selftests/drivers/net/hw/lib/py/devmem.py | 218 +++++++++++++++++= ++++ 2 files changed, 231 insertions(+), 64 deletions(-) diff --git a/tools/testing/selftests/drivers/net/hw/devmem.py b/tools/testi= ng/selftests/drivers/net/hw/devmem.py index ee863e90d1e0..dbc1e6a27b6a 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 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") +from lib.py.devmem import setup_test, run_rx, run_tx, run_tx_chunks, run_r= x_hds =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/lib/py/devmem.py b/tool= s/testing/selftests/drivers/net/hw/lib/py/devmem.py new file mode 100644 index 000000000000..d3e7a3645cba --- /dev/null +++ b/tools/testing/selftests/drivers/net/hw/lib/py/devmem.py @@ -0,0 +1,218 @@ +# SPDX-License-Identifier: GPL-2.0 +"""Shared helpers for devmem TCP selftests.""" + +import re + +from net.lib.py import (bkg, cmd, defer, ethtool, rand_port, wait_port_lis= ten, + 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.""" + 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}}) + cfg.orig_rx_rings =3D rings['rx'] + cfg.orig_hds_thresh =3D rings.get('hds-thresh', 0) + cfg.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, cfg.orig_rx_rings)}) + + cfg.src_queue =3D channels - 1 + ethtool(f"-X {cfg.ifname} equal {cfg.src_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 cleanup_nic(cfg): + """Undo configure_nic() by restoring RSS and ring settings.""" + ethtool(f"-X {cfg.ifname} default") + EthtoolFamily().rings_set({'header': {'dev-index': cfg.ifindex}, + 'tcp-data-split': cfg.orig_data_split, + 'hds-thresh': cfg.orig_hds_thresh, + 'rx': cfg.orig_rx_rings}) + + +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) + 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) + 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) + 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) + 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 Sat Jun 13 10:06:28 2026 Received: from mail-qk1-f179.google.com (mail-qk1-f179.google.com [209.85.222.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C90C827E05F for ; Fri, 8 May 2026 02:28:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778207312; cv=none; b=oZqf4l59nNBIECniPmBpWZNBUBkyu0TV7qo5MQz3h+eA60EObVjATFAPBlff2hkOfTSa4Ja12KdjtkEmZo1Bsd4427RgZ1roIoflaMplvpFkVadAFIpQF4hlrB+9NyuvH/Br7gjnzpLWlOZXIqDJ6ZSQQaBFGdfevDjhc17Nj+I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778207312; c=relaxed/simple; bh=k/71Y2ImtPN1Y3u8vlfShyI/QWYwkg3nJmw2XJ2Ytec=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hjiHV7M5gtsx5J7RtngI4SwamaZha6C1VNwZ09NqqWaAiD80PuVOZWZAnm1k/88Q1BUZCrzOfwVN0ZV46nVrhVPynhh2bs40lIJOdPqf32ganlWL0IMpMxS35d2t2FgmlLpN25fbwf1Ho4K+5w9PxwIIawWlqJgvZmSt0Dem4UI= 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=clsAqphz; arc=none smtp.client-ip=209.85.222.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="clsAqphz" Received: by mail-qk1-f179.google.com with SMTP id af79cd13be357-8ef2118b478so156333785a.0 for ; Thu, 07 May 2026 19:28:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778207308; x=1778812108; 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=vZE49U5u+f6SAH65tu5fxzMt1fhOiaVWWuMu9sYPdJg=; b=clsAqphzOC6YpM2ifQOdg+6J5cxxvsMftlBT5tT4UVaQfX9fPjpHivhOfw5J1KFlh0 4Bbk2wNWiEOfkixb26C9PZ2OhukdxaSEXAmDzK405oywNPyz4zroquyKEZpqTV1RMyT7 9na04E8Gznif3ecKCh0iOVWJ8Q5WvW578Uey8JL/oGmEHlvcq5X4didBoBwWti1KHAYQ UsUtz8mb7iUD4AskOcIR7m3ZmyF/aqnx+wSCojfMq2sb4aBbmMiR+99N8biFcmGdL2+e QETCv4ExSftfkYsCSzaIo3o+0AmEmltk/yxL56d411yQO4ZvvqWQfa2wvjmeFGMJPwiD lvww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778207308; x=1778812108; 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=vZE49U5u+f6SAH65tu5fxzMt1fhOiaVWWuMu9sYPdJg=; b=aOMzivKpKIHDXDYqiBeiQwlgCSni8fsh0GwxMmJMg35e4fKyYoP6v4stXXry5N+xGJ 1+EI1S2rbtG97NPNWOq0Jq6AzgEQxleuVlkK47jVF+a/psAcSjDl/fyIxgU5JonbI97X 9KrqBLq6Rl1XPI0lfhs1/7dgVXaY9gaSYYlYM6yQ3xhJRWXN8eosN/H1GLqRShwL1Kvv 76N9/jjYOG7x8MPu4YU+U3aoQSzznYDmo02M38GSG74hwKJOufwJ+1T9jA39Z+mVwKe0 kMOjO8GBDBgvYeidRTVvVcpWZbDCuFs8TrbpOuFNITnxLAh4joQtoIN1GVNWsacJotfK i31A== X-Forwarded-Encrypted: i=1; AFNElJ/ZQAgSstyYrBc0YdaS8s0SLYZAYJE6UHNPM0P9s9W1F7a1kQrTT7uEyDKN5cg+ll5wB2kreLIjyv8iw+g=@vger.kernel.org X-Gm-Message-State: AOJu0Yz1ugPz3HepM4Hb2RyppShBu+dsAB+NKItfjJEZDm9uD8tL2VoT cOQgIaf1QvdiB40f84RcRmHyn5c8IY1XNNNl9Z6YbgKw6VtgC/LNsD5u X-Gm-Gg: AeBDieuztHnWR25LKjZ31hT6fbEzX1ZYbVEeHonhTEOuSk+lA0nZD2oMpm/MFOZbTkT ue1BgenNpvKL3x84DUenaNHy84N9ucmKoNUlxgRTEyDspCnLBl5TzfreXjvhuQgHnz4MTULXQz7 2XROffGsIkHJqTgTTfrv5BnEQsWKs+eOOCh5bplXqq4LvLRbl3dXHg6JtMN1vtjEEFvHNKKWV83 m6sbnOAzzBCI2mYAjWXyg9fXwd78A19YsuKE3rCNFVqpwWC1MNEzrxHI5rag7/3WvwGSd5xyZ1O kV5kN+QRPQ+7wjBjggqEZwFGxx+EXAUlLQknx4XPErHJaPA2Dj1f7qwgEOmXnS8xgM+7XXQMqHT 73Qya3iH3gDApYhl7Tpo64WvSjzrlQsMxxs3r21KjnS+vtZuFXf/RwUAru/OpY071FHGIjFbE/J anyCIA1vWqyUEx3W96Y3yZdQ== X-Received: by 2002:a05:620a:4512:b0:8c6:ff8f:58af with SMTP id af79cd13be357-904d69d8ee6mr1639391685a.51.1778207307713; Thu, 07 May 2026 19:28:27 -0700 (PDT) Received: from localhost ([2a03:2880:f800:11::]) by smtp.gmail.com with ESMTPSA id af79cd13be357-8fc2c91b976sm2147341685a.39.2026.05.07.19.28.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 19:28:27 -0700 (PDT) From: Bobby Eshleman Date: Thu, 07 May 2026 19:27:52 -0700 Subject: [PATCH net-next v3 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: <20260507-tcp-dm-netkit-v3-7-52821445867c@meta.com> References: <20260507-tcp-dm-netkit-v3-0-52821445867c@meta.com> In-Reply-To: <20260507-tcp-dm-netkit-v3-0-52821445867c@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.14.3 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. Signed-off-by: Bobby Eshleman Acked-by: Stanislav Fomichev --- 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 | 93 +++++++++++++++++-= ---- 2 files changed, 114 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..af8e1de8ed7b 100644 --- a/tools/testing/selftests/drivers/net/lib/py/env.py +++ b/tools/testing/selftests/drivers/net/lib/py/env.py @@ -336,15 +336,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 +399,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 +419,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 +477,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 +500,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 +529,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=3D'littl= e') + value_hex =3D ' '.join(f'{b:02x}' for b in phys_ifindex_bytes) + bpftool(f"map update id {bss_map_id} key hex 00 00 00 00 value hex= {value_hex}") --=20 2.53.0-Meta From nobody Sat Jun 13 10:06:28 2026 Received: from mail-qv1-f50.google.com (mail-qv1-f50.google.com [209.85.219.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 D0BBA283FF5 for ; Fri, 8 May 2026 02:28:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778207314; cv=none; b=HQEqpXNln+dcjy83Lp3cxr4ZiMlXYHpVxhBhxYFL0874ysdfbN0pqum0tSbuU8oNh/2gicsPssB3jc9HdDRLa+aUFPHlYbZxH55QExeeBXCOVijsRumdjgBGibMt38+Kpx0zT/gmw6proUDS5R0V4V4cbt3b9BT2nzGg+K9c3GQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778207314; c=relaxed/simple; bh=n7tJve6PSP03zrqEiNRPQpgyL5Of2UxSvSD8zaqgtxU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Pw2dWUEWAmcO79A8vDus27Irf4sB2gKCH70SKi/+Zk1eODExbqYJYKt3zucSdDt2V82/XFVlIqCQJ19mQCQxrG7XhkpzoQrMCTdYVrZrARGa0FMEnG6lI+IadOzN9sDeRENmjcESKxN+Krqz3H5wh/P0s10kbeJv7cu9ORzT0LA= 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=CUrh6Ic9; arc=none smtp.client-ip=209.85.219.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="CUrh6Ic9" Received: by mail-qv1-f50.google.com with SMTP id 6a1803df08f44-8b98482b253so19059396d6.1 for ; Thu, 07 May 2026 19:28:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778207310; x=1778812110; 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=dXA1dxVApJgTc6+2n8TQWi9uv8RI7qdSUELHLNuyKvU=; b=CUrh6Ic9M3t2F3UbV8S4dQY58uu4g0KGDl+yntHgetpwybawUW+HDyLQFkZ43ddXPr 6U13l9URBGfTLCoYhmCp2HbHFoxjltj0wO9LWOHyeLNGC59sFtZHyXs/EkFRYnduh8SY RKn/cibXHGzXrKnPzZuErnScbQ1Jwo2P5hQLEDOR80HJmicgBxgIrj7kHcfn0taTGzxA 2t6+nLP/MWawRKEj2BWoxmTMDFxwkV+AIniQeF3VvVBMphhfzDFkL0PnNRfso7FiySdY Yc/p30iIhxsUFdp/bag84dp6IRa5jsPESuHQt9ve5URFkCXOpYDek1DSg408CfkiIlcp R06w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778207310; x=1778812110; 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=dXA1dxVApJgTc6+2n8TQWi9uv8RI7qdSUELHLNuyKvU=; b=ohczuDwkDf5hQRsYJgK/FQYL/dnblL+ZJGYjwIhy7ptyPt31EA897Ay5uf29Shn14K TsV1mPMo0CwD6wHYt8gF9CpRubirX23ocJNEiJnBSLshrSyFu7kNGRTOLs9ZWWUcE3i1 XMhKsIOLKuibA96HmdRxblUnCi9OBzQXkICnREJUjaHEuoQNOYknUnb+wvy8kVwFNFJZ wKqRr0Or6pq1ShEBIrCBZeWaiVyzco8CHAIVH9e9LkcDmby7++dw6yr31nRqp/B/iDhv mdhksPD7YYgJvmaTxZUwQJ7+V0Q9Ai0EdcWG4TPl9mXuk7CshLXE/fticLz/Kd5IjyrS n/6w== X-Forwarded-Encrypted: i=1; AFNElJ8bQGELPyh+OtnQEijseplKf+1JboE4aFotxcYX8f3Q52lZCXpEjvet8DEzfS4QCN9gyAHYXoP1bGZ/IuQ=@vger.kernel.org X-Gm-Message-State: AOJu0YyBPdaxySoZzoUWmFiLRZ0J+Ta70y3dPvUmOho/cClLoaHyqlGY 1NUx73FKqR8JPOP4dOg4Ny5vzZRDbgXQMTWGgOQsEpXjoZ6xCI/eQ2Ff X-Gm-Gg: Acq92OF7P5RTjdf0GJwgfkTSktiUmkLEPSfjo+2iKWABsxqvAjniaog6WCCHi1bsOQO 6zQKoWNyO5625db58f5PW3d1NwGc2LV06eAnbmsWOwX9tVFSD4t+K57P3J7JuI1yvI3Dz+iRurg I09WTANTtpHFJ6QdfGeJ5B0MdZj6IyldCBUQaSACljSt50LNL+kzVN/q3XtaY+yMiS6ztvVTq+F k5HzA18iM8mZdzJvJqUl6OonU2kzAIH0ItbhVY883IfvT4uAQGCLnTiLoUYM94pEdFrDKdnlkMs utbJf1hgJnmZUWnCtTpTk/4cURqgr6IKubLEzpaW4JzFLRTReOor0IfkvlO5g7p/8uzNFgJQDst YDSKx42ANgdvMhWQ0ATeoMxb7YwryirQDDnqyEKi7pf3vQqfh2yFebP0Qtfey2k45s6x0VyT5+/ z3qAOR5LWRA3+tAul0/Wg= X-Received: by 2002:a05:6214:320f:b0:8ac:a6a5:1f41 with SMTP id 6a1803df08f44-8bc443d5c2cmr162619636d6.27.1778207309884; Thu, 07 May 2026 19:28:29 -0700 (PDT) Received: from localhost ([2a03:2880:ff:73::]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-8bf3a33fab4sm5419346d6.23.2026.05.07.19.28.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 19:28:29 -0700 (PDT) From: Bobby Eshleman Date: Thu, 07 May 2026 19:27:53 -0700 Subject: [PATCH net-next v3 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: <20260507-tcp-dm-netkit-v3-8-52821445867c@meta.com> References: <20260507-tcp-dm-netkit-v3-0-52821445867c@meta.com> In-Reply-To: <20260507-tcp-dm-netkit-v3-0-52821445867c@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.14.3 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. The NIC (HDS, RSS, queue lease) is configured once in main() before ksft_run() and torn down in a finally block via cleanup_nic(), mirroring the nk_qlease.py pattern. This avoids re-toggling NIC settings around every test case. Signed-off-by: Bobby Eshleman Acked-by: Stanislav Fomichev --- 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 | 55 ++++++++++++++++++= ++++ 2 files changed, 56 insertions(+) diff --git a/tools/testing/selftests/drivers/net/hw/Makefile b/tools/testin= g/selftests/drivers/net/hw/Makefile index 85ca4d1ecf9e..2f78c6aec397 100644 --- a/tools/testing/selftests/drivers/net/hw/Makefile +++ b/tools/testing/selftests/drivers/net/hw/Makefile @@ -34,6 +34,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..0e36a0fa9688 --- /dev/null +++ b/tools/testing/selftests/drivers/net/hw/nk_devmem.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0 +"""Test devmem TCP with netkit.""" + +import os +from lib.py import ksft_run, ksft_exit, ksft_disruptive +from lib.py import NetDrvContEnv +from lib.py.devmem import (setup_test, require_devmem, configure_nic, + cleanup_nic, run_rx, run_tx, run_tx_chunks, + run_rx_hds) + + +@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: + """Configure the NIC once, then 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")) + + require_devmem(cfg) + configure_nic(cfg) + try: + ksft_run([check_nk_rx, check_nk_tx, check_nk_tx_chunks, + check_nk_rx_hds], args=3D(cfg,)) + finally: + cleanup_nic(cfg) + + ksft_exit() + + +if __name__ =3D=3D "__main__": + main() --=20 2.53.0-Meta