sync patches from 22.07 for hns3, dma and testpmd etc. Signed-off-by: Dongdong Liu <liudongdong3@huawei.com> (cherry picked from commit 7beb6a72fff2920a2d993030b0b02822249707fb)
153 lines
4.4 KiB
Diff
153 lines
4.4 KiB
Diff
From 82a85bc3c90744e171e0a16330685c4fd8c86a4a Mon Sep 17 00:00:00 2001
|
|
From: Huisong Li <lihuisong@huawei.com>
|
|
Date: Wed, 11 May 2022 10:14:34 +0800
|
|
Subject: [PATCH 086/122] app/testpmd: fix port status of bonding slave device
|
|
|
|
Starting or stopping a bonded port also starts or stops all active slaves
|
|
under the bonded port. If this port is a bonded device, we need to modify
|
|
the port status of all slaves.
|
|
|
|
Fixes: 0e545d3047fe ("app/testpmd: check stopping port is not in bonding")
|
|
Cc: stable@dpdk.org
|
|
|
|
Signed-off-by: Huisong Li <lihuisong@huawei.com>
|
|
Signed-off-by: Min Hu (Connor) <humin29@huawei.com>
|
|
Acked-by: Aman Singh <aman.deep.singh@intel.com>
|
|
Acked-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
|
|
---
|
|
app/test-pmd/cmdline.c | 1 +
|
|
app/test-pmd/testpmd.c | 73 +++++++++++++++++++++++++++++++++++++++---
|
|
app/test-pmd/testpmd.h | 3 +-
|
|
3 files changed, 72 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
|
|
index 969a333c93..1991ee3446 100644
|
|
--- a/app/test-pmd/cmdline.c
|
|
+++ b/app/test-pmd/cmdline.c
|
|
@@ -6660,6 +6660,7 @@ static void cmd_create_bonded_device_parsed(void *parsed_result,
|
|
"Failed to enable promiscuous mode for port %u: %s - ignore\n",
|
|
port_id, rte_strerror(-ret));
|
|
|
|
+ ports[port_id].bond_flag = 1;
|
|
ports[port_id].need_setup = 0;
|
|
ports[port_id].port_status = RTE_PORT_STOPPED;
|
|
}
|
|
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
|
|
index f9c025f97e..c4be9abe73 100644
|
|
--- a/app/test-pmd/testpmd.c
|
|
+++ b/app/test-pmd/testpmd.c
|
|
@@ -66,6 +66,9 @@
|
|
#ifdef RTE_EXEC_ENV_WINDOWS
|
|
#include <process.h>
|
|
#endif
|
|
+#ifdef RTE_NET_BOND
|
|
+#include <rte_eth_bond.h>
|
|
+#endif
|
|
|
|
#include "testpmd.h"
|
|
|
|
@@ -591,11 +594,58 @@ eth_dev_configure_mp(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
|
|
return 0;
|
|
}
|
|
|
|
+static int
|
|
+change_bonding_slave_port_status(portid_t bond_pid, bool is_stop)
|
|
+{
|
|
+#ifdef RTE_NET_BOND
|
|
+
|
|
+ portid_t slave_pids[RTE_MAX_ETHPORTS];
|
|
+ struct rte_port *port;
|
|
+ int num_slaves;
|
|
+ portid_t slave_pid;
|
|
+ int i;
|
|
+
|
|
+ num_slaves = rte_eth_bond_slaves_get(bond_pid, slave_pids,
|
|
+ RTE_MAX_ETHPORTS);
|
|
+ if (num_slaves < 0) {
|
|
+ fprintf(stderr, "Failed to get slave list for port = %u\n",
|
|
+ bond_pid);
|
|
+ return num_slaves;
|
|
+ }
|
|
+
|
|
+ for (i = 0; i < num_slaves; i++) {
|
|
+ slave_pid = slave_pids[i];
|
|
+ port = &ports[slave_pid];
|
|
+ port->port_status =
|
|
+ is_stop ? RTE_PORT_STOPPED : RTE_PORT_STARTED;
|
|
+ }
|
|
+#else
|
|
+ RTE_SET_USED(bond_pid);
|
|
+ RTE_SET_USED(is_stop);
|
|
+#endif
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static int
|
|
eth_dev_start_mp(uint16_t port_id)
|
|
{
|
|
- if (is_proc_primary())
|
|
- return rte_eth_dev_start(port_id);
|
|
+ int ret;
|
|
+
|
|
+ if (is_proc_primary()) {
|
|
+ ret = rte_eth_dev_start(port_id);
|
|
+ if (ret != 0)
|
|
+ return ret;
|
|
+
|
|
+ struct rte_port *port = &ports[port_id];
|
|
+
|
|
+ /*
|
|
+ * Starting a bonded port also starts all slaves under the bonded
|
|
+ * device. So if this port is bond device, we need to modify the
|
|
+ * port status of these slaves.
|
|
+ */
|
|
+ if (port->bond_flag == 1)
|
|
+ return change_bonding_slave_port_status(port_id, false);
|
|
+ }
|
|
|
|
return 0;
|
|
}
|
|
@@ -603,8 +653,23 @@ eth_dev_start_mp(uint16_t port_id)
|
|
static int
|
|
eth_dev_stop_mp(uint16_t port_id)
|
|
{
|
|
- if (is_proc_primary())
|
|
- return rte_eth_dev_stop(port_id);
|
|
+ int ret;
|
|
+
|
|
+ if (is_proc_primary()) {
|
|
+ ret = rte_eth_dev_stop(port_id);
|
|
+ if (ret != 0)
|
|
+ return ret;
|
|
+
|
|
+ struct rte_port *port = &ports[port_id];
|
|
+
|
|
+ /*
|
|
+ * Stopping a bonded port also stops all slaves under the bonded
|
|
+ * device. So if this port is bond device, we need to modify the
|
|
+ * port status of these slaves.
|
|
+ */
|
|
+ if (port->bond_flag == 1)
|
|
+ return change_bonding_slave_port_status(port_id, true);
|
|
+ }
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
|
|
index 2149ecd93a..9c24cb07e0 100644
|
|
--- a/app/test-pmd/testpmd.h
|
|
+++ b/app/test-pmd/testpmd.h
|
|
@@ -242,7 +242,8 @@ struct rte_port {
|
|
struct rte_eth_txconf tx_conf[RTE_MAX_QUEUES_PER_PORT+1]; /**< per queue tx configuration */
|
|
struct rte_ether_addr *mc_addr_pool; /**< pool of multicast addrs */
|
|
uint32_t mc_addr_nb; /**< nb. of addr. in mc_addr_pool */
|
|
- uint8_t slave_flag; /**< bonding slave port */
|
|
+ uint8_t slave_flag : 1, /**< bonding slave port */
|
|
+ bond_flag : 1; /**< port is bond device */
|
|
struct port_flow *flow_list; /**< Associated flows. */
|
|
struct port_indirect_action *actions_list;
|
|
/**< Associated indirect actions. */
|
|
--
|
|
2.22.0
|
|
|