From nobody Fri Jun 12 23:57:32 2026 Received: from mail-yx1-f43.google.com (mail-yx1-f43.google.com [74.125.224.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6ADA525F988 for ; Tue, 12 May 2026 01:18:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778548696; cv=none; b=KKqRKiic8TkC+o3ZQYSKFHMrIVt9Nf8sPO1grACbjuiCiSEBCZKIEQerNu55jFSLEQoOnFiqboKpnv6JZygzp/gvprZNRh0IbzEItVSWuguIILVqYFflAUG6NOhKIuH1tXiLG6MlAI31d8RKhrgT1zJ1QRS13gHWvdSGfxgMuvg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778548696; c=relaxed/simple; bh=xHAWNIa6bT+COulf/2v7A98t6gXC0BLbleHAw2Yb5yg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AQ8wi5DUvH+iZifLBfqzx0gUumWuTSFsd1g5MEdq8B/Z/BokiJNLDBUcuL2ys3AtMqWd1rLyBoOpFf+7XDksiIhiXzVJB0n0IDi5DPRXXyS83YQdwEbJxJKa2JAQQl059JnKhStMQ/Ic2jtKR1tr9R3CvQywaLi8OtSk7949IIA= 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=Qbpa7H2W; arc=none smtp.client-ip=74.125.224.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Qbpa7H2W" Received: by mail-yx1-f43.google.com with SMTP id 956f58d0204a3-65c52bb5dd7so4779100d50.2 for ; Mon, 11 May 2026 18:18:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778548693; x=1779153493; 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=YhEXX2wI/j3jXP9rN7AH1RFGXiRqwHWcpmYOihpGEpk=; b=Qbpa7H2W+K5HOAuxjhfTlmImo0r2HhCdD+UDuFiBb/vT74mZcf/ff0GLqeQEV4r/yb wx1eaB2+0ywZWpwlJcETCgT8heMSrx1alqj8v02cjxMRwOJuxnYZX9cha7cR4psgQYv3 m90fIvMIy937sZkDOeG8PQA/d46sY7NA9Sxcr6n0JDhhNy3l9NnYZotUA+vzqnFZs8jx RmZN1apH98siw355na/0rAbYmECBEvWKC4BJJJszyCCOi6O27f4jVf+baXRrBGDAnfIX LyoNS8SdMHBWM4CnwPzmWlzRXm554FG7jNsflL8OnYWagXT3aJ4Bzs7s3IMBCDrEEMr1 /EYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778548693; x=1779153493; 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=YhEXX2wI/j3jXP9rN7AH1RFGXiRqwHWcpmYOihpGEpk=; b=HQkUFphZSGmR87KRV/Kc2OiIGOaz6VuLViQrAfHxkZUbO6oo1qgazp+jVgCVxwbpb1 M10R3BBCkLMVCRGYc4tcMQ54BZo+EnU4tWcgG8TDPZ9KVNdq/aW7dEcSU+tDl6L+xZtT Ky1ArAcoUlJ3vHEvTZDlOEbzDn/M/dQfiQBRAwybOa/n9i+cZr6UdumSS+wWWMvqjp4D HfuJ2OjMJ3Tu4o144EUxpJgLqTt015iWVhvIhlMYb+ceEnObDW8pP6xOxtkIbGU+XWXN ziKBWhJEEngePBNZz8XdN5C1XL+e7iSCupEv6/tKNAeo/oj9/SkTf4XbiAiurZTQX8k3 hhjQ== X-Forwarded-Encrypted: i=1; AFNElJ8vwAl4ZpROgjFAkkRuzyEE//1lKuGRbWUbqtWVIqzOjFgDa2cMogrKudmbjRMlRgVdH3I/JXErbZZtd38=@vger.kernel.org X-Gm-Message-State: AOJu0Yx2XtIxPQnMSbBPfTKmID3+xwl3h2DtTvbt5CNEEnMugCgwH/gd 8IJlTHnlqCfxMKLaxrWd3EQ90pYT7k8PRLzs1caplHMXpip8EN1bLRul X-Gm-Gg: Acq92OEFA034HvbsvK4dwtdl7mLvi0hT6V6T6+sk1giIi3f0ARF7TK0S+CIRzB99VdE i1rFKPMRXUHlPAkh8vfDNAlHZHha8i++iReIB8+JzoIwIv6A9ZkCa65z09qyzAQ2dmcGsj3n2+j bP3D2xZAixGm5D65auzMZUjJF0hhUGlreqDOxURZT5ouDa8BYYf8QWbnve8L3zxi+hH66rzZxKo iznzI0SF7mFzSYYNq1bKghJYM+8eo4kJEbgXCej0/1C1Ybf/y7m7Czy0p6ChI72MF//fFdCib8I 4O5TfYr/sOfJ1oyH0BFLmXp54On5suOqhrdrU9svxZlrDGBb9TjxuxUDhgfWuEqZFXOsKVqC5rS eJt3Ry19eK6geYTVP1y3cLGuwOMuBs4ruL4pHacXYBPgFkiMCBHyk5JprBSdAfvCXez+ddQ/CJ+ Yji3SsBwfj5uONsuBwLhBhpg== X-Received: by 2002:a05:690c:c4f1:b0:7bd:8752:cdbd with SMTP id 00721157ae682-7c105770e64mr120866067b3.41.1778548693125; Mon, 11 May 2026 18:18:13 -0700 (PDT) Received: from localhost ([2a03:2880:f806:3e::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-7bd6683aa8asm156438147b3.26.2026.05.11.18.18.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 18:18:12 -0700 (PDT) From: Bobby Eshleman Date: Mon, 11 May 2026 18:17:55 -0700 Subject: [PATCH net-next v4 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: <20260511-tcp-dm-netkit-v4-1-841b78b99d74@meta.com> References: <20260511-tcp-dm-netkit-v4-0-841b78b99d74@meta.com> In-Reply-To: <20260511-tcp-dm-netkit-v4-0-841b78b99d74@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 Acked-by: Stanislav Fomichev Signed-off-by: Bobby Eshleman --- Changes in v4: - netdevice.h: netmem_tx enum list -> only "device netmem TX mode" in comment (Stan) Changes in v3: - Split NO_DMA changes into subsequent commit (Jakub) - Move !netdev->netmem_tx -> netdev->netmem_tx =3D=3D NETMEM_TX_NONE conversions to this patch (Jakub) Changes in v2: - Squash driver conversion patches (2-5) into patch 1 (Jakub) --- Documentation/networking/netmem.rst | 5 ++++- Documentation/translations/zh_CN/networking/netmem.rst | 4 +++- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- drivers/net/ethernet/google/gve/gve_main.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 2 +- drivers/net/ethernet/meta/fbnic/fbnic_netdev.c | 2 +- include/linux/netdevice.h | 7 ++++++- net/core/dev.c | 2 +- net/core/netdev-genl.c | 2 +- 9 files changed, 19 insertions(+), 9 deletions(-) diff --git a/Documentation/networking/netmem.rst b/Documentation/networking= /netmem.rst index b63aded46337..5ccadba4f373 100644 --- a/Documentation/networking/netmem.rst +++ b/Documentation/networking/netmem.rst @@ -95,4 +95,7 @@ Driver TX Requirements netdev@, or reach out to the maintainers and/or almasrymina@google.com = for help adding the netmem API. =20 -2. Driver should declare support by setting `netdev->netmem_tx =3D true` +2. Driver should declare support by setting `netdev->netmem_tx` to the + appropriate mode: + + - `NETMEM_TX_DMA`: for physical devices that perform DMA. diff --git a/Documentation/translations/zh_CN/networking/netmem.rst b/Docum= entation/translations/zh_CN/networking/netmem.rst index fe351a240f02..9c84423b7528 100644 --- a/Documentation/translations/zh_CN/networking/netmem.rst +++ b/Documentation/translations/zh_CN/networking/netmem.rst @@ -89,4 +89,6 @@ dma-mapping API =E5=8E=BB=E5=A4=84=E7=90=86=E3=80=82 =E4=BD=BF=E7=94=A8=E6=9F=90=E4=B8=AA=E8=BF=98=E4=B8=8D=E5=AD=98=E5=9C=A8= =E7=9A=84 netmem API=EF=BC=8C=E4=BD=A0=E5=8F=AF=E4=BB=A5=E8=87=AA=E8=A1=8C= =E6=B7=BB=E5=8A=A0=E5=B9=B6=E6=8F=90=E4=BA=A4=E5=88=B0 netdev@=EF=BC=8C=E4= =B9=9F=E5=8F=AF=E4=BB=A5=E8=81=94=E7=B3=BB=E7=BB=B4=E6=8A=A4 =E4=BA=BA=E5=91=98=E6=88=96=E8=80=85=E5=8F=91=E9=80=81=E9=82=AE=E4=BB=B6= =E8=87=B3 almasrymina@google.com =E5=AF=BB=E6=B1=82=E5=B8=AE=E5=8A=A9=E3=80= =82 =20 -2. =E9=A9=B1=E5=8A=A8=E7=A8=8B=E5=BA=8F=E5=BA=94=E9=80=9A=E8=BF=87=E8=AE= =BE=E7=BD=AE netdev->netmem_tx =3D true =E6=9D=A5=E8=A1=A8=E6=98=8E=E8=87= =AA=E8=BA=AB=E6=94=AF=E6=8C=81 netmem =E5=8A=9F=E8=83=BD=E3=80=82 +2. =E9=A9=B1=E5=8A=A8=E7=A8=8B=E5=BA=8F=E5=BA=94=E5=B0=86 `netdev->netmem_= tx` =E8=AE=BE=E7=BD=AE=E4=B8=BA=E9=80=82=E5=BD=93=E7=9A=84=E6=A8=A1=E5=BC= =8F=EF=BC=9A + + - `NETMEM_TX_DMA`=EF=BC=9A=E9=80=82=E7=94=A8=E4=BA=8E=E6=89=A7=E8=A1=8C= DMA =E7=9A=84=E7=89=A9=E7=90=86=E8=AE=BE=E5=A4=87=E3=80=82 diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 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..a54a37fab8d9 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,7 @@ enum netdev_reg_state { * @lltx: device supports lockless Tx. Deprecated for real HW * drivers. Mainly used by logical interfaces, such as * bonding and tunnels - * @netmem_tx: device support netmem_tx. + * @netmem_tx: device netmem TX mode * * @name: This is the first field of the "visible" part of this structure * (i.e. as seen by users in the "Space.c" file). It is the name diff --git a/net/core/dev.c b/net/core/dev.c index 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 Fri Jun 12 23:57:32 2026 Received: from mail-yw1-f171.google.com (mail-yw1-f171.google.com [209.85.128.171]) (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 F1CDF257459 for ; Tue, 12 May 2026 01:18:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778548698; cv=none; b=VVHcyr8aXOmrp8ChB2Y3WjV9dDrh30lGpHXM+wEcy5eVomWBs6hiNQEIZ+gnXItslGRC33smlDJ2Da1swtlcNODLSHX7tS7Ld3xtHTvkr07ep+Pp/UxfHWhtdmWdD8LaYZ1iMXXUIRURePNk7WfRzWK3Cogf4Rc964b4uMSgss8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778548698; c=relaxed/simple; bh=FkpSFBB/bX+rp9bKDxdBiyERkKc6SlIj+UXp0PrCs9o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FImuNvs9H4+e2lnbUfvpgMhp/nE9NetnGTmO7L1V2PZ6/7X+6b2QtYUVt0qt0JK7Z1yc/qyDu2e2JLlb+XSKmpR7ri0Tf79xmonAxpOGg6Ip/jQnvCo3OT8jZ6lPJguQchZDlcjYB+dVGsvzUYW/FSBWfuubpGPmWO4zg6qDCso= 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=O6OLNnaJ; arc=none smtp.client-ip=209.85.128.171 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="O6OLNnaJ" Received: by mail-yw1-f171.google.com with SMTP id 00721157ae682-7bf1433b80cso34002777b3.1 for ; Mon, 11 May 2026 18:18:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778548695; x=1779153495; 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=HLDMf75sSoZOlrolBDWd/AGNeQyGKtHDPvvwXPguYtg=; b=O6OLNnaJx+MlTLz/ACEqApos1UX6Lf8jPn6qF2GzWoOG7H3kLU2kMTVP9RetkuoDXw m2sov/ke7KXA/8S7iQnIWncNcOezzK0uPuMA9T1RGmbqSufQV8snuc5vzWruiJCtQa3O bsTPCZyPhtqtbf1CteG8pmrqXdFvguGGZB+dbdkGr4Sx4o0bUooZEYks0zmyK3gRN2Cl Dq6eQKCERmJphsLVqMHcFSz/DnY9+M9bsVQPXZV3udWhJiQ8TPJ7ZPLPXVF3zFiuVvB/ WF5M8HakH6sIHLNCJYcC1XpY+Tzka2RS0koVy+SPnFBkGEBGTB0DQcV86Ja7q71vuL5B R3Hw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778548695; x=1779153495; 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=HLDMf75sSoZOlrolBDWd/AGNeQyGKtHDPvvwXPguYtg=; b=M/tM4nHQftMpX+8zlpAGCQ1fla1/mQ26DjeW+VAiDlXuidAchAwDxDejpnk190x4O6 735Cl1x0EXY7/JzrXnczfJ9Mar5uAo6O3sediCXdL6Waq6RpqC9SmU9fCs2htmZSe6+D IXGkVbwz4fLrLmnMkCw8hEs/YR1qrvt0XyEmJYp0h7uVK0fZbL53VGmhXHduBqgCPZqD II1Q9KSv5ddfeQ/bGKEsk6I8/Q/aVVSoJaxfYJP/3wkZQZMhgT0UCzUjl7YpWdyfRrk2 WoUO3B2aU8270r6W5/mEOFl0xy9qj78pvXn5rLqHPJ5oZbJQmYW+y9fvlr58JVsU/1X+ 1n8Q== X-Forwarded-Encrypted: i=1; AFNElJ99BAIK2F7EevpWG0q5lBtcpgWAW1kRkEkEiou296ZLS/j1m5wHYr71EuDiq2wL6W3TCy9zJDSvOCJN9J8=@vger.kernel.org X-Gm-Message-State: AOJu0YwpzQ9VyS8uG3oJ7dWPxeduGtKlkHU/FgD/xHYnMyhitN40qYUx bnqS3zoqYBCyG1wwmWQ/Aa/Ms6dreEx1zDq2qbeBm3c0CK3E9OTX9c32 X-Gm-Gg: Acq92OHSkeXwjeIlnPdUBtznBrj/2mSkHQdFYUL2/VJgvPmFJan0njko2Ef8zzGnjHl fCNQkj8G8+/fqnpmmaJeIWsmKDIOeCNV2fWLhiVKiT+ryzw1fIZhLIo+Ps/3WrquBNt7DF7Y7x0 uhSIkMwgv13NgzzmV1z/HLKnHq3AitPGfBsbUTSTq+4N9va3xqKHIbRtYw5SPeA2lSk82StY0CF L3NwA2rjxQVPd/r68D87XnyK8t/Z1G4KhjQy1ledHp8oDCVy+AJIxRjP5w684lxW+DWQ33BdDR5 8y6z4D3uopwUh6zGh+41UTCNwYfO1+E+yxghlc6eYOjheM5hM9j9EYPRUQBmFH0XZd3NE6619wM jmsKsiHnLTG2iNQwQMtnZvkdpclAkHDhDsZ1JTFZEUIA7KPuC0lKSAor3XRWopu+tismDCW6lmO hWjN7mWU+132QX7pOoZiakJg== X-Received: by 2002:a05:690c:389:b0:7bd:6a98:58d7 with SMTP id 00721157ae682-7c1059649cbmr113947997b3.38.1778548694820; Mon, 11 May 2026 18:18:14 -0700 (PDT) Received: from localhost ([2a03:2880:f806:16::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-7c535f8e757sm5443377b3.34.2026.05.11.18.18.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 18:18:14 -0700 (PDT) From: Bobby Eshleman Date: Mon, 11 May 2026 18:17:56 -0700 Subject: [PATCH net-next v4 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: <20260511-tcp-dm-netkit-v4-2-841b78b99d74@meta.com> References: <20260511-tcp-dm-netkit-v4-0-841b78b99d74@meta.com> In-Reply-To: <20260511-tcp-dm-netkit-v4-0-841b78b99d74@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. Acked-by: Stanislav Fomichev Signed-off-by: Bobby Eshleman --- Changes in v3: - net_cachelines/net_device.rst: align the netmem_tx row's type column with the rest of the table by using "unsigned_long:2" instead of "unsigned long:2" - Split this into a distinct patch (Jakub) --- Documentation/networking/net_cachelines/net_device.rst | 2 +- Documentation/networking/netmem.rst | 3 +++ Documentation/translations/zh_CN/networking/netmem.rst | 3 +++ drivers/net/netkit.c | 1 + include/linux/netdevice.h | 3 ++- 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Documentation/networking/net_cachelines/net_device.rst b/Docum= entation/networking/net_cachelines/net_device.rst index 1c19bb7705df..7b3392553fd6 100644 --- a/Documentation/networking/net_cachelines/net_device.rst +++ b/Documentation/networking/net_cachelines/net_device.rst @@ -10,7 +10,7 @@ Type Name = fastpath_tx_acce =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D unsigned_long:32 priv_flags read_mostl= y __dev_queue_xmit(tx) unsigned_long:1 lltx read_mostl= y HARD_TX_LOCK,HARD_TX_TRYLOCK,HARD_TX_UNLOCK(t= x) -unsigned long:1 netmem_tx:1; read_mostly +unsigned_long:2 netmem_tx:2; read_mostly char name[16] struct netdev_name_node* name_node struct dev_ifalias* ifalias diff --git a/Documentation/networking/netmem.rst b/Documentation/networking= /netmem.rst index 5ccadba4f373..217869d1108d 100644 --- a/Documentation/networking/netmem.rst +++ b/Documentation/networking/netmem.rst @@ -99,3 +99,6 @@ Driver TX Requirements appropriate mode: =20 - `NETMEM_TX_DMA`: for physical devices that perform DMA. + + - `NETMEM_TX_NO_DMA`: for virtual or passthrough devices that do + not DMA, but still support handling of netmem-backed skbs. diff --git a/Documentation/translations/zh_CN/networking/netmem.rst b/Docum= entation/translations/zh_CN/networking/netmem.rst index 9c84423b7528..320f3eacf51b 100644 --- a/Documentation/translations/zh_CN/networking/netmem.rst +++ b/Documentation/translations/zh_CN/networking/netmem.rst @@ -92,3 +92,6 @@ dma-mapping API =E5=8E=BB=E5=A4=84=E7=90=86=E3=80=82 2. =E9=A9=B1=E5=8A=A8=E7=A8=8B=E5=BA=8F=E5=BA=94=E5=B0=86 `netdev->netmem_= tx` =E8=AE=BE=E7=BD=AE=E4=B8=BA=E9=80=82=E5=BD=93=E7=9A=84=E6=A8=A1=E5=BC= =8F=EF=BC=9A =20 - `NETMEM_TX_DMA`=EF=BC=9A=E9=80=82=E7=94=A8=E4=BA=8E=E6=89=A7=E8=A1=8C= DMA =E7=9A=84=E7=89=A9=E7=90=86=E8=AE=BE=E5=A4=87=E3=80=82 + + - `NETMEM_TX_NO_DMA`=EF=BC=9A=E9=80=82=E7=94=A8=E4=BA=8E=E4=B8=8D=E6=89= =A7=E8=A1=8C DMA =E7=9A=84=E8=99=9A=E6=8B=9F=E6=88=96=E9=80=8F=E4=BC=A0=E8= =AE=BE=E5=A4=87=EF=BC=8C=E4=BD=86=E4=BB=8D=E6=94=AF=E6=8C=81 + =E5=A4=84=E7=90=86 netmem =E6=94=AF=E6=8C=81=E7=9A=84 skb=E3=80=82 diff --git a/drivers/net/netkit.c b/drivers/net/netkit.c index 5e2eecc3165d..0ad6a806d7d5 100644 --- a/drivers/net/netkit.c +++ b/drivers/net/netkit.c @@ -466,6 +466,7 @@ static void netkit_setup(struct net_device *dev) dev->priv_flags |=3D IFF_NO_QUEUE; dev->priv_flags |=3D IFF_DISABLE_NETPOLL; dev->lltx =3D true; + dev->netmem_tx =3D NETMEM_TX_NO_DMA; =20 dev->netdev_ops =3D &netkit_netdev_ops; dev->ethtool_ops =3D &netkit_ethtool_ops; diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index a54a37fab8d9..8ece36815ff9 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 { @@ -2137,7 +2138,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 Fri Jun 12 23:57:32 2026 Received: from mail-yw1-f173.google.com (mail-yw1-f173.google.com [209.85.128.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 899D019E7F7 for ; Tue, 12 May 2026 01:18:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778548703; cv=none; b=Ry69qrmqLLr7uiYvgw88NNZU2cdAL+PSMWKX58hIl6Ca/s58osJM/n6RFp8urLJ8uTf1mY3a0KycQW7WKx28Ahj4SvEPr7JVD0XG4DUPOYcTLYJUCzz1ADj2+x6K23Qog/UbpaHxFkpdXKjwUD6RcFwN65cZEY1ixKVYWV9hAuE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778548703; c=relaxed/simple; bh=yvnd2jpTzv7uquF5X3DZ7Q87rn0nrx7kMgTRq02m/Ns=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JckNYKFlsnQjlO1gGozHgr64+1Z+W7oBXi9xVpyD7QkS7K3NOn6PsE/8Ma6C0NRMikuKca6Ar7Vt5tVTFq+pikjWxl4Q7aIcoKs/u6A93wJTYSh2BggIus2nZlYiJkxgio/iLtJ5MkFl6/+c8O8uEqK/ux2x+7B20rJbFfSysCY= 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=nstw92OX; arc=none smtp.client-ip=209.85.128.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nstw92OX" Received: by mail-yw1-f173.google.com with SMTP id 00721157ae682-7bf0b47d2f1so46248607b3.3 for ; Mon, 11 May 2026 18:18:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778548696; x=1779153496; 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=LaTOd3vwyY+N8dU2vAPUPWXUXO0K0ZlI7SyXM5QjVRQ=; b=nstw92OXLKwIxzs3c9xrgGcz73lraWbvz4jpQxFe2VU9D1y0GCTvdQ6hQCTpWutsUC L7GdY19p5rBdiMb1gt6X7tDxRG58kSGIoGvtMhP+Uug+Jacq88sA7kH8iXmPv2Bv7XGA QIMmAlWAtrogJft69YKtii1BVLobMGiLFq8ayrv9a5EOA3x93MSCzReKJKJrKkgUhElB 7UUpDUCDDvpjWWfn8r/tSEX0d2q2ouZhDZM0+pjy3ffPvwfRXEtT3v4aiQL87VXmQf0D WRCWVXmVsBwMJu+gBpIYoZGlWKo9B+VDSz+fMc3mEGBHa6KFbZZbKl6SSEcwXQNoDRSn aklg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778548696; x=1779153496; 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=LaTOd3vwyY+N8dU2vAPUPWXUXO0K0ZlI7SyXM5QjVRQ=; b=sIKsAMsCGH4d0M6JW5uhLoijxmR3Th4PIQYUdojkuBYbZUB2vNQiusXLCCP2hlKMQb +YOsP9/LE0wkHyM1n9sgPM2LfA3kKBHzJedj4EaGXkZKS6wN9NgLoYRv+EarrxIHcpRc pYS0OCSRwnfFk7yrDFPSyJQVG0mSSAmPg2b587jYVG4SYZ4itr/8MwzFPjNxbvpzImcn EcfLlHg3B8aEfdT0GC34eWeaWG/C6KnOa5lIMyYODOffbhl0mLxgaFRmiYIeH2XCemeE U+v07HAqt1W9NWMsYgCkvnTGtV3J6o+uSh9gosfrUXXByIaO0qc7kwUsiJ4JUP3n+wNt Of6Q== X-Forwarded-Encrypted: i=1; AFNElJ9aeqSXFAmPfrGr5vJCep6fq7haSCXNgnr4v9SGh+WCOUogC+T5XNUMHw3/653gnZIfgKGGZ8QoG+00TIg=@vger.kernel.org X-Gm-Message-State: AOJu0YygYGHrM7eR2HWQtJke4WhKIz8gmrSUZYGDlLKS+GEN6EqqOpdt OAZkYVG0grx23p1Xz8Qp00es7VcsoXde5F4SWGnj9la8ku/cCr/Pn9fZ X-Gm-Gg: Acq92OHZI5tKH8GmXRYojblLxvtYJm3I2jQmXGu0WX6ukaT2tg6mPekpxapgBq2mrR3 lpQMEptAL9TqLsVhNrZ01YlxyBHGWSv4HCiX9EHMxyJKh1+ryScp0F1ePNrMtf8veQvfkXSQYol kyB9Eckoe5MXUeEYCyQE9UsaALRGMEkmMboe79AuQR/a2jm1TapgGQ2JJ8doLlnTTzDFjtYuGue QM7nFbnvoP15QgAXn6lz5D6Gb6flZD6ZVPoKZH52RjQaFvIdcghzYMm+yMmMwQCbQHCCTA7dqYW 3l21EBGM9nq4rs5VTA/y6HNhKljrR2b6qW5jEPbW1V8OXuGer8XxYnQHTEp38gS0hPz+Y+u45ad LXGOQzqbC0hJf7fyBpO14Qqw/gGsAztyAppsxBPuO+ELvC286tnZ6ZrsulGDrT6bWIa+xE7GrL0 CklE7mpWRESGw5QxycZtRFFA== X-Received: by 2002:a05:690c:e3e9:b0:7ba:f1a2:a448 with SMTP id 00721157ae682-7bfb71f45cbmr145963037b3.10.1778548696361; Mon, 11 May 2026 18:18:16 -0700 (PDT) Received: from localhost ([2a03:2880:f806:3e::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-7bd6683aa8asm156438657b3.26.2026.05.11.18.18.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 18:18:16 -0700 (PDT) From: Bobby Eshleman Date: Mon, 11 May 2026 18:17:57 -0700 Subject: [PATCH net-next v4 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: <20260511-tcp-dm-netkit-v4-3-841b78b99d74@meta.com> References: <20260511-tcp-dm-netkit-v4-0-841b78b99d74@meta.com> In-Reply-To: <20260511-tcp-dm-netkit-v4-0-841b78b99d74@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. Acked-by: Stanislav Fomichev Signed-off-by: Bobby Eshleman --- Changes in v4: - Fold the `NETMEM_TX_NO_DMA` check in `validate_xmit_unreadable_skb()` (Stan, Jakub) - Convert `binding->vdev` to void* opaque cookie with comment (Jakub) Changes in v3: - Fix validate_xmit_unreadable_skb() bug for non-devmem unreadable niovs (should not be dropped) - Major simplification of validate_xmit_unreadable_skb() - Fix prematurely released lock in bind-tx handler (Jakub) Changes in v2: - In validate_xmit_unreadable_skb() to check netmem_tx mode before inspecting frags (Jakub) - Lock bind_dev around netdev_queue_get_dma_dev() when bind_dev !=3D netdev to fix lockdep (Sashiko) --- net/core/dev.c | 3 ++- net/core/devmem.c | 6 +++-- net/core/devmem.h | 10 ++++++-- net/core/netdev-genl.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++= ---- 4 files changed, 72 insertions(+), 10 deletions(-) diff --git a/net/core/dev.c b/net/core/dev.c index fbe4c328a367..e1dc3ec88fe2 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3993,7 +3993,8 @@ static struct sk_buff *validate_xmit_unreadable_skb(s= truct sk_buff *skb, struct skb_shared_info *shinfo; struct net_iov *niov; =20 - if (likely(skb_frags_readable(skb))) + if (likely(skb_frags_readable(skb) || + dev->netmem_tx =3D=3D NETMEM_TX_NO_DMA)) goto out; =20 if (dev->netmem_tx =3D=3D NETMEM_TX_NONE) diff --git a/net/core/devmem.c b/net/core/devmem.c index cde4c89bc146..1c67e7524246 100644 --- a/net/core/devmem.c +++ b/net/core/devmem.c @@ -181,7 +181,7 @@ int net_devmem_bind_dmabuf_to_queue(struct net_device *= dev, u32 rxq_idx, } =20 struct net_devmem_dmabuf_binding * -net_devmem_bind_dmabuf(struct net_device *dev, +net_devmem_bind_dmabuf(struct net_device *dev, void *vdev, struct device *dma_dev, enum dma_data_direction direction, unsigned int dmabuf_fd, struct netdev_nl_sock *priv, @@ -212,6 +212,7 @@ net_devmem_bind_dmabuf(struct net_device *dev, } =20 binding->dev =3D dev; + binding->vdev =3D vdev; xa_init_flags(&binding->bound_rxqs, XA_FLAGS_ALLOC); =20 err =3D percpu_ref_init(&binding->ref, @@ -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..3852a56036cb 100644 --- a/net/core/devmem.h +++ b/net/core/devmem.h @@ -19,7 +19,13 @@ struct net_devmem_dmabuf_binding { struct dma_buf *dmabuf; struct dma_buf_attachment *attachment; struct sg_table *sgt; + /* Physical NIC that does the actual DMA for this binding. */ struct net_device *dev; + /* Opaque cookie identifying the virtual device (e.g. netkit) the user + * called bind-tx on. Used only for pointer comparison. Never + * dereferenced. + */ + void *vdev; struct gen_pool *chunk_pool; /* Protect dev */ struct mutex lock; @@ -84,7 +90,7 @@ struct dmabuf_genpool_chunk_owner { =20 void __net_devmem_dmabuf_binding_free(struct work_struct *wq); struct net_devmem_dmabuf_binding * -net_devmem_bind_dmabuf(struct net_device *dev, +net_devmem_bind_dmabuf(struct net_device *dev, void *vdev, struct device *dma_dev, enum dma_data_direction direction, unsigned int dmabuf_fd, struct netdev_nl_sock *priv, @@ -165,7 +171,7 @@ static inline void net_devmem_put_net_iov(struct net_io= v *niov) } =20 static inline struct net_devmem_dmabuf_binding * -net_devmem_bind_dmabuf(struct net_device *dev, +net_devmem_bind_dmabuf(struct net_device *dev, void *vdev, struct device *dma_dev, enum dma_data_direction direction, unsigned int dmabuf_fd, diff --git a/net/core/netdev-genl.c b/net/core/netdev-genl.c index 4d2c49371cdb..b4d48f3672a5 100644 --- a/net/core/netdev-genl.c +++ b/net/core/netdev-genl.c @@ -1077,7 +1077,7 @@ int netdev_nl_bind_rx_doit(struct sk_buff *skb, struc= t genl_info *info) goto err_rxq_bitmap; } =20 - binding =3D net_devmem_bind_dmabuf(netdev, dma_dev, DMA_FROM_DEVICE, + binding =3D net_devmem_bind_dmabuf(netdev, NULL, dma_dev, DMA_FROM_DEVICE, dmabuf_fd, priv, info->extack); if (IS_ERR(binding)) { err =3D PTR_ERR(binding); @@ -1119,9 +1119,43 @@ int netdev_nl_bind_rx_doit(struct sk_buff *skb, stru= ct genl_info *info) return err; } =20 +/* Find the DMA-capable device for a netmem TX binding. + * + * For NETMEM_TX_DMA devices, return the device itself. + * For NETMEM_TX_NO_DMA devices, walk leased RX queues to find the underly= ing + * physical device and return it. + */ +static struct net_device * +netdev_find_netmem_tx_dev(struct net_device *dev) +{ + struct netdev_rx_queue *lease_rxq; + struct net_device *phys_dev; + int i; + + if (dev->netmem_tx =3D=3D NETMEM_TX_DMA) + return dev; + + if (dev->netmem_tx !=3D NETMEM_TX_NO_DMA) + return NULL; + + for (i =3D 0; i < dev->real_num_rx_queues; i++) { + lease_rxq =3D READ_ONCE(__netif_get_rx_queue(dev, i)->lease); + if (!lease_rxq) + continue; + + phys_dev =3D lease_rxq->dev; + if (netif_device_present(phys_dev) && + phys_dev->netmem_tx =3D=3D NETMEM_TX_DMA) + return phys_dev; + } + + return NULL; +} + int netdev_nl_bind_tx_doit(struct sk_buff *skb, struct genl_info *info) { struct net_devmem_dmabuf_binding *binding; + struct net_device *bind_dev; struct netdev_nl_sock *priv; struct net_device *netdev; struct device *dma_dev; @@ -1171,22 +1205,41 @@ int netdev_nl_bind_tx_doit(struct sk_buff *skb, str= uct genl_info *info) goto err_unlock_netdev; } =20 - dma_dev =3D netdev_queue_get_dma_dev(netdev, 0, NETDEV_QUEUE_TYPE_TX); - binding =3D net_devmem_bind_dmabuf(netdev, dma_dev, DMA_TO_DEVICE, - dmabuf_fd, priv, info->extack); + bind_dev =3D netdev_find_netmem_tx_dev(netdev); + if (!bind_dev) { + err =3D -EOPNOTSUPP; + NL_SET_ERR_MSG(info->extack, + "No DMA-capable device found for netmem TX"); + goto err_unlock_netdev; + } + + if (bind_dev !=3D netdev) + netdev_lock(bind_dev); + + dma_dev =3D netdev_queue_get_dma_dev(bind_dev, 0, NETDEV_QUEUE_TYPE_TX); + + binding =3D net_devmem_bind_dmabuf(bind_dev, + bind_dev !=3D netdev ? netdev : NULL, + dma_dev, DMA_TO_DEVICE, dmabuf_fd, + priv, info->extack); if (IS_ERR(binding)) { err =3D PTR_ERR(binding); - goto err_unlock_netdev; + goto err_unlock_bind_dev; } =20 nla_put_u32(rsp, NETDEV_A_DMABUF_ID, binding->id); genlmsg_end(rsp, hdr); =20 + if (bind_dev !=3D netdev) + netdev_unlock(bind_dev); netdev_unlock(netdev); mutex_unlock(&priv->lock); =20 return genlmsg_reply(rsp, info); =20 +err_unlock_bind_dev: + if (bind_dev !=3D netdev) + netdev_unlock(bind_dev); err_unlock_netdev: netdev_unlock(netdev); err_unlock_sock: --=20 2.53.0-Meta From nobody Fri Jun 12 23:57:32 2026 Received: from mail-qk1-f174.google.com (mail-qk1-f174.google.com [209.85.222.174]) (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 555E429BDB4 for ; Tue, 12 May 2026 01:18:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778548705; cv=none; b=ppjWf+g1Z2wmjcRzf87fMNm6caPQpMhxc9GgcEKR+w32IcfOvhHIAwJOWfbCWKDurjmZIYs7iYX9BWe39GHDiR/NZnHeRjCPdxpMg/JN12XPC5jYtj99lA1WUneQYIFRCcdEoBh7sRP5XeEXp1KvDlEBXEQMlRqcRSlgi/eMi0E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778548705; c=relaxed/simple; bh=1QC4PkD36OXhmrBejw/9qqlS5pST0Kv6rS1HYH/Wsr4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sPv/BzM5GR1BHFniy4tQkuT8AXfkkeTG2uSxv5NSZ3EEFcc1x6CGespZcCn6KyffNB92U83GQa10l9pgv2kQbgG8Wbi54zDWaSRJu3bbouaOvsiv8WLvI0vY2S1KSRdgfGPP+O9p8rUgEEjsp7JDsY+v65Y0DZQwsj5Y7qtFMJ0= 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=NGB1/HiY; arc=none smtp.client-ip=209.85.222.174 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="NGB1/HiY" Received: by mail-qk1-f174.google.com with SMTP id af79cd13be357-8d7e7f48499so540581285a.1 for ; Mon, 11 May 2026 18:18:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778548698; x=1779153498; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=rXRLmOaeN9M4AwY3iBISX01P3DWw0uS/LnGVtbElBLg=; b=NGB1/HiYzPr5PkViOS+y5Yd85YYRNxoJK7krJlOqjGqkO9w02kF24VXWwMayogw1oa RiozLEcOU7BGga+IoXQO5y+jLfP9hLZeqic+zw6Enl7iEk8j8b0XJT8bmkxcsFKLFVra rS1mj5VlsrWFKfeUzQfzQmlNbPkubIKGrRCLUGJFjhZl+QBR8bhQTf2jS/d/Jej1tp3s 6VFnTPzkWtBJY8r8ZzdA34mgeQaE9fUU5P+Vd2KUxlWoPfA2DKFf38ROa+dVbgPTlqRA qd1ZCg/Jor2/XYoTxBFY5X9TY3NTh3yMw86G03R5MJBNeZchf7o34KfGzdocUYp53IXA CfHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778548698; x=1779153498; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=rXRLmOaeN9M4AwY3iBISX01P3DWw0uS/LnGVtbElBLg=; b=D8+QtEn4nUHg3H1HUt9usbTAQcPyMho1HMDfp1LhbidDBVDTnXLf8mXSCgzgjNYE4P saERyZko/eROjsm/I8BQqw9Jc4TkrkwW22TKqf/5hkEns7l4ZvQAHSvRgRsWmQoXdLPR S2GoZxjif8EpBFgFiIzMnDZT34zYJvc9g6Bkmz9m0ec2tFZGYhgQAEX+pCoQiWj21WZL XhguDrOp0TQ5eF+xJAcnpBg8eNuus4i6Cc5vVRS4Ia899ryr4iOh+DIFLGL7+jCg0Q9n mf0MARBAmlJZeBmJWv9uGp4Y5WVAf5aQedGyK9prts2LwxQLZEWtW54mhGlvNMIVKLTV Zc7g== X-Forwarded-Encrypted: i=1; AFNElJ/F7bXswc9qoRTxSia9A1tse1UEn5xDg/TBBBUdxkgwn3hpeKT0drJS0UygSKAf3tL+gj0Yl9e2UGaTg28=@vger.kernel.org X-Gm-Message-State: AOJu0Yw2ano4GTiuzBxJ76U7VQpJJJDvK/N41PA2Bn+EkQ+ELPV0IMvC bOL+Y8Y2EiSPOkv7UkSuHrlQaWs34X63qkNQtKlEs1O1gKOp1PjxqVoz X-Gm-Gg: Acq92OF++BZSJ3NlfKWVtIzJmvpEMc75UovB4vn99hUzssLltJBsnU+iXjsfDQfm7SK 7F6WmmsDwZekY/fywUnpV12WTeLSKx2uK+6b4r6ve5dEVVLAW8nURqIg884wQ3kGkwpH4cqx65h 9Bfa4Bm0R/0k+hcJmy3CdQaFcYCQaeF6yFMKdLYcm9ZqWMSn5ucZw0iOOjkq0n0I+pQjJdWCc6I c6J2Kpj/ryUVsRxaUKMXkoMYPYw3GBf74yQrNinQvZ+Ir0GTqssE0QQsrekG9qNhbeQWo4eZikV ExRzc5c1bIp3Haf215kq/4Ion9RDXKExPmR5s4qU1FH1CMwu81LWgnhR7CfI6c9xlBehooeSxAe n+AWs07GhsBOLzBD9L5/kFzaKlY8Ep462ynyQqUuwQIPvqJ2r7aqsPeKo7jpgu8vBQpfE+M0KLD YaxCIDcKj/pQjiBHx2/kw= X-Received: by 2002:a05:620a:3713:b0:8cd:80f1:f460 with SMTP id af79cd13be357-904d66eeaf8mr3772364685a.45.1778548698188; Mon, 11 May 2026 18:18:18 -0700 (PDT) Received: from localhost ([2a03:2880:ff:70::]) by smtp.gmail.com with ESMTPSA id af79cd13be357-8fc2cd04de9sm3313682185a.44.2026.05.11.18.18.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 18:18:17 -0700 (PDT) From: Bobby Eshleman Date: Mon, 11 May 2026 18:17:58 -0700 Subject: [PATCH net-next v4 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: <20260511-tcp-dm-netkit-v4-4-841b78b99d74@meta.com> References: <20260511-tcp-dm-netkit-v4-0-841b78b99d74@meta.com> In-Reply-To: <20260511-tcp-dm-netkit-v4-0-841b78b99d74@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. Acked-by: Stanislav Fomichev Signed-off-by: Bobby Eshleman --- tools/testing/selftests/drivers/net/hw/ncdevmem.c | 58 +++++++++++++------= ---- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/tools/testing/selftests/drivers/net/hw/ncdevmem.c b/tools/test= ing/selftests/drivers/net/hw/ncdevmem.c index e098d6534c3c..d96e8a3b5a65 100644 --- a/tools/testing/selftests/drivers/net/hw/ncdevmem.c +++ b/tools/testing/selftests/drivers/net/hw/ncdevmem.c @@ -93,6 +93,7 @@ static char *port; static size_t do_validation; static int start_queue =3D -1; static int num_queues =3D -1; +static int skip_config; static char *ifname; static unsigned int ifindex; static unsigned int dmabuf_id; @@ -828,7 +829,7 @@ static struct netdev_queue_id *create_queues(void) =20 static int do_server(struct memory_buffer *mem) { - struct ethtool_rings_get_rsp *ring_config; + struct ethtool_rings_get_rsp *ring_config =3D NULL; char ctrl_data[sizeof(int) * 20000]; size_t non_page_aligned_frags =3D 0; struct sockaddr_in6 client_addr; @@ -851,27 +852,29 @@ static int do_server(struct memory_buffer *mem) return -1; } =20 - ring_config =3D get_ring_config(); - if (!ring_config) { - pr_err("Failed to get current ring configuration"); - return -1; - } + if (!skip_config) { + ring_config =3D get_ring_config(); + if (!ring_config) { + pr_err("Failed to get current ring configuration"); + return -1; + } =20 - if (configure_headersplit(ring_config, 1)) { - pr_err("Failed to enable TCP header split"); - goto err_free_ring_config; - } + if (configure_headersplit(ring_config, 1)) { + pr_err("Failed to enable TCP header split"); + goto err_free_ring_config; + } =20 - /* Configure RSS to divert all traffic from our devmem queues */ - if (configure_rss()) { - pr_err("Failed to configure rss"); - goto err_reset_headersplit; - } + /* Configure RSS to divert all traffic from our devmem queues */ + if (configure_rss()) { + pr_err("Failed to configure rss"); + goto err_reset_headersplit; + } =20 - /* Flow steer our devmem flows to start_queue */ - if (configure_flow_steering(&server_sin)) { - pr_err("Failed to configure flow steering"); - goto err_reset_rss; + /* Flow steer our devmem flows to start_queue */ + if (configure_flow_steering(&server_sin)) { + pr_err("Failed to configure flow steering"); + goto err_reset_rss; + } } =20 if (bind_rx_queue(ifindex, mem->fd, create_queues(), num_queues, &ys)) { @@ -1052,13 +1055,17 @@ static int do_server(struct memory_buffer *mem) err_unbind: ynl_sock_destroy(ys); err_reset_flow_steering: - reset_flow_steering(); + if (!skip_config) + reset_flow_steering(); err_reset_rss: - reset_rss(); + if (!skip_config) + reset_rss(); err_reset_headersplit: - restore_ring_config(ring_config); + if (!skip_config) + restore_ring_config(ring_config); err_free_ring_config: - ethtool_rings_get_rsp_free(ring_config); + if (!skip_config) + ethtool_rings_get_rsp_free(ring_config); return err; } =20 @@ -1404,7 +1411,7 @@ int main(int argc, char *argv[]) int is_server =3D 0, opt; int ret, err =3D 1; =20 - while ((opt =3D getopt(argc, argv, "Lls:c:p:v:q:t:f:z:")) !=3D -1) { + while ((opt =3D getopt(argc, argv, "Lls:c:p:v:q:t:f:z:n")) !=3D -1) { switch (opt) { case 'L': fail_on_linear =3D true; @@ -1436,6 +1443,9 @@ int main(int argc, char *argv[]) case 'z': max_chunk =3D atoi(optarg); break; + case 'n': + skip_config =3D 1; + break; case '?': fprintf(stderr, "unknown option: %c\n", optopt); break; --=20 2.53.0-Meta From nobody Fri Jun 12 23:57:32 2026 Received: from mail-yx1-f51.google.com (mail-yx1-f51.google.com [74.125.224.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B44AE259CB2 for ; Tue, 12 May 2026 01:18:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778548708; cv=none; b=t4JXBH4nWP4VT+dQa8Um5zKRoUfoGCrU3xZmOqByHbt8VSZnoWpyC8a6dVzNaXgz2SofDsIrqXHTxXTy5ynWR8JRoaYDcE1iRih0ReA4CtbeOWGr/LnQbylgtfR/0OV16bXVCKeg1qMKf1hwU4NtQNPuEOhKnIrm4uylMHYSpYA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778548708; c=relaxed/simple; bh=wptIkvH9L489Qlo2T7M1mLc4bl4xRw6+9h17Bso5o/8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GhlxyxGL79zCGRiXRRZlTnXeXP0IaQ96gd12Wcgr2MrT3iEdPylAILVEdosPpxvG4ip2wUUA3dPwu3qxHSuHA90ZuER8cht7HIN4i9AtKJLlhZu0cIELYTYO1ekq3GhpYK80d/n2SBpYUmqm0drjcTz75V3N4cVxaDrfz/BMaZM= 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=rKjGJHiW; arc=none smtp.client-ip=74.125.224.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="rKjGJHiW" Received: by mail-yx1-f51.google.com with SMTP id 956f58d0204a3-65c364b893aso4799139d50.0 for ; Mon, 11 May 2026 18:18:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778548700; x=1779153500; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=9HA/ybwawhpYacQbiJl7tU2w4tisbAXIL92cuydme34=; b=rKjGJHiWhghd1iTJT3pZ54pBwHSbvs3YglrAuibB2ImME9AGVlaNuUTNf9CYGbWuSk oxVs7VBNb51VlWMtj+7sQv1k6GlkJMbQBoIn4KLrqqquVSruEX47FDY3zn5W7jhOYIxJ 5Ahm5KgJlHJNz5QBRkYGryNCfLUD46r9bHN94olC9VC0Qh6oLfBZJUwbTOa5P9BCRUUn ZWc3LT1owW3ZryXOB2AyGSllptrh36Q0nu9QAIeMpUuuQ8SbFQdZV6MCPUoE2fL34Y9G zR3lGZBfqkwttse7lHsJNSrnnbkI4AusrUSlxY9CmdQdYJsA3k4/tz2iNeAT3Dkakvpx /TDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778548700; x=1779153500; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=9HA/ybwawhpYacQbiJl7tU2w4tisbAXIL92cuydme34=; b=NJ6o73lLdmEofxIYHJB3GVA8dS88l/AxwRzBWSdAxI7M1L3gzTp8mR2hB/I/8R4PB8 dCtRxS4AfjYJ5O5iGpPaGm7MpFPjne+BlvgZGmgTwh48Y9B8zQ6nUJ2FzHLObRyaIqEs 4cVFXKjQHfNgk4DEfqEFhBdmpG4m69zqJ4324Id61EkQUty+tv/R76zwCvMIj3OxCcbS tEj2Nir5CXiRUj7ggt+lAA94x04Lup0jBqBfUqpI91i0CAU6bCtPkPBf/AI94ybLHxMw pl5OPJGWZODJJdOpjqT41jZdPYL12/mQyFARpTFY6uiXtpzRPaIyOupxb9R/BztgK0S2 lGOw== X-Forwarded-Encrypted: i=1; AFNElJ/8YP/eemUM6evX9JKlBvUoVMV72i6f23zeiTAvPyDaWFZ6fqaJiEmNa9WCS3xbp1bPa/L3Qtf9yMYDJ/Y=@vger.kernel.org X-Gm-Message-State: AOJu0YwCzVKHhgZ0eNFIJZcAOGSV/+K0rGXT3v7eJ5h+xiMO+vXv1iYL 3KR7McNPDo4iYZv+RlOG8lK42sRxcebRC6veFqdMnyzApecMxNj9KdZb X-Gm-Gg: Acq92OFSo/gqWGrodOJkV7m2NUdT7ZJEBOIhjBMlljKjGjgMz+FPO69R8S62XqUuBN8 Dg9OhaCIxgcwLpYjVLDC+m8jOUPeHCQi/pztbH6COGPlld5PRP/ZAjD+aL1pu/ac7vLZY+/fnK5 OX9qE1PeF8h8JjLqWRGQZJr3gsYEuMyC6oaaqLkXC+Lo+Ath/VjYIH41lHv3KH0PP/0EC+G12TJ lU0Nb0XmLXqIbI3yA4nPnlzb/JgAN5HYznb9VNGPbrcn+dnryVREucY/+oxDBMW4VtKfD597Ti+ u9HxJCu5zShhGhFVUUkQPRzna4DPnjZbeqz7PkuylhLJNUlFmI+x8OEwwJ5BQS8MZE0cTBQWdzn ce1LseM8rghN1ZKR0DeOGZvY8068ZoCoI7MDvwOpdr6mY0Ucz9tdz5g/ey+Wqfqb9iPB1VRVHuL i2cxv/Qdxw4cCF6VaoCS9skw== X-Received: by 2002:a53:d00a:0:b0:650:4aec:29fa with SMTP id 956f58d0204a3-65d94c4bcf9mr14141002d50.38.1778548699610; Mon, 11 May 2026 18:18:19 -0700 (PDT) Received: from localhost ([2a03:2880:f806:21::]) by smtp.gmail.com with ESMTPSA id 956f58d0204a3-65d96bf418bsm6296068d50.17.2026.05.11.18.18.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 18:18:19 -0700 (PDT) From: Bobby Eshleman Date: Mon, 11 May 2026 18:17:59 -0700 Subject: [PATCH net-next v4 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: <20260511-tcp-dm-netkit-v4-5-841b78b99d74@meta.com> References: <20260511-tcp-dm-netkit-v4-0-841b78b99d74@meta.com> In-Reply-To: <20260511-tcp-dm-netkit-v4-0-841b78b99d74@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. Acked-by: Stanislav Fomichev Signed-off-by: Bobby Eshleman --- tools/testing/selftests/drivers/net/hw/nk_qlease.py | 8 ++++---- tools/testing/selftests/drivers/net/lib/py/env.py | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tools/testing/selftests/drivers/net/hw/nk_qlease.py b/tools/te= sting/selftests/drivers/net/hw/nk_qlease.py index aa83dc321328..139a91ebd229 100755 --- a/tools/testing/selftests/drivers/net/hw/nk_qlease.py +++ b/tools/testing/selftests/drivers/net/hw/nk_qlease.py @@ -71,7 +71,7 @@ def test_iou_zcrx(cfg) -> None: flow_rule_id =3D set_flow_rule(cfg) defer(ethtool, f"-N {cfg.ifname} delete {flow_rule_id}") =20 - rx_cmd =3D f"ip netns exec {cfg.netns.name} {cfg.bin_local} -s -p {cfg= .port} -i {cfg._nk_guest_ifname} -q {cfg.nk_queue}" + rx_cmd =3D f"ip netns exec {cfg.netns.name} {cfg.bin_local} -s -p {cfg= .port} -i {cfg.nk_guest_ifname} -q {cfg.nk_queue}" tx_cmd =3D f"{cfg.bin_remote} -c -h {cfg.nk_guest_ipv6} -p {cfg.port} = -l 12840" with bkg(rx_cmd, exit_wait=3DTrue): wait_port_listen(cfg.port, proto=3D"tcp", ns=3Dcfg.netns) @@ -128,7 +128,7 @@ def test_attach_xdp_with_mp(cfg) -> None: =20 netdevnl =3D NetdevFamily() =20 - rx_cmd =3D f"ip netns exec {cfg.netns.name} {cfg.bin_local} -s -p {cfg= .port} -i {cfg._nk_guest_ifname} -q {cfg.nk_queue}" + rx_cmd =3D f"ip netns exec {cfg.netns.name} {cfg.bin_local} -s -p {cfg= .port} -i {cfg.nk_guest_ifname} -q {cfg.nk_queue}" with bkg(rx_cmd): wait_port_listen(cfg.port, proto=3D"tcp", ns=3Dcfg.netns) =20 @@ -178,7 +178,7 @@ def test_destroy(cfg) -> None: ethtool(f"-X {cfg.ifname} equal {cfg.src_queue}") defer(ethtool, f"-X {cfg.ifname} default") =20 - rx_cmd =3D f"ip netns exec {cfg.netns.name} {cfg.bin_local} -s -p {cfg= .port} -i {cfg._nk_guest_ifname} -q {cfg.nk_queue}" + rx_cmd =3D f"ip netns exec {cfg.netns.name} {cfg.bin_local} -s -p {cfg= .port} -i {cfg.nk_guest_ifname} -q {cfg.nk_queue}" rx_proc =3D cmd(rx_cmd, background=3DTrue) wait_port_listen(cfg.port, proto=3D"tcp", ns=3Dcfg.netns) =20 @@ -196,7 +196,7 @@ def test_destroy(cfg) -> None: ip(f"link del dev {cfg._nk_host_ifname}") kill_timer.join() cfg._nk_host_ifname =3D None - cfg._nk_guest_ifname =3D None + cfg.nk_guest_ifname =3D None =20 queue_info =3D netdevnl.queue_get( {"ifindex": cfg.ifindex, "id": cfg.src_queue, "type": "rx"} diff --git a/tools/testing/selftests/drivers/net/lib/py/env.py b/tools/test= ing/selftests/drivers/net/lib/py/env.py index 24ce122abd9c..409b41922245 100644 --- a/tools/testing/selftests/drivers/net/lib/py/env.py +++ b/tools/testing/selftests/drivers/net/lib/py/env.py @@ -339,7 +339,7 @@ class NetDrvContEnv(NetDrvEpEnv): def __init__(self, src_path, rxqueues=3D1, **kwargs): self.netns =3D None self._nk_host_ifname =3D None - self._nk_guest_ifname =3D None + self.nk_guest_ifname =3D None self._tc_clsact_added =3D False self._tc_attached =3D False self._bpf_prog_pref =3D None @@ -390,7 +390,7 @@ class NetDrvContEnv(NetDrvEpEnv): =20 netkit_links.sort(key=3Dlambda x: x['ifindex']) self._nk_host_ifname =3D netkit_links[1]['ifname'] - self._nk_guest_ifname =3D netkit_links[0]['ifname'] + self.nk_guest_ifname =3D netkit_links[0]['ifname'] self.nk_host_ifindex =3D netkit_links[1]['ifindex'] self.nk_guest_ifindex =3D netkit_links[0]['ifindex'] =20 @@ -409,7 +409,7 @@ class NetDrvContEnv(NetDrvEpEnv): if self._nk_host_ifname: cmd(f"ip link del dev {self._nk_host_ifname}") self._nk_host_ifname =3D None - self._nk_guest_ifname =3D None + self.nk_guest_ifname =3D None =20 if self._init_ns_attached: cmd("ip netns del init", fail=3DFalse) @@ -448,16 +448,16 @@ class NetDrvContEnv(NetDrvEpEnv): cmd("ip netns attach init 1") self._init_ns_attached =3D True ip("netns set init 0", ns=3Dself.netns) - ip(f"link set dev {self._nk_guest_ifname} netns {self.netns.name}") + ip(f"link set dev {self.nk_guest_ifname} netns {self.netns.name}") ip(f"link set dev {self._nk_host_ifname} up") ip(f"-6 addr add fe80::1/64 dev {self._nk_host_ifname} nodad") ip(f"-6 route add {self.nk_guest_ipv6}/128 via fe80::2 dev {self._= nk_host_ifname}") =20 ip("link set lo up", ns=3Dself.netns) - ip(f"link set dev {self._nk_guest_ifname} up", ns=3Dself.netns) - ip(f"-6 addr add fe80::2/64 dev {self._nk_guest_ifname}", ns=3Dsel= f.netns) - ip(f"-6 addr add {self.nk_guest_ipv6}/64 dev {self._nk_guest_ifnam= e} nodad", ns=3Dself.netns) - ip(f"-6 route add default via fe80::1 dev {self._nk_guest_ifname}"= , ns=3Dself.netns) + ip(f"link set dev {self.nk_guest_ifname} up", ns=3Dself.netns) + ip(f"-6 addr add fe80::2/64 dev {self.nk_guest_ifname}", ns=3Dself= .netns) + ip(f"-6 addr add {self.nk_guest_ipv6}/64 dev {self.nk_guest_ifname= } nodad", ns=3Dself.netns) + ip(f"-6 route add default via fe80::1 dev {self.nk_guest_ifname}",= ns=3Dself.netns) =20 def _tc_ensure_clsact(self): qdisc =3D json.loads(cmd(f"tc -j qdisc show dev {self.ifname}").st= dout) --=20 2.53.0-Meta From nobody Fri Jun 12 23:57:32 2026 Received: from mail-yx1-f44.google.com (mail-yx1-f44.google.com [74.125.224.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 10ED42C21FD for ; Tue, 12 May 2026 01:18:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778548711; cv=none; b=QLl6opsQukPf+a7tB6TVOgU7ireVutfjhRnDB+cJjYQ/YO6zzplr0MgVeopO/+/4p8vomzmKbvkzLT856bIcDLIEoAJLsFbvKTKdEA1M1eYV1vMlZmXLTcIe5ctpne9cD+gF6qEK7Tj9JcfzCsZq9x8MLsZ4G1tXWxKsaZl7tg0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778548711; c=relaxed/simple; bh=epQpfK9MSdf9Lkqj78QKFmtwPQbQQ3QJ5WPjew3n+tk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iqghbHC6eOueUzEtJiwk0/b1c82utP4aKAWCpNwJKbQE2PMw6Os0eQV35+6bqbwKcrol2cBAwjE8verAvQiB8T6hUMgbiOQRVX/+1+2mTaq0Dg/5/zMHZRlsX/PMXmbetl8aEHl3s+3X73jC5KP2tNRwBrHg3lXFNgr31bHmzPA= 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=rAst1Ifu; arc=none smtp.client-ip=74.125.224.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="rAst1Ifu" Received: by mail-yx1-f44.google.com with SMTP id 956f58d0204a3-65c1ba7eeb6so4724792d50.1 for ; Mon, 11 May 2026 18:18:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778548701; x=1779153501; 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=JGlgGG0HcaZYFyQRM9KLJ9chCZP0emxdYmUdgJoNtbw=; b=rAst1IfuGJ5CMSRhJSlOJK5BOhGGyGtAVUabei+sTp6fb1708r1aMRspQE/Eb0guyF Pf0+NX+eKbAKVKeMYqckNKVOKDEfoLa+9nyaE7dMpWvnytAxtlK9Sam+gOBS40JySGpx 7RCIggMUNiRI1GnOe/5JLulrL1jSwlZAjkbM8Y8ZTdjYZbQQ3u5rJDx6lGu608YBjmKc pOTSjqSal3wNnymvaYKo88AxaF3u+hpjjFP2+9x/VnEPFuBRoPm+zmWqwZTnJ2vJGmPt 9JvNqPbJjfIistG4jby3DfDnrCxIybb2eskQWLKNUkrXreJgVpog/D55XFt0Uw+0kGmh rXGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778548701; x=1779153501; 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=JGlgGG0HcaZYFyQRM9KLJ9chCZP0emxdYmUdgJoNtbw=; b=euL0pysv6HVAk2yiWNvj/0NhpkEJ8UdM0VY9rlVifauZALe7PKpufdgxUaH6xoExwB zdDfKGSh4SJF/yooaoSb0lj+MgSRtngvT5wmEXJbDHKoFxKcZiXni7+sGcmt8nHnH95i tLU0mkEoTgL/YHqxrUstImIjPLi9DbDNe/1SyOsN/iy1v39Lh/xk35TIbGSuuLUjLJ2q gbFRMG38p9BBJy7vbqBDrgYROBzfSjDr10fLbQKcId5kVHDLZh8Pu+rGnd9vqwOhIYj6 k6JLOGerDQH00Reh7NFHfHemD3eIcb8yfhLkglAx4Dynxt0Ekg6OORiWBsdBQFhbGRhu iwyw== X-Forwarded-Encrypted: i=1; AFNElJ/o2z9xzU4wneSl5zJw9pDAFRGHnT4WtHu2mloQYL2Ub4zvyH6If0wUUJc6BRFQ5MUbWLPmEAfeas774kU=@vger.kernel.org X-Gm-Message-State: AOJu0YzGlHzHlsPq4tPOkFBWmiIjNILuVGkFCOdses/hWSlbPgQ2T7F+ RMJnEyWv7cAnhK7wJHtRmEiHylgxHPborh9QEeSwiYx9GZkdNad+dkaY X-Gm-Gg: Acq92OG7eJiJnLFi8c0DYA7IM35BTldExub0skFaAQOv/zCEOl8EB6n+vwuUYTN1Ke2 U50VwEacZzF/czmhfAxKccv09hyEGjc2hbsuTzETwVpH1K95VwyLFzBbxROlgeCblOzBb2y1irn 5rnOggGlAhTJQ3UYsJqurjPYjdFfBoockNORjcfOHmucLTm6dFPaf2DAUGmyHNpfpOXF1uYc7z1 3aUej7gUnjcjjWovmBVx5B66JqQjK3A33EUFu7jRLmX1HX6jywi46eSYX+7r2x87L49IExQ4N1G PThTDfmAojccaldZdduI1eTpwKjEj5UG+p6/HTAqgfVftEH5r0yOgsdTn8S1Z02peM3wGmzOkuv 8IeyISmQKILY+g2l79N98Yv+pj8Z8Y7m/NyrXsPEqZwAYV4rHLmb1Pw3xt0uHechSV5HCW/cC5l oPEYbmlO/Fz/QG6zz4YPwpR16Y4ApuaNs= X-Received: by 2002:a05:690e:d01:b0:654:63e0:d1d1 with SMTP id 956f58d0204a3-65c79d13383mr28050604d50.43.1778548701306; Mon, 11 May 2026 18:18:21 -0700 (PDT) Received: from localhost ([2a03:2880:f806:7::]) by smtp.gmail.com with ESMTPSA id 956f58d0204a3-65d96a67a9bsm6120649d50.9.2026.05.11.18.18.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 18:18:21 -0700 (PDT) From: Bobby Eshleman Date: Mon, 11 May 2026 18:18:00 -0700 Subject: [PATCH net-next v4 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: <20260511-tcp-dm-netkit-v4-6-841b78b99d74@meta.com> References: <20260511-tcp-dm-netkit-v4-0-841b78b99d74@meta.com> In-Reply-To: <20260511-tcp-dm-netkit-v4-0-841b78b99d74@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...). Acked-by: Stanislav Fomichev Signed-off-by: Bobby Eshleman --- Changes in v4: - Fixed bad change list version, v4 -> v3 (Stan) Changes in v3: - Make socat_send() always bind the source; drop its bind=3D parameter and the matching bind=3Dnot_ns at the run_rx call site. - Drop socat_send()'s nodelay=3D arg; have buf_size>0 imply TCP_NODELAY since they are only meaningful together. - configure_nic(): stash originals on cfg instead of using defer(); add paired cleanup_nic() helper. Drop the per-test configure_nic() calls from run_rx/run_tx/run_tx_chunks/run_rx_hds; the netkit test file invokes configure_nic/cleanup_nic once around ksft_run(). - make cfg.devmem_supported and cfg.devmem_probed public attrs (no '_') for sake of linting - general cleanup of the code, linting fixes - In setup_test, drop the unused cfg.listen_ns =3D getattr(cfg, 'netns', None) assignment. - In run_rx, pass flow_steer=3Dnot_ns to ncdevmem_rx and bind=3Dnot_ns to socat_send to avoid changing functionality (we want just a straight refactor here) Changes in v2: - Move require_devmem() into individual test functions so KsftSkipEx goes u= p to ksft_run() (Sashiko) - in ncdevmem_rx(), move -v 7 to take effect for both netns and non-netns when verify=3DTrue --- tools/testing/selftests/drivers/net/hw/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 Fri Jun 12 23:57:32 2026 Received: from mail-yx1-f52.google.com (mail-yx1-f52.google.com [74.125.224.52]) (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 06667256C6C for ; Tue, 12 May 2026 01:18:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778548709; cv=none; b=So/34sESWbco0fuCKWbhSgvjqVxg5q0CVrq2siKsEFbF5SHXjzeLKA12/a6C2VS7UZZxKPCaY+okU7yKsoA8Q7C3gssjfmf/zsuJpdMdRivKuZUd9MdtQW7OK47lPCmghFeMU9A1L4VdDhqyskJX1uz5XFWAX+Nb3jiQK4gw4U8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778548709; c=relaxed/simple; bh=NIFxo58WU7UBXQHue+Nqgz11CnJWJPb56dm0ByE+m28=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ce6e5IP3R2E7LA4px6/z6M1FiBmpt1kdS0OTNmUdMpfk8qp1ssCP5i/DQrw4XfHatNlSxstsOBrdxYRe5bRjyUkqV8FDM2vHw8fkOyKiaRyzLkY9NP9+bvYm5Fcdyp0wGAEe2byPcpd+tRcOxjCNgcU1YTq8QLfTVseP88M8P+M= 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=s4HZMEfY; arc=none smtp.client-ip=74.125.224.52 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="s4HZMEfY" Received: by mail-yx1-f52.google.com with SMTP id 956f58d0204a3-6530287803cso5036482d50.1 for ; Mon, 11 May 2026 18:18:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778548703; x=1779153503; 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=RRfnkF5KMv3rIjUaPyvMS+cs72A3bTtl7ISDWE3Dd4I=; b=s4HZMEfYo8ce0AIKjG+AOPyBenF/E7+VcVWrV4i7JoCTkQqk0k81CMSaTdzTk0vjaJ dhJk/OzPq6a7DFKUkIKclqJaj+Y+wTyt0xDtQ/FlnV2izdQnJC95I9Gbp1+TuUb/SJoQ C//n0Baj/e6kltrCmqyA3+eOXTv+SXRwjoMEQ6EZpijo8Ptkq876qLLW9iF5KVgvaFl/ HTm4kfYOdumk0MZqw7/2+VW52Grjvl7UIY0XVfSMDuKGvGbKe6/uxWeeydYE06r/5xTo 4yIgc+bnEMkZcoLqORg8xeYlPrZbyTFLHrtAP4+C5PWXQT4aOzpq9v4X00Ms607d4tLY 8Jug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778548703; x=1779153503; 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=RRfnkF5KMv3rIjUaPyvMS+cs72A3bTtl7ISDWE3Dd4I=; b=g6N7wshNArBsEoA+i8fvtwzJH9BCBIlVz1+ZPEOwHe3+MIr5NoxxiiwzIGgnb4DaKR XXx7wV6Ia26tdZ8yAffmvzjEJlOBIQ3gG+J2FPYsWHVSZVAwNmM6WAL8UHM7E7aPOO6L NB8vwDzfUTK9BMx8N9y2owWGTLgqIxwIP9tDwNEHM9Gm2xYgCShS4VxPBniTkas9EmSw 0xILvdU5VDdsZhPOVUd5I2AmgmZRg0rSIlWryablWKw9Ex5odWx8hwd3a5Igp29EahzE rt3sRS3gEbI0jJVN3vh2Dxoivzxe4pfw8LdQSpx4voIYHk2G95VRf7bexRpr6EbEYMr0 JBFQ== X-Forwarded-Encrypted: i=1; AFNElJ9uSxDP6h3kdDHKij1oXOhJ81BIdc1jlVuBrzHQZ3CLTloAdh7hQrTo3SyUbWvscZv6kXrP+uMFDcl0z2g=@vger.kernel.org X-Gm-Message-State: AOJu0YzN+E2Re+dc17k1Dl2rteVK5uPrWxGlZngFS6mJBdvbwCn3mi82 3K40Wjeg+/xgyefBjgzsB2JW6z9mg+aHz8cLUIInYefIh8fLAAUKlMt4 X-Gm-Gg: Acq92OHbfvrjSq0IdsxU+hh7J0rw7WFFZE+luOC56hiK6Qat7ZLYvZn073hfqbnR8BN tYK5EsKs4eSEA1sCnW0SxrbV5ihYBWYRYHb8xeW+M/2KCzyEkF/yVzgVakjew/V3eNcLz4818ak WKRf5IX9wW74Hk+AScYzTvVM1AvlzcFMS+Lv394IY5moNteO+VcBUnc+HQq3HO3c9wERB+U3mnu jmtI+0E6rIYh1gvAoRYhyC8fUOqLEjTfgZWMotwxSyAVQpEtpprJsRweTWtoEFcnw+w/iJMRg7P WZBQW/8P3iCPMJ6h4tnSLT323lCwBRFDe2hkZ+aIBWnNXNdLBDUNyoX4Ap/A7wSn+keEnsdREKy XFis3OYz0nqVxEuiyEEPEvtk1O1+b8GQUcJzIRVb5gOvNaD+MMk8fhxNHrnh6iKXSjNgY5MdF58 5j+QM7wKVVYYE80xJeGZPzVA== X-Received: by 2002:a05:690c:6989:b0:7bd:a6ea:c508 with SMTP id 00721157ae682-7c104dab240mr107891457b3.24.1778548702816; Mon, 11 May 2026 18:18:22 -0700 (PDT) Received: from localhost ([2a03:2880:f806:4c::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-7bd665274ffsm159673107b3.6.2026.05.11.18.18.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 18:18:22 -0700 (PDT) From: Bobby Eshleman Date: Mon, 11 May 2026 18:18:01 -0700 Subject: [PATCH net-next v4 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: <20260511-tcp-dm-netkit-v4-7-841b78b99d74@meta.com> References: <20260511-tcp-dm-netkit-v4-0-841b78b99d74@meta.com> In-Reply-To: <20260511-tcp-dm-netkit-v4-0-841b78b99d74@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. Acked-by: Stanislav Fomichev Signed-off-by: Bobby Eshleman --- 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 Fri Jun 12 23:57:32 2026 Received: from mail-qt1-f173.google.com (mail-qt1-f173.google.com [209.85.160.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1AA262727E2 for ; Tue, 12 May 2026 01:18:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778548710; cv=none; b=VSCPwcc739AWYIbWq47U1gEKbiEpEREb9RAApnCEG6gnub53MR7+Yvuy6J0NerrPE4/Y0ZxPSoEOHzvT7kMz/aaNUjiNP2Qg7voMzfNtUWAqBtDMS7tK7RA1Ql+5QbFleEUXeeD8bNk4kLlO1IB/m3SN7IJKAH0JxJa2OPO1fRA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778548710; c=relaxed/simple; bh=w3CtU+hYwk0vuDDvZWpVkcnsbUsLWI9bRzUE1HZQ2bs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=POphn0hNzagDCjNOj5GaPm8URNDVBkoyrVlMboxyEiWOlTo5XQtyzl08pHfqIKz4BCpKe4lMJNVDVpYbsxzvk9X5Hv5tfjOB13yLLzbauPBHRSu/V0GAatAiSIX6GM4AeuY0geMl4oILi+U5Vb6hkwmAcI+JpF6+ZF6/HMnDC3I= 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=tGD1xBAm; arc=none smtp.client-ip=209.85.160.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="tGD1xBAm" Received: by mail-qt1-f173.google.com with SMTP id d75a77b69052e-50e5c7eb565so48662091cf.3 for ; Mon, 11 May 2026 18:18:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778548705; x=1779153505; 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=T4O7WaEUgH7uVF1t7R5QzWbPYxx8khqSIJzO/Wkups0=; b=tGD1xBAmuKbAf60hHbmrhLIh/GOC3eDjfW/1xR61lPL6YWmQkkF/rfbm/xJoxHjuZ+ Qag2O9wajlRkgDpLU+V0ABhLAn4ILDcFiOp3tIy7mtnzBK0rqeF2qXptBJhbaNqR1jWI cMf648R7YQgT2p8Xg0+PakWlV6Czvj+ArGkxJVlNEY7mphYoQIGTP6C8LZykq0wRaxI/ Y8Vzx+p8im7VdbfdHt6h7jb6TeGW7rJqOEtqWUw6Ia8+tJO/4omkHerzrzXsI2wzcoy1 iBIPYRezCFtASQz5aN6YKXQjrFmzSc7HoUG2NfEzeHWBfKE4eESo2cMWmxhIR/LdjtwJ QM2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778548705; x=1779153505; 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=T4O7WaEUgH7uVF1t7R5QzWbPYxx8khqSIJzO/Wkups0=; b=kq5aFZjmDpFQMElFPLh2TE7OMjs/p9kYk8Tc3mnWuNo3YfAlB62NU/+usgn+9H2ng0 anl8fhSkHSZbTf+OokXs6+G0UIYxJNJeYK4X7aozMnWTOE85bxBtSW2viGtFVLslotGY eInuuQjYiKM//esRxRghbxeQqEe9tuSNcJP/JCPmNZxNPJu0DoFKwF9HjlVpJ1pfGYcW 9iRWH2geXw/lJCdZzuw3NRkhXwLQOSlHcIHfmcLAWcjBQxxWRu9YXsssuC8ZKdT87A7q fr4B4q8m/FrZaMQ/bZaHIXqjeFPBUGWMJi2QTgC/mWwLJzUiVKSM+Nz7FQfBkgklzhok ZUkw== X-Forwarded-Encrypted: i=1; AFNElJ8FlsydJPXE3WkXqcrAe6B/zfib5/umRKQQ95qHsAcY3p23Vvtxr8ooWzgPWgIAHexAzA7+9itTE0yh0PQ=@vger.kernel.org X-Gm-Message-State: AOJu0YzkyMWoPKt29aiMIDGiX2H7kZ2rc59GY/u5Bw5t5yUO0fNXPe9s QGEIdZVukG1dAXW5taEmsIf4GjMm/7aMFxJCcG/iY74BQw7tbfSs190B X-Gm-Gg: Acq92OGRI4XPz1GLOcFwc83y1LsdzltSP8Uyi8h54xE5C78UxFY6Y3SCO7XZqYszqoP NZNOhuZ0yE2C/BTbODWw3OutRigEex8ym5TPrXPJ1s6Gg2oDtyBkfCsjKF1BQc1cUZJZLQhfnnx 4zM7wNUZ4PVFw8/dPn9ynxhNg3MuMnn/Porb3AkRyBOGeZsrE47FaZ1LirGhD8iYcJvNmlxPggf 6zWR1Nzt7TcMZ7WAsMvnckrPlY8lsg4xkRBnloA4DSgBe4EBcwJHfowobN8yZVVwsFj1tOyq8+q FecegmbdvtubKT2B3wgfZdGQqlkB7fFQ/WdAQzSNGiG9wmydOj6YvlT3/N/Z8gDRJjmV6ONJvhE 0SuKMb+STKSQRL1Y+4nwT4ZbFfUFENWEmYmzRQ2+oCU+jXUYHIn6xp/lydqB9HVxgN/KOf3BDap tdT6NSZo0AwhAPpFAegug= X-Received: by 2002:a05:622a:92:b0:50d:770f:ad23 with SMTP id d75a77b69052e-514d1c943c9mr15635691cf.26.1778548704810; Mon, 11 May 2026 18:18:24 -0700 (PDT) Received: from localhost ([2a03:2880:ff:72::]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-514a956cad9sm71871261cf.9.2026.05.11.18.18.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 May 2026 18:18:24 -0700 (PDT) From: Bobby Eshleman Date: Mon, 11 May 2026 18:18:02 -0700 Subject: [PATCH net-next v4 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: <20260511-tcp-dm-netkit-v4-8-841b78b99d74@meta.com> References: <20260511-tcp-dm-netkit-v4-0-841b78b99d74@meta.com> In-Reply-To: <20260511-tcp-dm-netkit-v4-0-841b78b99d74@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. Acked-by: Stanislav Fomichev Signed-off-by: Bobby Eshleman --- 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