DPDK-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH v4 2/2] dts: add build arguments to test run configuration
From: Patrick Robb @ 2026-07-08 22:14 UTC (permalink / raw)
  To: Koushik Bhargav Nimoji; +Cc: luca.vizzarro, dev, abailey, ahassick, lylavoie
In-Reply-To: <20260625181557.2331771-2-knimoji@iol.unh.edu>

[-- Attachment #1: Type: text/plain, Size: 586 bytes --]

I think the polish on this patch is okay but also there are some moderate
importance cleanups that are recommended by the AI code review:
https://mails.dpdk.org/archives/test-report/2026-June/1011807.html

If you can't get time for this before RC3 I think we can merge this series,
but some of the cleanups (i.e. safely handling yaml string vs list of
strings format in the test_run.yaml) are valuable and if you can add that
either right now for RC3 or early in the 25.11 release window that is
ideal. Let me know what you think.

Reviewed-by: Patrick Robb <patrickrobb1997@gmail.com>

[-- Attachment #2: Type: text/html, Size: 796 bytes --]

^ permalink raw reply

* Re: [PATCH v5] dts: add support for no link topology
From: Patrick Robb @ 2026-07-08 21:23 UTC (permalink / raw)
  To: Andrew Bailey; +Cc: dev, luca.vizzarro, knimoji, lylavoie
In-Reply-To: <20260708142835.780873-1-abailey@iol.unh.edu>

[-- Attachment #1: Type: text/plain, Size: 1588 bytes --]

On Wed, Jul 8, 2026 at 10:28 AM Andrew Bailey <abailey@iol.unh.edu> wrote:

> Add support for running DTS with no traffic generator node and no ethdev
> interfaces. Some applications, like dpdk-test-crypto-perf run without
> ethdev interfaces and no traffic generator. In these cases, it is
> beneficial to remove the overhead of creating a node and ports that are
> not used. The specified build option for ice devices is removed since
> the query to sut port ingress causes python to crash when there are no
> ports. Notably, since this is only the case in which there are no ports,
> traffic will not be sent and therefore the build argument is not
> required. For these reasons it is skipped when running a no-link
> topology.
>

I think SUT should be capitalized.

I do not understand what the final 3 sentences are saying about ice. I do
think I understand the code, which is saying that when the topology is
NO_LINK, do not build DPDK with 16 byte descriptors.


>
> Signed-off-by: Andrew Bailey <abailey@iol.unh.edu>
>
>  dpdk:
> @@ -58,8 +61,8 @@ test_suites: # see `Optional Fields`; the following test
> suites will be run in t
>  # The machine running the DPDK test executable
>  system_under_test_node: "SUT 1"
>  # Traffic generator node to use for this execution environment
> -traffic_generator_node: "TG 1"
> -port_topology:
> +traffic_generator_node: "TG 1" # see
>

See what? Is it supposed to say "see `Optional Fields`" ?


> +port_topology: # see `Optional Fields`
>
>
Reviewed-by: Patrick Robb <patrickrob1997@gmail.com>

[-- Attachment #2: Type: text/html, Size: 2481 bytes --]

^ permalink raw reply

* [DPDK/cryptodev Bug 1966] crypto-perf application segmentation faults where it previously didn't
From: bugzilla @ 2026-07-08 20:13 UTC (permalink / raw)
  To: dev

http://bugs.dpdk.org/show_bug.cgi?id=1966

            Bug ID: 1966
           Summary: crypto-perf application segmentation faults where it
                    previously didn't
           Product: DPDK
           Version: 26.07
          Hardware: All
                OS: All
            Status: UNCONFIRMED
          Severity: major
          Priority: Normal
         Component: cryptodev
          Assignee: dev@dpdk.org
          Reporter: abailey@iol.unh.edu
  Target Milestone: ---

Running the dpdk-crypto-perf application with the following args creates a
segmentation fault. I am testing on an Intel QAT 8970 on an aarch64 system with
a single virtual function bound to vfio-pci. To the best of my knowledge, this
was not seen in testing prior to the merge of 26.07-rc2.

sudo ./dpdk-test-crypto-perf 
-l 1-2 
-n 4 
--file-prefix=dpdk_1_20260708200005 
-a 0000:03:01.0 
-- 
--aead-aad-sz=16 
--aead-algo=aes-gcm 
--aead-iv-sz=12 
--aead-key-sz=16 
--aead-op=encrypt 
--buffer-sz=64,512,2048 
--devtype=crypto_qat 
--digest-sz=16 
--optype=aead 
--ptest=throughput 
--silent 
--total-ops=10000000'

' returned a non-zero exit code: 139
16:00:57  Stderr: EAL: Detected CPU lcores: 160
16:00:57  EAL: Detected NUMA nodes: 2
16:00:57  EAL: Detected static linkage of DPDK
16:00:57  EAL: Multi-process socket
/var/run/dpdk/dpdk_1_20260708200005/mp_socket
16:00:57  EAL: Selected IOVA mode 'PA'
16:00:57  EAL: VFIO support initialized
16:00:57  EAL: Using IOMMU type 1 (Type 1)
16:00:57  CRYPTODEV: Creating cryptodev 0000:03:01.0_qat_asym
16:00:57  CRYPTODEV: Initialisation parameters - name:
0000:03:01.0_qat_asym,socket id: 0, max queue pairs: 0
16:00:57  CRYPTODEV: Creating cryptodev 0000:03:01.0_qat_sym
16:00:57  CRYPTODEV: Initialisation parameters - name:
0000:03:01.0_qat_sym,socket id: 0, max queue pairs: 0
16:00:57  Segmentation fault (core dumped)

-- 
You are receiving this mail because:
You are the assignee for the bug.

^ permalink raw reply

* [PATCH v3] net/iavf: fix single VLAN strip in double VLAN mode
From: Anurag Mandal @ 2026-07-08 18:58 UTC (permalink / raw)
  To: dev; +Cc: bruce.richardson, vladimir.medvedkin, Anurag Mandal, stable,
	Ye Chen
In-Reply-To: <20260708093955.495637-1-anurag.mandal@intel.com>

In Double VLAN Mode (DVM) i.e. when RTE_ETH_RX_OFFLOAD_VLAN_EXTEND
is enabled iavf_config_vlan_strip_v2() only toggles the inner
VLAN strip setting (0x8100) for the RTE_ETH_RX_OFFLOAD_VLAN_STRIP
offload, while the outer VLAN strip is controlled independently
through the QinQ strip path.

However, in DVM, most hardwares place a single (non-QinQ) VLAN
tag in the outer position
As a result, when a single VLAN packet is received and the
application disables single VLAN tag stripping, only the inner
VLAN tag strip gets turned off and the outer VLAN tag strip
stays enabled.
Hence, the single VLAN tag still gets stripped.
This does not honor the application's request.

This patch fixes the aforesaid case.
When DVM and QinQ stripping are both enabled, also apply the strip
enable/disable to the outer VLAN so that single VLAN packets received
in double VLAN mode respect the single VLAN strip configuration.

Fixes: 8599d7604e0a ("net/iavf: support QinQ strip")
Cc: stable@dpdk.org

Signed-off-by: Anurag Mandal <anurag.mandal@intel.com>
Tested-by: Ye Chen <yex.chen@intel.com>
---
V3: Restricted to VLAN TPID 0x8100
V2: Spelling correction in commit message

 .mailmap                            | 1 +
 drivers/net/intel/iavf/iavf_vchnl.c | 5 +++++
 2 files changed, 6 insertions(+)

diff --git a/.mailmap b/.mailmap
index 05a55c0bd6..7ac425f800 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1893,6 +1893,7 @@ Yaron Illouz <yaroni@radcom.com>
 Yaroslav Brustinov <ybrustin@cisco.com>
 Yash Sharma <ysharma@marvell.com>
 Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp> <yasufum.o@gmail.com>
+Ye Chen <yex.chen@intel.com>
 Yehor Malikov <yehor.malikov@solidigm.com>
 Yelena Krivosheev <yelena@marvell.com>
 Yerden Zhumabekov <e_zhumabekov@sts.kz> <yerden.zhumabekov@sts.kz>
diff --git a/drivers/net/intel/iavf/iavf_vchnl.c b/drivers/net/intel/iavf/iavf_vchnl.c
index cd6e8325fc..f8fffa7802 100644
--- a/drivers/net/intel/iavf/iavf_vchnl.c
+++ b/drivers/net/intel/iavf/iavf_vchnl.c
@@ -922,8 +922,13 @@ iavf_config_vlan_strip_v2(struct iavf_adapter *adapter, bool enable)
 	uint32_t *ethertype;
 	int qinq = adapter->dev_data->dev_conf.rxmode.offloads &
 		   RTE_ETH_RX_OFFLOAD_VLAN_EXTEND;
+	bool strip_qinq = adapter->dev_data->dev_conf.rxmode.offloads &
+			  RTE_ETH_RX_OFFLOAD_QINQ_STRIP;
 	int ret;
 
+	if (qinq && strip_qinq && adapter->tpid == RTE_ETHER_TYPE_VLAN)
+		iavf_config_outer_vlan_strip_v2(adapter, enable);
+
 	stripping_caps = &vf->vlan_v2_caps.offloads.stripping_support;
 
 	/* When VLAN extend is disabled, Single VLAN mode which is Outer VLAN
-- 
2.34.1


^ permalink raw reply related

* [RFC PATCH] net/bonding: reject control operations in secondary
From: Weijun Pan @ 2026-07-08 17:42 UTC (permalink / raw)
  To: Chas Williams, Min Hu (Connor), Anatoly Burakov; +Cc: dev, Weijun Pan

The bonding PMD installs safe secondary burst functions when real
secondary datapath support is not available. This avoids crashes, but
secondary processes must not be able to change bonding control-plane
state if the primary process is the owner of that state.

Reject bonding control-plane operations from secondary processes. This
keeps bonding configuration and LACP state owned by the primary process
and is a prerequisite for future limited secondary datapath support.

Bugzilla ID: 1900

Signed-off-by: Weijun Pan <wpan3636@gmail.com>
---
 drivers/net/bonding/rte_eth_bond_8023ad.c | 31 ++++++++++++
 drivers/net/bonding/rte_eth_bond_api.c    | 47 +++++++++++++++++
 drivers/net/bonding/rte_eth_bond_pmd.c    | 61 +++++++++++++++++++++++
 3 files changed, 139 insertions(+)

diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c b/drivers/net/bonding/rte_eth_bond_8023ad.c
index d1f30229d0..685255ffc3 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad.c
+++ b/drivers/net/bonding/rte_eth_bond_8023ad.c
@@ -1428,11 +1428,24 @@ rte_eth_bond_8023ad_conf_get(uint16_t port_id,
 	return 0;
 }
 
+static int
+bond_8023ad_primary_only(const char *op)
+{
+	if (rte_eal_process_type() != RTE_PROC_SECONDARY)
+		return 0;
+
+	RTE_BOND_LOG(ERR, "%s not supported in secondary process", op);
+	return -ENOTSUP;
+}
+
 RTE_EXPORT_SYMBOL(rte_eth_bond_8023ad_agg_selection_set)
 int
 rte_eth_bond_8023ad_agg_selection_set(uint16_t port_id,
 		enum rte_bond_8023ad_agg_selection agg_selection)
 {
+	if (bond_8023ad_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	struct rte_eth_dev *bond_dev;
 	struct bond_dev_private *internals;
 	struct mode8023ad_private *mode4;
@@ -1506,6 +1519,9 @@ int
 rte_eth_bond_8023ad_setup(uint16_t port_id,
 		struct rte_eth_bond_8023ad_conf *conf)
 {
+	if (bond_8023ad_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	struct rte_eth_dev *bond_dev;
 	int err;
 
@@ -1590,6 +1606,9 @@ int
 rte_eth_bond_8023ad_ext_collect(uint16_t port_id, uint16_t member_id,
 				int enabled)
 {
+	if (bond_8023ad_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	struct port *port;
 	int res;
 
@@ -1612,6 +1631,9 @@ int
 rte_eth_bond_8023ad_ext_distrib(uint16_t port_id, uint16_t member_id,
 				int enabled)
 {
+	if (bond_8023ad_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	struct port *port;
 	int res;
 
@@ -1664,6 +1686,9 @@ int
 rte_eth_bond_8023ad_ext_slowtx(uint16_t port_id, uint16_t member_id,
 		struct rte_mbuf *lacp_pkt)
 {
+	if (bond_8023ad_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	struct port *port;
 	int res;
 
@@ -1725,6 +1750,9 @@ RTE_EXPORT_SYMBOL(rte_eth_bond_8023ad_dedicated_queues_enable)
 int
 rte_eth_bond_8023ad_dedicated_queues_enable(uint16_t port)
 {
+	if (bond_8023ad_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	struct rte_eth_dev *dev;
 	struct bond_dev_private *internals;
 
@@ -1754,6 +1782,9 @@ RTE_EXPORT_SYMBOL(rte_eth_bond_8023ad_dedicated_queues_disable)
 int
 rte_eth_bond_8023ad_dedicated_queues_disable(uint16_t port)
 {
+	if (bond_8023ad_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	struct rte_eth_dev *dev;
 	struct bond_dev_private *internals;
 
diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c
index d9b6f1c417..3b754bf8e0 100644
--- a/drivers/net/bonding/rte_eth_bond_api.c
+++ b/drivers/net/bonding/rte_eth_bond_api.c
@@ -150,10 +150,24 @@ deactivate_member(struct rte_eth_dev *eth_dev, uint16_t port_id)
 	}
 }
 
+static int
+bond_api_primary_only(const char *op)
+{
+	if (rte_eal_process_type() != RTE_PROC_SECONDARY)
+		return 0;
+
+	RTE_BOND_LOG(ERR, "%s not supported in secondary process", op);
+	return -1;
+}
+
+
 RTE_EXPORT_SYMBOL(rte_eth_bond_create)
 int
 rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id)
 {
+	if (bond_api_primary_only(__func__) != 0)
+		return -1;
+
 	struct bond_dev_private *internals;
 	struct rte_eth_dev *bond_dev;
 	char devargs[52];
@@ -193,6 +207,9 @@ RTE_EXPORT_SYMBOL(rte_eth_bond_free)
 int
 rte_eth_bond_free(const char *name)
 {
+	if (bond_api_primary_only(__func__) != 0)
+		return -1;
+
 	return rte_vdev_uninit(name);
 }
 
@@ -638,6 +655,9 @@ RTE_EXPORT_SYMBOL(rte_eth_bond_member_add)
 int
 rte_eth_bond_member_add(uint16_t bonding_port_id, uint16_t member_port_id)
 {
+	if (bond_api_primary_only(__func__) != 0)
+		return -1;
+
 	struct rte_eth_dev *bonding_eth_dev;
 	struct bond_dev_private *internals;
 
@@ -777,6 +797,9 @@ RTE_EXPORT_SYMBOL(rte_eth_bond_member_remove)
 int
 rte_eth_bond_member_remove(uint16_t bonding_port_id, uint16_t member_port_id)
 {
+	if (bond_api_primary_only(__func__) != 0)
+		return -1;
+
 	struct rte_eth_dev *bonding_eth_dev;
 	struct bond_dev_private *internals;
 	int retval;
@@ -800,6 +823,9 @@ RTE_EXPORT_SYMBOL(rte_eth_bond_mode_set)
 int
 rte_eth_bond_mode_set(uint16_t bonding_port_id, uint8_t mode)
 {
+	if (bond_api_primary_only(__func__) != 0)
+		return -1;
+
 	struct rte_eth_dev *bonding_eth_dev;
 
 	if (valid_bonding_port_id(bonding_port_id) != 0)
@@ -832,6 +858,9 @@ RTE_EXPORT_SYMBOL(rte_eth_bond_primary_set)
 int
 rte_eth_bond_primary_set(uint16_t bonding_port_id, uint16_t member_port_id)
 {
+	if (bond_api_primary_only(__func__) != 0)
+		return -1;
+
 	struct bond_dev_private *internals;
 
 	if (valid_bonding_port_id(bonding_port_id) != 0)
@@ -921,6 +950,9 @@ int
 rte_eth_bond_mac_address_set(uint16_t bonding_port_id,
 		struct rte_ether_addr *mac_addr)
 {
+	if (bond_api_primary_only(__func__) != 0)
+		return -1;
+
 	struct rte_eth_dev *bonding_eth_dev;
 	struct bond_dev_private *internals;
 
@@ -947,6 +979,9 @@ RTE_EXPORT_SYMBOL(rte_eth_bond_mac_address_reset)
 int
 rte_eth_bond_mac_address_reset(uint16_t bonding_port_id)
 {
+	if (bond_api_primary_only(__func__) != 0)
+		return -1;
+
 	struct rte_eth_dev *bonding_eth_dev;
 	struct bond_dev_private *internals;
 
@@ -989,6 +1024,9 @@ RTE_EXPORT_SYMBOL(rte_eth_bond_xmit_policy_set)
 int
 rte_eth_bond_xmit_policy_set(uint16_t bonding_port_id, uint8_t policy)
 {
+	if (bond_api_primary_only(__func__) != 0)
+		return -1;
+
 	struct bond_dev_private *internals;
 
 	if (valid_bonding_port_id(bonding_port_id) != 0)
@@ -1034,6 +1072,9 @@ RTE_EXPORT_SYMBOL(rte_eth_bond_link_monitoring_set)
 int
 rte_eth_bond_link_monitoring_set(uint16_t bonding_port_id, uint32_t internal_ms)
 {
+	if (bond_api_primary_only(__func__) != 0)
+		return -1;
+
 	struct bond_dev_private *internals;
 
 	if (valid_bonding_port_id(bonding_port_id) != 0)
@@ -1063,6 +1104,9 @@ rte_eth_bond_link_down_prop_delay_set(uint16_t bonding_port_id,
 				       uint32_t delay_ms)
 
 {
+	if (bond_api_primary_only(__func__) != 0)
+		return -1;
+
 	struct bond_dev_private *internals;
 
 	if (valid_bonding_port_id(bonding_port_id) != 0)
@@ -1091,6 +1135,9 @@ int
 rte_eth_bond_link_up_prop_delay_set(uint16_t bonding_port_id, uint32_t delay_ms)
 
 {
+	if (bond_api_primary_only(__func__) != 0)
+		return -1;
+
 	struct bond_dev_private *internals;
 
 	if (valid_bonding_port_id(bonding_port_id) != 0)
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
index 6a4f997b5a..b6e38d4a60 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -2052,9 +2052,22 @@ bond_ethdev_primary_set(struct bond_dev_private *internals,
 static int
 bond_ethdev_promiscuous_enable(struct rte_eth_dev *eth_dev);
 
+static int
+bond_ethdev_primary_only(const char *op)
+{
+	if (rte_eal_process_type() != RTE_PROC_SECONDARY)
+		return 0;
+
+	RTE_BOND_LOG(ERR, "%s not supported in secondary process", op);
+	return -ENOTSUP;
+}
+
 static int
 bond_ethdev_start(struct rte_eth_dev *eth_dev)
 {
+	if (bond_ethdev_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	struct bond_dev_private *internals;
 	int i;
 
@@ -2186,6 +2199,9 @@ bond_ethdev_free_queues(struct rte_eth_dev *dev)
 int
 bond_ethdev_stop(struct rte_eth_dev *eth_dev)
 {
+	if (bond_ethdev_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	struct bond_dev_private *internals = eth_dev->data->dev_private;
 	uint16_t i;
 	int ret;
@@ -2400,6 +2416,9 @@ bond_ethdev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 static int
 bond_ethdev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
 {
+	if (bond_ethdev_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	int res;
 	uint16_t i;
 	struct bond_dev_private *internals = dev->data->dev_private;
@@ -2431,6 +2450,9 @@ bond_ethdev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id,
 		uint16_t nb_rx_desc, unsigned int socket_id __rte_unused,
 		const struct rte_eth_rxconf *rx_conf, struct rte_mempool *mb_pool)
 {
+	if (bond_ethdev_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	struct bond_rx_queue *bd_rx_q = (struct bond_rx_queue *)
 			rte_zmalloc_socket(NULL, sizeof(struct bond_rx_queue),
 					0, dev->data->numa_node);
@@ -2455,6 +2477,9 @@ bond_ethdev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		uint16_t nb_tx_desc, unsigned int socket_id __rte_unused,
 		const struct rte_eth_txconf *tx_conf)
 {
+	if (bond_ethdev_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	struct bond_tx_queue *bd_tx_q  = (struct bond_tx_queue *)
 			rte_zmalloc_socket(NULL, sizeof(struct bond_tx_queue),
 					0, dev->data->numa_node);
@@ -2697,6 +2722,9 @@ bond_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,
 static int
 bond_ethdev_stats_reset(struct rte_eth_dev *dev)
 {
+	if (bond_ethdev_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	struct bond_dev_private *internals = dev->data->dev_private;
 	int i;
 	int err;
@@ -2714,6 +2742,9 @@ bond_ethdev_stats_reset(struct rte_eth_dev *dev)
 static int
 bond_ethdev_promiscuous_enable(struct rte_eth_dev *eth_dev)
 {
+	if (bond_ethdev_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	struct bond_dev_private *internals = eth_dev->data->dev_private;
 	int i;
 	int ret = 0;
@@ -2768,6 +2799,9 @@ bond_ethdev_promiscuous_enable(struct rte_eth_dev *eth_dev)
 static int
 bond_ethdev_promiscuous_disable(struct rte_eth_dev *dev)
 {
+	if (bond_ethdev_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	struct bond_dev_private *internals = dev->data->dev_private;
 	int i;
 	int ret = 0;
@@ -2871,6 +2905,9 @@ bond_ethdev_promiscuous_update(struct rte_eth_dev *dev)
 static int
 bond_ethdev_allmulticast_enable(struct rte_eth_dev *eth_dev)
 {
+	if (bond_ethdev_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	struct bond_dev_private *internals = eth_dev->data->dev_private;
 	int i;
 	int ret = 0;
@@ -2925,6 +2962,9 @@ bond_ethdev_allmulticast_enable(struct rte_eth_dev *eth_dev)
 static int
 bond_ethdev_allmulticast_disable(struct rte_eth_dev *eth_dev)
 {
+	if (bond_ethdev_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	struct bond_dev_private *internals = eth_dev->data->dev_private;
 	int i;
 	int ret = 0;
@@ -3186,6 +3226,9 @@ static int
 bond_ethdev_rss_reta_update(struct rte_eth_dev *dev,
 		struct rte_eth_rss_reta_entry64 *reta_conf, uint16_t reta_size)
 {
+	if (bond_ethdev_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	unsigned i, j;
 	int result = 0;
 	int member_reta_size;
@@ -3246,6 +3289,9 @@ static int
 bond_ethdev_rss_hash_update(struct rte_eth_dev *dev,
 		struct rte_eth_rss_conf *rss_conf)
 {
+	if (bond_ethdev_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	int i, result = 0;
 	struct bond_dev_private *internals = dev->data->dev_private;
 	struct rte_eth_rss_conf bond_rss_conf;
@@ -3295,6 +3341,9 @@ bond_ethdev_rss_hash_conf_get(struct rte_eth_dev *dev,
 static int
 bond_ethdev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 {
+	if (bond_ethdev_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	struct rte_eth_dev *member_eth_dev;
 	struct bond_dev_private *internals = dev->data->dev_private;
 	int ret, i;
@@ -3324,6 +3373,9 @@ static int
 bond_ethdev_mac_address_set(struct rte_eth_dev *dev,
 			struct rte_ether_addr *addr)
 {
+	if (bond_ethdev_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	if (mac_address_set(dev, addr)) {
 		RTE_BOND_LOG(ERR, "Failed to update MAC address");
 		return -EINVAL;
@@ -3345,6 +3397,9 @@ bond_ethdev_mac_addr_add(struct rte_eth_dev *dev,
 			struct rte_ether_addr *mac_addr,
 			__rte_unused uint32_t index, uint32_t vmdq)
 {
+	if (bond_ethdev_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	struct rte_eth_dev *member_eth_dev;
 	struct bond_dev_private *internals = dev->data->dev_private;
 	int ret, i;
@@ -3381,6 +3436,9 @@ bond_ethdev_mac_addr_add(struct rte_eth_dev *dev,
 static void
 bond_ethdev_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index)
 {
+	if (bond_ethdev_primary_only(__func__) != 0)
+		return;
+
 	struct rte_eth_dev *member_eth_dev;
 	struct bond_dev_private *internals = dev->data->dev_private;
 	int i;
@@ -3965,6 +4023,9 @@ bond_remove(struct rte_vdev_device *dev)
 static int
 bond_ethdev_configure(struct rte_eth_dev *dev)
 {
+	if (bond_ethdev_primary_only(__func__) != 0)
+		return -ENOTSUP;
+
 	const char *name = dev->device->name;
 	struct bond_dev_private *internals = dev->data->dev_private;
 	struct rte_kvargs *kvlist = internals->kvlist;
-- 
2.34.1


^ permalink raw reply related

* Re: [PATCH v4] dts: update test suite names to be clear and consistent
From: Luca Vizzarro @ 2026-07-08 17:25 UTC (permalink / raw)
  To: Andrew Bailey, patrickrobb1997; +Cc: dev, lylavoie, knimoji, ahassick
In-Reply-To: <20260511160013.78676-1-abailey@iol.unh.edu>

Applies to next-dts, thanks

^ permalink raw reply

* RE: [PATCH v8] mempool: improve cache behaviour and performance
From: Morten Brørup @ 2026-07-08 16:24 UTC (permalink / raw)
  To: Wisam Jaddo, NBU-Contact-Thomas Monjalon (EXTERNAL),
	Andrew Rybchenko
  Cc: dev, Raslan Darawsheh, Maayan Kashani
In-Reply-To: <LV2PR12MB5893086C50C6C4752CBA46BEA4FF2@LV2PR12MB5893.namprd12.prod.outlook.com>

> From: Wisam Jaddo [mailto:wisamm@nvidia.com]
> Sent: Wednesday, 8 July 2026 17.05
> 
> Hi,
> 
> Tested on ARM BF3:
> command:
> . /dpdk-testpmd -n 4  -a 0000:03:00.0,dv_flow_en=2  -a
> 0000:03:00.1,dv_flow_en=2  -a auxiliary:  -a 00:00.0 -c 0x30  -- --
> mbcache=512 -i  --nb-cores=1  --burst=64 --txd=256 --rxd=256  --record-
> burst-stats --record-core-cycles --auto-start

Thank you for the detailed response.

As noted in the release notes with the patch, the effective mempool cache size was changed to no longer be 1.5 times the configured cache size. (This change fixed bug 1027 [BZ1027].)
I.e. with your testpmd parameters the effective mbuf mempool cache size was reduced from 768 (1.5 * 512) to 512 mbufs.
In order to test with the same effective mbuf mempool cache size, you need to pass --mbcache=768.
And since 768 exceeds RTE_MEMPOOL_CACHE_MAX_SIZE (default 512) in rte_config.h, you also need to rebuild DPDK with that set to 1024 instead of 512.

[BZ1027] https://bugs.dpdk.org/show_bug.cgi?id=1027

Please let us know your updated test results, if you decide to retest with --mbcache=768 and DPDK rebuilt with RTE_MEMPOOL_CACHE_MAX_SIZE 1024.

> 
> No offloads, plain testpmd with auto-start.
> On the other end I have ixia generating the ipv4_udp traffic, with dest
> udp range from 65024 to 65280 "To send different packets with msg size
> 64Bytes.
> 
> We send 100% on TX side, and we read what we reactive back on RX side
> in ixia "using two ports agg."
> The results that we start to see after this commit is a degradation of
> 1.8% - 2%
> 
> BRs,
> Wisam Jaddo
> 
> > -----Original Message-----
> > From: Morten Brørup <mb@smartsharesystems.com>
> > Sent: Wednesday, July 8, 2026 5:09 PM
> > To: Wisam Jaddo <wisamm@nvidia.com>; NBU-Contact-Thomas Monjalon
> > (EXTERNAL) <thomas@monjalon.net>
> > Cc: dev@dpdk.org; Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>;
> > Raslan Darawsheh <rasland@nvidia.com>; Maayan Kashani
> > <mkashani@nvidia.com>
> > Subject: RE: [PATCH v8] mempool: improve cache behaviour and
> performance
> >
> > > From: Wisam Jaddo [mailto:wisamm@nvidia.com]
> > > Sent: Wednesday, 8 July 2026 14.28
> > >
> > > Hi,
> > >
> > > Our internal performance testing are showing degradation starting
> from
> > > this commit.
> > > The degradation is about 1.8% - 2% on small msg szies.
> >
> > What do you mean "small message sizes"?
> >
> > Also, please share more details about the test case:
> > Access pattern, e.g. pipelined across multiple threads or run-to-
> completion? If
> > possible, link to test case source code?
> > Get and put burst sizes?
> > Mempool cache size?
> > Mempool driver?
> >
> > PS: I assume it is about mbuf mempool. Or is it some other object
> type in the
> > mempool?
> >
> > >
> > > BRs,
> > > Wisam Jaddo
> > >
> > > > -----Original Message-----
> > > > From: Thomas Monjalon <thomas@monjalon.net>
> > > > Sent: Wednesday, June 10, 2026 2:07 PM
> > > > To: Morten Brørup <mb@smartsharesystems.com>
> > > > Cc: dev@dpdk.org; Andrew Rybchenko
> <andrew.rybchenko@oktetlabs.ru>
> > > > Subject: Re: [PATCH v8] mempool: improve cache behaviour and
> > > performance
> > > >
> > > > 04/06/2026 13:48, Morten Brørup:
> > > > > This patch refactors the mempool cache to eliminate some
> > > > > unexpected behaviour and reduce the mempool cache miss rate.
> > > >
> > > > Applied, thanks.
> > > >
> > > >


^ permalink raw reply

* Re: DTS code coverage question
From: Thomas Monjalon @ 2026-07-08 15:48 UTC (permalink / raw)
  To: Lincoln Lavoie; +Cc: dev
In-Reply-To: <CAOE1vsNCkhZ8q7ieRAGbJZTFg+xUsjBXXOmegXdoG6L24-Y2HQ@mail.gmail.com>

Hello,

11/06/2026 16:29, Lincoln Lavoie:
> Hello All,
> 
> We have a patch into the 26.07 release that will enable generating
> code coverage reports when DTS is run. The community lab can then
> generate coverage reports, like we do for unit testing
> (https://lab.dpdk.org/results/dashboard/code-coverage).
> 
> The question is, with DTS, tests can run on combinations of NICs, etc.
> So how should those be factored into the reporting.  We can do 1 of
> the following:
> 
> Option 1: Collect coverage reports per NIC / PMD
> Option 2: Aggregate (combine) reports from multiple NICs / PMDs into a
> single report
> Option 3: Only run it on one NIC / PMD, assuming specific PMDs don't
> change the coverage much.
> 
> Is there a specific direction the community would prefer?

As discussed today in the techboard meeting,
we have limited number of NICs in the lab at the moment,
so it's probably better to start small
and focus on the libraries coverage.
If some NICs help to cover more library features, let's combine them.



^ permalink raw reply

* RE: [PATCH v8] mempool: improve cache behaviour and performance
From: Wisam Jaddo @ 2026-07-08 15:05 UTC (permalink / raw)
  To: Morten Brørup, NBU-Contact-Thomas Monjalon (EXTERNAL)
  Cc: dev@dpdk.org, Andrew Rybchenko, Raslan Darawsheh, Maayan Kashani
In-Reply-To: <98CBD80474FA8B44BF855DF32C47DC35F65962@smartserver.smartshare.dk>

Hi,

Tested on ARM BF3:
command:
. /dpdk-testpmd -n 4  -a 0000:03:00.0,dv_flow_en=2  -a 0000:03:00.1,dv_flow_en=2  -a auxiliary:  -a 00:00.0 -c 0x30  -- --mbcache=512 -i  --nb-cores=1  --burst=64 --txd=256 --rxd=256  --record-burst-stats --record-core-cycles --auto-start

No offloads, plain testpmd with auto-start.
On the other end I have ixia generating the ipv4_udp traffic, with dest udp range from 65024 to 65280 "To send different packets with msg size 64Bytes.

We send 100% on TX side, and we read what we reactive back on RX side in ixia "using two ports agg."
The results that we start to see after this commit is a degradation of 1.8% - 2%

BRs,
Wisam Jaddo

> -----Original Message-----
> From: Morten Brørup <mb@smartsharesystems.com>
> Sent: Wednesday, July 8, 2026 5:09 PM
> To: Wisam Jaddo <wisamm@nvidia.com>; NBU-Contact-Thomas Monjalon
> (EXTERNAL) <thomas@monjalon.net>
> Cc: dev@dpdk.org; Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>;
> Raslan Darawsheh <rasland@nvidia.com>; Maayan Kashani
> <mkashani@nvidia.com>
> Subject: RE: [PATCH v8] mempool: improve cache behaviour and performance
> 
> > From: Wisam Jaddo [mailto:wisamm@nvidia.com]
> > Sent: Wednesday, 8 July 2026 14.28
> >
> > Hi,
> >
> > Our internal performance testing are showing degradation starting from
> > this commit.
> > The degradation is about 1.8% - 2% on small msg szies.
> 
> What do you mean "small message sizes"?
> 
> Also, please share more details about the test case:
> Access pattern, e.g. pipelined across multiple threads or run-to-completion? If
> possible, link to test case source code?
> Get and put burst sizes?
> Mempool cache size?
> Mempool driver?
> 
> PS: I assume it is about mbuf mempool. Or is it some other object type in the
> mempool?
> 
> >
> > BRs,
> > Wisam Jaddo
> >
> > > -----Original Message-----
> > > From: Thomas Monjalon <thomas@monjalon.net>
> > > Sent: Wednesday, June 10, 2026 2:07 PM
> > > To: Morten Brørup <mb@smartsharesystems.com>
> > > Cc: dev@dpdk.org; Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
> > > Subject: Re: [PATCH v8] mempool: improve cache behaviour and
> > performance
> > >
> > > 04/06/2026 13:48, Morten Brørup:
> > > > This patch refactors the mempool cache to eliminate some
> > > > unexpected behaviour and reduce the mempool cache miss rate.
> > >
> > > Applied, thanks.
> > >
> > >


^ permalink raw reply

* Re: [PATCH v1] dts: resolve new formatting error
From: Koushik Bhargav Nimoji @ 2026-07-08 15:03 UTC (permalink / raw)
  To: Luca Vizzarro; +Cc: patrickrobb1997, dev, abailey, ahassick, lylavoie
In-Reply-To: <c88474df-8cf0-422b-8b22-1ce65a0084d6@arm.com>

[-- Attachment #1: Type: text/plain, Size: 150 bytes --]

Thanks Luca.

On Wed, Jul 8, 2026 at 10:54 AM Luca Vizzarro <Luca.Vizzarro@arm.com> wrote:

> Now applied to next-dts to the original patch
>

[-- Attachment #2: Type: text/html, Size: 448 bytes --]

^ permalink raw reply

* Re: [PATCH v1] dts: resolve new formatting error
From: Luca Vizzarro @ 2026-07-08 14:54 UTC (permalink / raw)
  To: Koushik Bhargav Nimoji, patrickrobb1997, dev; +Cc: abailey, ahassick, lylavoie
In-Reply-To: <20260708141309.566874-1-knimoji@iol.unh.edu>

Now applied to next-dts to the original patch

^ permalink raw reply

* Re: [PATCH v1] dts: resolve new formatting error
From: Luca Vizzarro @ 2026-07-08 14:49 UTC (permalink / raw)
  To: Koushik Bhargav Nimoji, patrickrobb1997, dev; +Cc: abailey, ahassick, lylavoie
In-Reply-To: <20260708141309.566874-1-knimoji@iol.unh.edu>

Hi Koushik,

I'll fix your patch retrospectively since it's just been merged on 
next-dts but not yet on main. No need for a new patch.

Luca

^ permalink raw reply

* [PATCH v5] dts: add support for no link topology
From: Andrew Bailey @ 2026-07-08 14:28 UTC (permalink / raw)
  To: dev, luca.vizzarro, patrickrobb1997; +Cc: knimoji, lylavoie, Andrew Bailey
In-Reply-To: <20260220192510.37163-1-abailey@iol.unh.edu>

Add support for running DTS with no traffic generator node and no ethdev
interfaces. Some applications, like dpdk-test-crypto-perf run without
ethdev interfaces and no traffic generator. In these cases, it is
beneficial to remove the overhead of creating a node and ports that are
not used. The specified build option for ice devices is removed since
the query to sut port ingress causes python to crash when there are no
ports. Notably, since this is only the case in which there are no ports,
traffic will not be sent and therefore the build argument is not
required. For these reasons it is skipped when running a no-link
topology.

Signed-off-by: Andrew Bailey <abailey@iol.unh.edu>
---

v4:
* Made it possible to run no link topology even if a TG node is
  present in the config.
* Updated the test run example config file to properly document how no
  link topology is run.
v5:
* Rebased on main to resolve merge conflicts
* Ran the format script with the new updated tooling

 dts/api/test.py                          | 11 ++-
 dts/configurations/test_run.example.yaml |  7 +-
 dts/framework/config/__init__.py         | 36 ++++-----
 dts/framework/config/test_run.py         |  4 +-
 dts/framework/context.py                 |  2 +-
 dts/framework/remote_session/dpdk.py     |  4 +-
 dts/framework/runner.py                  |  6 +-
 dts/framework/test_run.py                | 95 ++++++++++++++----------
 dts/framework/testbed_model/topology.py  | 17 ++++-
 dts/tests/TestSuite_cryptodev_latency.py |  4 +-
 10 files changed, 111 insertions(+), 75 deletions(-)

diff --git a/dts/api/test.py b/dts/api/test.py
index e17babe0ca..7947c407d2 100644
--- a/dts/api/test.py
+++ b/dts/api/test.py
@@ -10,6 +10,7 @@
 from datetime import datetime

 from api.artifact import Artifact
+from api.capabilities import LinkTopology
 from framework.context import get_ctx
 from framework.exception import InternalError, SkippedTestException, TestCaseVerifyError
 from framework.logger import DTSLogger
@@ -109,12 +110,14 @@ def fail(failure_description: str) -> None:
     Raises:
         TestCaseVerifyError: Always raised to indicate the test case failed.
     """
+    ctx = get_ctx()
     get_logger().debug("A test case failed, showing the last 10 commands executed on SUT:")
-    for command_res in get_ctx().sut_node.main_session.remote_session.history[-10:]:
-        get_logger().debug(command_res.command)
-    get_logger().debug("A test case failed, showing the last 10 commands executed on TG:")
-    for command_res in get_ctx().tg_node.main_session.remote_session.history[-10:]:
+    for command_res in ctx.sut_node.main_session.remote_session.history[-10:]:
         get_logger().debug(command_res.command)
+    if ctx.topology.type is not LinkTopology.NO_LINK and ctx.tg_node is not None:
+        get_logger().debug("A test case failed, showing the last 10 commands executed on TG:")
+        for command_res in ctx.tg_node.main_session.remote_session.history[-10:]:
+            get_logger().debug(command_res.command)
     raise TestCaseVerifyError(failure_description)


diff --git a/dts/configurations/test_run.example.yaml b/dts/configurations/test_run.example.yaml
index ee641f5dce..127aa51152 100644
--- a/dts/configurations/test_run.example.yaml
+++ b/dts/configurations/test_run.example.yaml
@@ -25,6 +25,9 @@
 #       By removing the `test_suites` field, this test run will run every test suite available.
 #   `vdevs`:
 #       Uncomment to add a specific virtual device to run on the SUT node.
+#   `port_topology`:
+#   	By providing an empty list, DTS will run in no link topology mode and will not allocate a TG
+#   	node.

 # Define the test run environment
 dpdk:
@@ -58,8 +61,8 @@ test_suites: # see `Optional Fields`; the following test suites will be run in t
 # The machine running the DPDK test executable
 system_under_test_node: "SUT 1"
 # Traffic generator node to use for this execution environment
-traffic_generator_node: "TG 1"
-port_topology:
+traffic_generator_node: "TG 1" # see
+port_topology: # see `Optional Fields`
   - sut.port-0 <-> tg.port-0  # explicit link. `sut` and `tg` are special identifiers that refer
                               # to the respective test run's configured nodes.
   - port-1 <-> port-1         # implicit link, left side is always SUT, right side is always TG.
diff --git a/dts/framework/config/__init__.py b/dts/framework/config/__init__.py
index a8861894b7..573f55471a 100644
--- a/dts/framework/config/__init__.py
+++ b/dts/framework/config/__init__.py
@@ -94,17 +94,19 @@ def validate_port_links(self) -> Self:
                 f"already linked to port {sut_node_port_peer[0]}.{sut_node_port_peer[1]}."
             )

-            tg_node_port_peer = existing_port_links.get(
-                (self.test_run.traffic_generator_node, link.tg_port), None
-            )
-            assert tg_node_port_peer is not None, (
-                f"Invalid TG node port specified for link port_topology.{link_idx}."
-            )
-
-            assert tg_node_port_peer is False or sut_node_port_peer == link.left, (
-                f"The TG node port for link port_topology.{link_idx} is "
-                f"already linked to port {tg_node_port_peer[0]}.{tg_node_port_peer[1]}."
-            )
+            if self.test_run.port_topology != []:
+                assert self.test_run.traffic_generator_node is not None, "No TG node specified."
+                tg_node_port_peer = existing_port_links.get(
+                    (self.test_run.traffic_generator_node, link.tg_port), None
+                )
+                assert tg_node_port_peer is not None, (
+                    f"Invalid TG node port specified for link port_topology.{link_idx}."
+                )
+
+                assert tg_node_port_peer is False or sut_node_port_peer == link.left, (
+                    f"The TG node port for link port_topology.{link_idx} is "
+                    f"already linked to port {tg_node_port_peer[0]}.{tg_node_port_peer[1]}."
+                )

             existing_port_links[link.left] = link.right
             existing_port_links[link.right] = link.left
@@ -121,13 +123,13 @@ def validate_test_run_against_nodes(self) -> Self:
             f"The system_under_test_node {sut_node_name} is not a valid node name."
         )

-        tg_node_name = self.test_run.traffic_generator_node
-        tg_node = next((n for n in self.nodes if n.name == tg_node_name), None)
-
-        assert tg_node is not None, (
-            f"The traffic_generator_name {tg_node_name} is not a valid node name."
-        )
+        if self.test_run.port_topology != []:
+            tg_node_name = self.test_run.traffic_generator_node
+            tg_node = next((n for n in self.nodes if n.name == tg_node_name), None)

+            assert tg_node is not None, (
+                f"The traffic_generator_name {tg_node_name} is not a valid node name."
+            )
         return self


diff --git a/dts/framework/config/test_run.py b/dts/framework/config/test_run.py
index 3cd643981d..81630df77d 100644
--- a/dts/framework/config/test_run.py
+++ b/dts/framework/config/test_run.py
@@ -492,11 +492,11 @@ class TestRunConfiguration(FrozenModel):
     #: The SUT node name to use in this test run.
     system_under_test_node: str
     #: The TG node name to use in this test run.
-    traffic_generator_node: str
+    traffic_generator_node: str | None = Field(default=None)
     #: The seed to use for pseudo-random generation.
     random_seed: int | None = None
     #: The port links between the specified nodes to use.
-    port_topology: list[PortLinkConfig] = Field(max_length=2)
+    port_topology: list[PortLinkConfig] = Field(default=[], max_length=2)

     fields_from_settings = model_validator(mode="before")(
         load_fields_from_settings("test_suites", "random_seed")
diff --git a/dts/framework/context.py b/dts/framework/context.py
index efe9af0645..b1c36f90a6 100644
--- a/dts/framework/context.py
+++ b/dts/framework/context.py
@@ -72,7 +72,7 @@ class Context:
     """Runtime context."""

     sut_node: Node
-    tg_node: Node
+    tg_node: Node | None
     topology: Topology
     dpdk_build: "DPDKBuildEnvironment"
     dpdk: "DPDKRuntimeEnvironment"
diff --git a/dts/framework/remote_session/dpdk.py b/dts/framework/remote_session/dpdk.py
index c3575cfcaf..e43e1f2123 100644
--- a/dts/framework/remote_session/dpdk.py
+++ b/dts/framework/remote_session/dpdk.py
@@ -13,6 +13,7 @@
 from pathlib import Path, PurePath
 from typing import ClassVar, Final

+from api.capabilities import LinkTopology
 from framework.config.test_run import (
     DPDKBuildConfiguration,
     DPDKBuildOptionsConfiguration,
@@ -263,7 +264,8 @@ def _build_dpdk(self) -> None:
         ctx = get_ctx()
         # If the SUT is an ice driver device, make sure to build with 16B descriptors.
         if (
-            ctx.topology.sut_port_ingress
+            ctx.topology.type is not LinkTopology.NO_LINK
+            and ctx.topology.sut_port_ingress
             and ctx.topology.sut_port_ingress.config.os_driver == "ice"
         ):
             meson_args = MesonArgs(
diff --git a/dts/framework/runner.py b/dts/framework/runner.py
index 6ea4749ff4..fa4f06844e 100644
--- a/dts/framework/runner.py
+++ b/dts/framework/runner.py
@@ -61,7 +61,11 @@ def run(self) -> None:
             self._check_dts_python_version()

             for node_config in self._configuration.nodes:
-                nodes.append(Node(node_config))
+                if self._configuration.test_run.port_topology == []:
+                    if node_config.name == self._configuration.test_run.system_under_test_node:
+                        nodes.append(Node(node_config))
+                else:
+                    nodes.append(Node(node_config))

             test_run = TestRun(
                 self._configuration.test_run,
diff --git a/dts/framework/test_run.py b/dts/framework/test_run.py
index 94dc6023a7..9b973532da 100644
--- a/dts/framework/test_run.py
+++ b/dts/framework/test_run.py
@@ -106,6 +106,7 @@
 from types import MethodType
 from typing import ClassVar, Protocol, Union

+from api.capabilities import LinkTopology
 from framework.config.test_run import TestRunConfiguration
 from framework.context import Context, init_ctx
 from framework.exception import InternalError, SkippedTestException, TestCaseVerifyError
@@ -190,24 +191,33 @@ def __init__(
         self.logger = get_dts_logger()

         sut_node = next(n for n in nodes if n.name == config.system_under_test_node)
-        tg_node = next(n for n in nodes if n.name == config.traffic_generator_node)
-
-        topology = Topology.from_port_links(
-            PortLink(sut_node.ports_by_name[link.sut_port], tg_node.ports_by_name[link.tg_port])
-            for link in self.config.port_topology
-        )
+        if config.port_topology != []:
+            tg_node = next(n for n in nodes if n.name == config.traffic_generator_node)
+            topology = Topology.from_port_links(
+                PortLink(sut_node.ports_by_name[link.sut_port], tg_node.ports_by_name[link.tg_port])
+                for link in self.config.port_topology
+            )
+        else:
+            tg_node = None
+            topology = Topology.from_port_links(iter([]))

         dpdk_build_env = DPDKBuildEnvironment(config.dpdk.build, sut_node)
         dpdk_runtime_env = DPDKRuntimeEnvironment(config.dpdk, sut_node, dpdk_build_env)

         func_traffic_generator = (
             create_traffic_generator(config.func_traffic_generator, tg_node)
-            if config.func and config.func_traffic_generator
+            if config.func
+            and config.func_traffic_generator
+            and topology.type is not LinkTopology.NO_LINK
+            and tg_node is not None
             else None
         )
         perf_traffic_generator = (
             create_traffic_generator(config.perf_traffic_generator, tg_node)
-            if config.perf and config.perf_traffic_generator
+            if config.perf
+            and config.perf_traffic_generator
+            and topology.type is not LinkTopology.NO_LINK
+            and tg_node is not None
             else None
         )

@@ -336,39 +346,40 @@ def description(self) -> str:
     def next(self) -> State | None:
         """Process state and return the next one."""
         test_run = self.test_run
-        init_ctx(test_run.ctx)
+        ctx = test_run.ctx
+        init_ctx(ctx)

-        self.logger.info(f"Running on SUT node '{test_run.ctx.sut_node.name}'.")
+        self.logger.info(f"Running on SUT node '{ctx.sut_node.name}'.")
         test_run.init_random_seed()
         test_run.remaining_tests = deque(test_run.selected_tests)

-        test_run.ctx.sut_node.setup()
-        test_run.ctx.tg_node.setup()
-        test_run.ctx.dpdk.setup()
-        test_run.ctx.topology.setup()
+        ctx.sut_node.setup()
+        if ctx.topology.type is not LinkTopology.NO_LINK and ctx.tg_node is not None:
+            ctx.tg_node.setup()
+        ctx.dpdk.setup()
+        ctx.topology.setup()

         if test_run.config.use_virtual_functions:
-            test_run.ctx.topology.instantiate_vf_ports()
-        if test_run.ctx.sut_node.cryptodevs and test_run.config.crypto:
-            test_run.ctx.topology.instantiate_crypto_ports()
-            test_run.ctx.topology.bind_cryptodevs("dpdk")
+            ctx.topology.instantiate_vf_ports()
+        if ctx.sut_node.cryptodevs and test_run.config.crypto:
+            ctx.topology.instantiate_crypto_ports()
+            ctx.topology.bind_cryptodevs("dpdk")

-        test_run.ctx.topology.configure_ports("sut", "dpdk")
-        if test_run.ctx.func_tg:
-            test_run.ctx.func_tg.setup(test_run.ctx.topology)
-        if test_run.ctx.perf_tg:
-            test_run.ctx.perf_tg.setup(test_run.ctx.topology)
+        ctx.topology.configure_ports("sut", "dpdk")
+        if ctx.func_tg and ctx.topology.type is not LinkTopology.NO_LINK:
+            ctx.func_tg.setup(ctx.topology)
+        if ctx.perf_tg and ctx.topology.type is not LinkTopology.NO_LINK:
+            ctx.perf_tg.setup(ctx.topology)

         self.result.ports = [
-            port.to_dict()
-            for port in test_run.ctx.topology.sut_ports + test_run.ctx.topology.tg_ports
+            port.to_dict() for port in ctx.topology.sut_ports + ctx.topology.tg_ports
         ]
-        self.result.sut_session_info = test_run.ctx.sut_node.node_info
-        self.result.dpdk_build_info = test_run.ctx.dpdk_build.get_dpdk_build_info()
+        self.result.sut_session_info = ctx.sut_node.node_info
+        self.result.dpdk_build_info = ctx.dpdk_build.get_dpdk_build_info()

         self.logger.debug(f"Found capabilities to check: {test_run.required_capabilities}")
         test_run.supported_capabilities = get_supported_capabilities(
-            test_run.ctx.sut_node, test_run.ctx.topology, test_run.required_capabilities
+            ctx.sut_node, ctx.topology, test_run.required_capabilities
         )
         return TestRunExecution(test_run, self.result)

@@ -443,20 +454,22 @@ def description(self) -> str:

     def next(self) -> State | None:
         """Next state."""
+        ctx = self.test_run.ctx
         if self.test_run.config.use_virtual_functions:
-            self.test_run.ctx.topology.delete_vf_ports()
-        if self.test_run.ctx.sut_node.cryptodevs:
-            self.test_run.ctx.topology.delete_crypto_vf_ports()
-
-        self.test_run.ctx.shell_pool.terminate_current_pool()
-        if self.test_run.ctx.func_tg and self.test_run.ctx.func_tg.is_setup:
-            self.test_run.ctx.func_tg.teardown()
-        if self.test_run.ctx.perf_tg and self.test_run.ctx.perf_tg.is_setup:
-            self.test_run.ctx.perf_tg.teardown()
-        self.test_run.ctx.topology.teardown()
-        self.test_run.ctx.dpdk.teardown()
-        self.test_run.ctx.tg_node.teardown()
-        self.test_run.ctx.sut_node.teardown()
+            ctx.topology.delete_vf_ports()
+        if ctx.sut_node.cryptodevs:
+            ctx.topology.delete_crypto_vf_ports()
+
+        ctx.shell_pool.terminate_current_pool()
+        if ctx.func_tg is not None and ctx.func_tg.is_setup:
+            ctx.func_tg.teardown()
+        if ctx.perf_tg is not None and ctx.perf_tg.is_setup:
+            ctx.perf_tg.teardown()
+        ctx.topology.teardown()
+        ctx.dpdk.teardown()
+        if ctx.topology.type is not LinkTopology.NO_LINK and ctx.tg_node is not None:
+            ctx.tg_node.teardown()
+        ctx.sut_node.teardown()
         return None

     def on_error(self, ex: BaseException) -> State | None:
diff --git a/dts/framework/testbed_model/topology.py b/dts/framework/testbed_model/topology.py
index 34862c4d2e..1db444fc01 100644
--- a/dts/framework/testbed_model/topology.py
+++ b/dts/framework/testbed_model/topology.py
@@ -73,6 +73,8 @@ def from_port_links(cls, port_links: Iterator[PortLink]) -> Self:
             ConfigurationError: If an unsupported link topology is supplied.
         """
         type = LinkTopology.NO_LINK
+        sut_ports = []
+        tg_ports = []

         if port_link := next(port_links, None):
             type = LinkTopology.ONE_LINK
@@ -103,10 +105,12 @@ def node_and_ports_from_id(self, node_identifier: NodeIdentifier) -> tuple[Node,
             case "sut":
                 return ctx.sut_node, self.sut_ports
             case "tg":
-                return ctx.tg_node, self.tg_ports
-            case _:
-                msg = f"Invalid node `{node_identifier}` given."
+                if ctx.tg_node is not None:
+                    return ctx.tg_node, self.tg_ports
+                msg = "node tg does not exist with current topology."
                 raise InternalError(msg)
+        msg = f"Invalid node `{node_identifier}` given."
+        raise InternalError(msg)

     def get_crypto_vfs(self, num_vfs: int) -> list[Port]:
         """Retrieve virtual functions from active crypto vfs.
@@ -139,6 +143,8 @@ def setup(self) -> None:

         Binds all the ports to the right kernel driver to retrieve MAC addresses and logical names.
         """
+        if self.type is LinkTopology.NO_LINK:
+            return
         self._prepare_devbind_script()
         self._setup_ports("sut")
         self._setup_ports("tg")
@@ -148,6 +154,8 @@ def teardown(self) -> None:

         Restores all the ports to their original drivers before the test run.
         """
+        if self.type is LinkTopology.NO_LINK:
+            return
         self._restore_ports_original_drivers("sut")
         self._restore_ports_original_drivers("tg")

@@ -338,7 +346,8 @@ def prepare_node(node: Node) -> None:
             node.main_session.devbind_script_path = devbind_script_path

         ctx = get_ctx()
-        prepare_node(ctx.tg_node)
+        if ctx.tg_node:
+            prepare_node(ctx.tg_node)
         prepare_node(ctx.sut_node)

     @property
diff --git a/dts/tests/TestSuite_cryptodev_latency.py b/dts/tests/TestSuite_cryptodev_latency.py
index 411196c4c5..4e7d814faa 100644
--- a/dts/tests/TestSuite_cryptodev_latency.py
+++ b/dts/tests/TestSuite_cryptodev_latency.py
@@ -99,12 +99,12 @@ def _print_stats(self, test_vals: list[dict[str, int | float | str]]) -> None:
         print(f"{'Latency Results'.center(border_len)}\n{'=' * border_len}")
         for k, v in test_vals[0].items():
             print(f"|{k.title():<{element_len}}", end="")
-        print(f"|\n{'='*border_len}")
+        print(f"|\n{'=' * border_len}")

         for test_val in test_vals:
             for k, v in test_val.items():
                 print(f"|{v:<{element_len}}", end="")
-            print(f"|\n{'='*border_len}")
+            print(f"|\n{'=' * border_len}")

     def _verify_latency(
         self,
--
2.54.0


^ permalink raw reply related

* [DPDK/ethdev Bug 1965] Repeated port link up/down flapping leads to segmentation fault and core dump in hns3 ethdev driver.
From: bugzilla @ 2026-07-08 14:16 UTC (permalink / raw)
  To: dev

http://bugs.dpdk.org/show_bug.cgi?id=1965

            Bug ID: 1965
           Summary: Repeated port link up/down flapping leads to
                    segmentation fault and core dump in hns3 ethdev
                    driver.
           Product: DPDK
           Version: 25.11
          Hardware: ARM
                OS: Linux
            Status: UNCONFIRMED
          Severity: major
          Priority: Normal
         Component: ethdev
          Assignee: dev@dpdk.org
          Reporter: qianwu9966@gmail.com
  Target Milestone: ---

HNS3_DRIVER: 0000:7d:00.5 hns3_update_link_status(): Link status change to up!
HNS3_DRIVER: 0000:7d:00.4 hns3_update_link_status(): Link status change to up!
HNS3_DRIVER: 0000:7d:00.1 hns3_update_link_status(): Link status change to up!
HNS3_DRIVER: 0000:7d:00.2 hns3_update_link_status(): Link status change to up!
HNS3_DRIVER: 0000:7d:00.3 hns3_update_link_status(): Link status change to up!
HNS3_DRIVER: 0000:7d:00.6 hns3_update_link_status(): Link status change to up!
HNS3_DRIVER: 0000:7d:00.7 hns3_update_link_status(): Link status change to up!

[Switching to Thread 0xffffc92c2f40 (LWP 7937)]
hns3_tx_bulk_free_buffers (txq=0x98d21a000) at
../drivers/net/hns3/hns3_rxtx_vec.h:22
22      ../drivers/net/hns3/hns3_rxtx_vec.h: No such file or directory.
(gdb) bt 
#0  hns3_tx_bulk_free_buffers (txq=0x98d21a000) at
../drivers/net/hns3/hns3_rxtx_vec.h:22
#1  0x0000ffffcb5b8788 in hns3_tx_free_buffers (txq=0x98d21a000) at
../drivers/net/hns3/hns3_rxtx_vec.h:72
#2  0x0000ffffcb5ba2fc in hns3_xmit_fixed_burst_vec (tx_queue=0x98d21a000,
tx_pkts=0xffffc92c1f08, nb_pkts=1)
    at ../drivers/net/hns3/hns3_rxtx_vec_neon.h:41
#3  0x0000ffffcb5bb1c4 in hns3_xmit_pkts_vec (tx_queue=0x98d21a000,
tx_pkts=0xffffc92c1f08, nb_pkts=1)
    at ../drivers/net/hns3/hns3_rxtx_vec.c:47
#4  0x0000fffff768bdbc in safe_rte_eth_tx_burst (port=0, qid=0,
pkts=0xffffc92c1f08, nb=1)
    at /home/joy/ntas-gm/src/app/capture/readers/readers-dpdkplane.c:57
#5  0x0000fffff769906c in hwTxThreads_send_packet (arg=0x0) at
/home/joy/ntas-gm/src/app/capture/readers/readers-dpdkplane.c:2421
#6  0x0000fffff1616e80 in eal_thread_loop (arg=0x1) at
../lib/eal/common/eal_common_thread.c:199
#7  0x0000fffff1631f80 in eal_worker_thread_loop (arg=0x1) at
../lib/eal/linux/eal.c:517
#8  0x0000fffff7e82508 in  () at /usr/lib64/libc.so.6
#9  0x0000fffff7ee9cdc in  () at /usr/lib64/libc.so.6
(gdb) bt full
#0  hns3_tx_bulk_free_buffers (txq=0x98d21a000) at
../drivers/net/hns3/hns3_rxtx_vec.h:22
        free = 0x98d0d9d80
        tx_entry = 0x98d0dba00
        m = 0xffffc92c335c
        nb_free = 0
        i = 0
#1  0x0000ffffcb5b8788 in hns3_tx_free_buffers (txq=0x98d21a000) at
../drivers/net/hns3/hns3_rxtx_vec.h:72
        tx_desc = 0x98d120f80
        i = 32
#2  0x0000ffffcb5ba2fc in hns3_xmit_fixed_burst_vec (tx_queue=0x98d21a000,
tx_pkts=0xffffc92c1f08, nb_pkts=1)
    at ../drivers/net/hns3/hns3_rxtx_vec_neon.h:41
        txq = 0x98d21a000
        tx_desc = 0x98c704be0
        tx_entry = 0x98c6c4b10
        next_to_use = 3
        nb_commit = 1
        nb_tx = 1
        n = 32766
        i = 1
#3  0x0000ffffcb5bb1c4 in hns3_xmit_pkts_vec (tx_queue=0x98d21a000,
tx_pkts=0xffffc92c1f08, nb_pkts=1)
    at ../drivers/net/hns3/hns3_rxtx_vec.c:47
        ret = 1
        new_burst = 1
        txq = 0x98d21a000
        nb_tx = 0
#4  0x0000fffff768bdbc in safe_rte_eth_tx_burst (port=0, qid=0,
pkts=0xffffc92c1f08, nb=1)
    at /home/joy/ntas-gm/src/app/capture/readers/readers-dpdkplane.c:57
        p = 0xfffff19f5500 <rte_eth_fp_ops>
        burst_fn = 0xffffcb5bb14c <hns3_xmit_pkts_vec>
        qd = 0x98d21a000
#5  0x0000fffff769906c in hwTxThreads_send_packet (arg=0x0) at
/home/joy/ntas-gm/src/app/capture/readers/readers-dpdkplane.c:2421
        mbuf = 0xce1056780
        dfDpum = 0xce10567e0
        privDpum = 0xce1056800
        nb_tx = 1
        i = 0
        hwTxThreadsIdx = 0
        lcore_id = 1
        thrnamestr = "dpdkHwTxT0C1", '\000' <repeats 19 times>
        toHwTxRings = 0x77937150
        toHwTxRing = 0x98d35f280
        mbufs = {0xce1056780, 0x0 <repeats 63 times>}
        dequeCnt = 1
        mode = 0
        portidx = 0 '\000'
        hwdynamicPortidx = 0
        queueIdx = 0
        hwTxThreads = 0x777c9dd0
        pktegroup = 0
        pgidx = 0
#6  0x0000fffff1616e80 in eal_thread_loop (arg=0x1) at
../lib/eal/common/eal_common_thread.c:199
        f = 0xfffff7697980 <hwTxThreads_send_packet>
        fct_arg = 0x0
        lcore_id = 1
        cpuset = "1", '\000' <repeats 254 times>
        ret = 0
#7  0x0000fffff1631f80 in eal_worker_thread_loop (arg=0x1) at
../lib/eal/linux/eal.c:517
#8  0x0000fffff7e82508 in  () at /usr/lib64/libc.so.6
#9  0x0000fffff7ee9cdc in  () at /usr/lib64/libc.so.6
(gdb)

-- 
You are receiving this mail because:
You are the assignee for the bug.

^ permalink raw reply

* [PATCH v1] dts: resolve new formatting error
From: Koushik Bhargav Nimoji @ 2026-07-08 14:13 UTC (permalink / raw)
  To: luca.vizzarro, patrickrobb1997, dev
  Cc: abailey, ahassick, lylavoie, Koushik Bhargav Nimoji

This patch fixes another formatting error that has been caught
after updating the tool versions in the dts-check-format.sh
script.

Signed-off-by: Koushik Bhargav Nimoji <knimoji@iol.unh.edu>
---
 dts/tests/TestSuite_cryptodev_latency.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/dts/tests/TestSuite_cryptodev_latency.py b/dts/tests/TestSuite_cryptodev_latency.py
index 411196c4c5..4e7d814faa 100644
--- a/dts/tests/TestSuite_cryptodev_latency.py
+++ b/dts/tests/TestSuite_cryptodev_latency.py
@@ -99,12 +99,12 @@ def _print_stats(self, test_vals: list[dict[str, int | float | str]]) -> None:
         print(f"{'Latency Results'.center(border_len)}\n{'=' * border_len}")
         for k, v in test_vals[0].items():
             print(f"|{k.title():<{element_len}}", end="")
-        print(f"|\n{'='*border_len}")
+        print(f"|\n{'=' * border_len}")
 
         for test_val in test_vals:
             for k, v in test_val.items():
                 print(f"|{v:<{element_len}}", end="")
-            print(f"|\n{'='*border_len}")
+            print(f"|\n{'=' * border_len}")
 
     def _verify_latency(
         self,
-- 
2.54.0


^ permalink raw reply related

* Re: [PATCH v3] dts: update dts check format script and resolve errors
From: Koushik Bhargav Nimoji @ 2026-07-08 14:11 UTC (permalink / raw)
  To: Patrick Robb; +Cc: luca.vizzarro, dev, abailey, ahassick, lylavoie
In-Reply-To: <CAK6DuxvoaE=SBv8SParRR0CmFdGHgJNFq0ydKxJ6nO7ft+xOjw@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 459 bytes --]

Thanks Patrick. After this patch got applied I reran the
dts-check-format.sh script to test the other patches that were applied, to
which a file has been reformatted. Nothing big, just a few whitespace
insertions. I will be sending a patch out shortly that includes those
whitespace formatting fixes.

Thanks,
Koushik

On Tue, Jul 7, 2026 at 9:16 PM Patrick Robb <patrickrobb1997@gmail.com>
wrote:

> Applied to next-dts, thank you Koushik.
>

[-- Attachment #2: Type: text/html, Size: 808 bytes --]

^ permalink raw reply

* RE: [PATCH v8] mempool: improve cache behaviour and performance
From: Morten Brørup @ 2026-07-08 14:08 UTC (permalink / raw)
  To: Wisam Jaddo, NBU-Contact-Thomas Monjalon (EXTERNAL)
  Cc: dev, Andrew Rybchenko, Raslan Darawsheh, Maayan Kashani
In-Reply-To: <LV2PR12MB589331A1E8F78B5C9F3DC9C6A4FF2@LV2PR12MB5893.namprd12.prod.outlook.com>

> From: Wisam Jaddo [mailto:wisamm@nvidia.com]
> Sent: Wednesday, 8 July 2026 14.28
> 
> Hi,
> 
> Our internal performance testing are showing degradation starting from
> this commit.
> The degradation is about 1.8% - 2% on small msg szies.

What do you mean "small message sizes"?

Also, please share more details about the test case:
Access pattern, e.g. pipelined across multiple threads or run-to-completion? If possible, link to test case source code?
Get and put burst sizes?
Mempool cache size?
Mempool driver?

PS: I assume it is about mbuf mempool. Or is it some other object type in the mempool?

> 
> BRs,
> Wisam Jaddo
> 
> > -----Original Message-----
> > From: Thomas Monjalon <thomas@monjalon.net>
> > Sent: Wednesday, June 10, 2026 2:07 PM
> > To: Morten Brørup <mb@smartsharesystems.com>
> > Cc: dev@dpdk.org; Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
> > Subject: Re: [PATCH v8] mempool: improve cache behaviour and
> performance
> >
> > 04/06/2026 13:48, Morten Brørup:
> > > This patch refactors the mempool cache to eliminate some unexpected
> > > behaviour and reduce the mempool cache miss rate.
> >
> > Applied, thanks.
> >
> >


^ permalink raw reply

* Re: [PATCH] dev: hide internal type for device comparison
From: David Marchand @ 2026-07-08 12:53 UTC (permalink / raw)
  To: David Marchand; +Cc: dev, Bruce Richardson
In-Reply-To: <akzdNnQ9ol9sY1-p@bricha3-mobl1.ger.corp.intel.com>

On Tue, 7 Jul 2026 at 13:04, Bruce Richardson
<bruce.richardson@intel.com> wrote:
>
> On Mon, Jul 06, 2026 at 05:06:36PM +0200, David Marchand wrote:
> > rte_dev_cmp_t is a type used only in bus operations.
> > Since no public API references it, remove it from exported types.
> > Thanks to this, we can remove the dependency of bus_driver.h to
> > rte_dev.h.
> >
> > Signed-off-by: David Marchand <david.marchand@redhat.com>
> Acked-by: Bruce Richardson <bruce.richardson@intel.com>

Applied, thanks.


-- 
David Marchand


^ permalink raw reply

* Re: [PATCH] drivers/bus: remove blocklist evaluation when probing a device
From: David Marchand @ 2026-07-08 12:52 UTC (permalink / raw)
  To: David Marchand
  Cc: dev, Parav Pandit, Xueming Li, Hemant Agrawal, Sachin Saxena,
	Chenbo Xia, Nipun Gupta, Long Li, Wei Hu, Chengwen Feng,
	Bruce Richardson
In-Reply-To: <akzcxJwc0X_9UXFV@bricha3-mobl1.ger.corp.intel.com>

On Tue, 7 Jul 2026 at 13:02, Bruce Richardson
<bruce.richardson@intel.com> wrote:
>
> On Mon, Jul 06, 2026 at 05:06:11PM +0200, David Marchand wrote:
> > .probe_device is called from EAL, that already evaluated if the device
> > is blocklisted.
> >
> > Fixes: be29c42523d8 ("bus: implement probe in EAL")
> >
> > Signed-off-by: David Marchand <david.marchand@redhat.com>
> Acked-by: Bruce Richardson <bruce.richardson@intel.com>

Applied, thanks.


-- 
David Marchand


^ permalink raw reply

* Re: [PATCH v2] dev: fix hotplug notification to secondary
From: David Marchand @ 2026-07-08 12:52 UTC (permalink / raw)
  To: David Marchand; +Cc: dev, fengchengwen
In-Reply-To: <20260707115551.967336-1-david.marchand@redhat.com>

On Tue, 7 Jul 2026 at 13:56, David Marchand <david.marchand@redhat.com> wrote:
>
> There was a logical error when making some last minute change.
> Fix the no_shconf evaluation.
>
> Bugzilla ID: 1963
> Fixes: 1a2e26d8701d ("dev: skip multi-process in hotplug")
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>

Applied, thanks.


-- 
David Marchand


^ permalink raw reply

* RE: [PATCH v8] mempool: improve cache behaviour and performance
From: Wisam Jaddo @ 2026-07-08 12:28 UTC (permalink / raw)
  To: NBU-Contact-Thomas Monjalon (EXTERNAL), Morten Brørup
  Cc: dev@dpdk.org, Andrew Rybchenko, Raslan Darawsheh, Maayan Kashani
In-Reply-To: <VxW5gWu4QO2u3TstS3BuBw@monjalon.net>

Hi,

Our internal performance testing are showing degradation starting from this commit.
The degradation is about 1.8% - 2% on small msg szies.

BRs,
Wisam Jaddo

> -----Original Message-----
> From: Thomas Monjalon <thomas@monjalon.net>
> Sent: Wednesday, June 10, 2026 2:07 PM
> To: Morten Brørup <mb@smartsharesystems.com>
> Cc: dev@dpdk.org; Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
> Subject: Re: [PATCH v8] mempool: improve cache behaviour and performance
> 
> 04/06/2026 13:48, Morten Brørup:
> > This patch refactors the mempool cache to eliminate some unexpected
> > behaviour and reduce the mempool cache miss rate.
> 
> Applied, thanks.
> 
> 


^ permalink raw reply

* [PATCH] graph: fix xstats of cloned nodes
From: Andrey Yudin @ 2026-07-08  8:14 UTC (permalink / raw)
  To: Jerin Jacob, Kiran Kumar K, Nithin Dabilpuram, Zhirun Yan,
	Pavan Nikhilesh, Robin Jarry
  Cc: dev, Andrey Yudin, stable

When cloning a node with xstats enabled, xstat_desc entries are copied
into the rte_node_register structure, but the nb_xstats field is not.

As a result, the cloned node reports zero available xstats,
making xstats unusable.

Copy the nb_xstats field when cloning the node so that cloned nodes
preserve the xstats configuration of the original node.

Fixes: 070db97e017b ("graph: support node xstats")
Cc: stable@dpdk.org
Signed-off-by: Andrey Yudin <Andrey.Yudin@infotecs.ru>
---
 lib/graph/node.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lib/graph/node.c b/lib/graph/node.c
index 1fce3e6632..bb39c616de 100644
--- a/lib/graph/node.c
+++ b/lib/graph/node.c
@@ -208,6 +208,7 @@ node_clone(struct node *node, const char *name)
 			goto free;
 		}
 
+		reg->xstats->nb_xstats = node->xstats->nb_xstats;
 		for (i = 0; i < node->xstats->nb_xstats; i++)
 			if (rte_strscpy(reg->xstats->xstat_desc[i], node->xstats->xstat_desc[i],
 					RTE_NODE_XSTAT_DESC_SIZE) < 0)
-- 
2.47.3


^ permalink raw reply related

* [PATCH v2] net/iavf: fix single VLAN strip in double VLAN mode
From: Anurag Mandal @ 2026-07-08 10:33 UTC (permalink / raw)
  To: dev; +Cc: bruce.richardson, vladimir.medvedkin, Anurag Mandal, stable,
	Ye Chen
In-Reply-To: <20260708093955.495637-1-anurag.mandal@intel.com>

In Double VLAN Mode (DVM) i.e. when RTE_ETH_RX_OFFLOAD_VLAN_EXTEND
is enabled iavf_config_vlan_strip_v2() only toggles the inner
VLAN strip setting (0x8100) for the RTE_ETH_RX_OFFLOAD_VLAN_STRIP
offload, while the outer VLAN strip is controlled independently
through the QinQ strip path.

However, in DVM, most hardwares place a single (non-QinQ) VLAN
tag in the outer position
As a result, when a single VLAN packet is received and the
application disables single VLAN tag stripping, only the inner
VLAN tag strip gets turned off and the outer VLAN tag strip
stays enabled.
Hence, the single VLAN tag still gets stripped.
This does not honor the application's request.

This patch fixes the aforesaid case.
When DVM and QinQ stripping are both enabled, also apply the strip
enable/disable to the outer VLAN so that single VLAN packets received
in double VLAN mode respect the single VLAN strip configuration.

Fixes: 8599d7604e0a ("net/iavf: support QinQ strip")
Cc: stable@dpdk.org

Signed-off-by: Anurag Mandal <anurag.mandal@intel.com>
Tested-by: Ye Chen <yex.chen@intel.com>
---
V2: Spelling correction in commit message

 .mailmap                            | 1 +
 drivers/net/intel/iavf/iavf_vchnl.c | 5 +++++
 2 files changed, 6 insertions(+)

diff --git a/.mailmap b/.mailmap
index 05a55c0bd6..7ac425f800 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1893,6 +1893,7 @@ Yaron Illouz <yaroni@radcom.com>
 Yaroslav Brustinov <ybrustin@cisco.com>
 Yash Sharma <ysharma@marvell.com>
 Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp> <yasufum.o@gmail.com>
+Ye Chen <yex.chen@intel.com>
 Yehor Malikov <yehor.malikov@solidigm.com>
 Yelena Krivosheev <yelena@marvell.com>
 Yerden Zhumabekov <e_zhumabekov@sts.kz> <yerden.zhumabekov@sts.kz>
diff --git a/drivers/net/intel/iavf/iavf_vchnl.c b/drivers/net/intel/iavf/iavf_vchnl.c
index cd6e8325fc..a3cc5459d6 100644
--- a/drivers/net/intel/iavf/iavf_vchnl.c
+++ b/drivers/net/intel/iavf/iavf_vchnl.c
@@ -922,8 +922,13 @@ iavf_config_vlan_strip_v2(struct iavf_adapter *adapter, bool enable)
 	uint32_t *ethertype;
 	int qinq = adapter->dev_data->dev_conf.rxmode.offloads &
 		   RTE_ETH_RX_OFFLOAD_VLAN_EXTEND;
+	bool strip_qinq = adapter->dev_data->dev_conf.rxmode.offloads &
+			  RTE_ETH_RX_OFFLOAD_QINQ_STRIP;
 	int ret;
 
+	if (qinq && strip_qinq)
+		iavf_config_outer_vlan_strip_v2(adapter, enable);
+
 	stripping_caps = &vf->vlan_v2_caps.offloads.stripping_support;
 
 	/* When VLAN extend is disabled, Single VLAN mode which is Outer VLAN
-- 
2.34.1


^ permalink raw reply related

* [PATCH] net/iavf: fix single VLAN strip in double VLAN mode
From: Anurag Mandal @ 2026-07-08  9:39 UTC (permalink / raw)
  To: dev; +Cc: bruce.richardson, vladimir.medvedkin, Anurag Mandal, stable,
	Ye Chen

In Double VLAN Mode (DVM) i.e. when RTE_ETH_RX_OFFLOAD_VLAN_EXTEND
is enabled iavf_config_vlan_strip_v2() only toggles the inner
VLAN strip setting (0x8100) for the RTE_ETH_RX_OFFLOAD_VLAN_STRIP
offload, while the outer VLAN strip is controlled independently
through the QinQ strip path.

However, in DVM, most hardwares place a single (non-QinQ) VLAN
tag in the outer position
As a result, when a single VLAN packet is received and the
application disables single VLAN tag stripping, only the inner
VLAN tag strip gets turned off and the outer VLAN tag strip
stays enabled.
Hence, the single VLAN tag still gets stripped.
This does not honor the application's request.

This patche fixes the aforesaid case.
When DVM and QinQ stripping are both enabled, also apply the strip
enable/disable to the outer VLAN so that single VLAN packets received
in double VLAN mode respect the single VLAN strip configuration.

Fixes: 8599d7604e0a ("net/iavf: support QinQ strip")
Cc: stable@dpdk.org

Signed-off-by: Anurag Mandal <anurag.mandal@intel.com>
Tested-by: Ye Chen <yex.chen@intel.com>
---
 .mailmap                            | 1 +
 drivers/net/intel/iavf/iavf_vchnl.c | 5 +++++
 2 files changed, 6 insertions(+)

diff --git a/.mailmap b/.mailmap
index 05a55c0bd6..7ac425f800 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1893,6 +1893,7 @@ Yaron Illouz <yaroni@radcom.com>
 Yaroslav Brustinov <ybrustin@cisco.com>
 Yash Sharma <ysharma@marvell.com>
 Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp> <yasufum.o@gmail.com>
+Ye Chen <yex.chen@intel.com>
 Yehor Malikov <yehor.malikov@solidigm.com>
 Yelena Krivosheev <yelena@marvell.com>
 Yerden Zhumabekov <e_zhumabekov@sts.kz> <yerden.zhumabekov@sts.kz>
diff --git a/drivers/net/intel/iavf/iavf_vchnl.c b/drivers/net/intel/iavf/iavf_vchnl.c
index cd6e8325fc..a3cc5459d6 100644
--- a/drivers/net/intel/iavf/iavf_vchnl.c
+++ b/drivers/net/intel/iavf/iavf_vchnl.c
@@ -922,8 +922,13 @@ iavf_config_vlan_strip_v2(struct iavf_adapter *adapter, bool enable)
 	uint32_t *ethertype;
 	int qinq = adapter->dev_data->dev_conf.rxmode.offloads &
 		   RTE_ETH_RX_OFFLOAD_VLAN_EXTEND;
+	bool strip_qinq = adapter->dev_data->dev_conf.rxmode.offloads &
+			  RTE_ETH_RX_OFFLOAD_QINQ_STRIP;
 	int ret;
 
+	if (qinq && strip_qinq)
+		iavf_config_outer_vlan_strip_v2(adapter, enable);
+
 	stripping_caps = &vf->vlan_v2_caps.offloads.stripping_support;
 
 	/* When VLAN extend is disabled, Single VLAN mode which is Outer VLAN
-- 
2.34.1


^ permalink raw reply related

* Re: [PATCH] graph: fix xstats of cloned nodes
From: Robin Jarry @ 2026-07-08  9:21 UTC (permalink / raw)
  To: Andrey Yudin, Jerin Jacob, Kiran Kumar K, Nithin Dabilpuram,
	Zhirun Yan, Pavan Nikhilesh
  Cc: dev, stable
In-Reply-To: <20260708081420.1100574-1-Andrey.Yudin@infotecs.ru>

Andrey Yudin, Jul 08, 2026 at 10:14:
> When cloning a node with xstats enabled, xstat_desc entries are copied
> into the rte_node_register structure, but the nb_xstats field is not.
>
> As a result, the cloned node reports zero available xstats,
> making xstats unusable.
>
> Copy the nb_xstats field when cloning the node so that cloned nodes
> preserve the xstats configuration of the original node.
>
> Fixes: 070db97e017b ("graph: support node xstats")
> Cc: stable@dpdk.org
> Signed-off-by: Andrey Yudin <Andrey.Yudin@infotecs.ru>
> ---
>  lib/graph/node.c | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/lib/graph/node.c b/lib/graph/node.c
> index 1fce3e6632..bb39c616de 100644
> --- a/lib/graph/node.c
> +++ b/lib/graph/node.c
> @@ -208,6 +208,7 @@ node_clone(struct node *node, const char *name)
>  			goto free;
>  		}
>  
> +		reg->xstats->nb_xstats = node->xstats->nb_xstats;
>  		for (i = 0; i < node->xstats->nb_xstats; i++)
>  			if (rte_strscpy(reg->xstats->xstat_desc[i], node->xstats->xstat_desc[i],
>  					RTE_NODE_XSTAT_DESC_SIZE) < 0)

Reviewed-by: Robin Jarry <rjarry@redhat.com>


^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox