[dpdk-dev] [PATCH v6 1/6] app/testpmd: update port list for multiple removals

Thomas Monjalon thomas at monjalon.net
Fri Oct 19 04:07:52 CEST 2018


From: Wisam Jaddo <wisamm at mellanox.com>

When detaching a port, the full rte_device is removed.
If the rte_device was hosting several ports,
the testpmd list of ports must be updated for multiple removals.

Signed-off-by: Wisam Jaddo <wisamm at mellanox.com>
---
 app/test-pmd/testpmd.c | 37 ++++++++++++++++++++++++++-----------
 1 file changed, 26 insertions(+), 11 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 5dbbf783f..2c0b4a021 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -2186,6 +2186,31 @@ stop_port(portid_t pid)
 	printf("Done\n");
 }
 
+static void
+remove_unused_fwd_ports(void)
+{
+	int i;
+	int last_port_idx = nb_ports - 1;
+
+	for (i = 0; i <= last_port_idx; i++) { /* iterate in ports_ids */
+		if (rte_eth_devices[ports_ids[i]].state != RTE_ETH_DEV_UNUSED)
+			continue;
+		/* skip unused ports at the end */
+		while (i <= last_port_idx &&
+				rte_eth_devices[ports_ids[last_port_idx]].state
+				== RTE_ETH_DEV_UNUSED)
+			last_port_idx--;
+		if (last_port_idx < i)
+			break;
+		/* overwrite unused port with last valid port */
+		ports_ids[i] = ports_ids[last_port_idx];
+		/* decrease ports count */
+		last_port_idx--;
+	}
+	nb_ports = rte_eth_dev_count_avail();
+	update_fwd_ports(RTE_MAX_ETHPORTS);
+}
+
 void
 close_port(portid_t pid)
 {
@@ -2315,7 +2340,6 @@ void
 detach_port(portid_t port_id)
 {
 	char name[RTE_ETH_NAME_MAX_LEN];
-	uint16_t i;
 
 	printf("Detaching a port...\n");
 
@@ -2332,16 +2356,7 @@ detach_port(portid_t port_id)
 		return;
 	}
 
-	for (i = 0; i < nb_ports; i++) {
-		if (ports_ids[i] == port_id) {
-			ports_ids[i] = ports_ids[nb_ports-1];
-			ports_ids[nb_ports-1] = 0;
-			break;
-		}
-	}
-	nb_ports = rte_eth_dev_count_avail();
-
-	update_fwd_ports(RTE_MAX_ETHPORTS);
+	remove_unused_fwd_ports();
 
 	printf("Port %u is detached. Now total ports is %d\n",
 			port_id, nb_ports);
-- 
2.19.0



More information about the dev mailing list