From ce6959bf793c9e333098f7620cd2427008de0d5f Mon Sep 17 00:00:00 2001 From: Wisam Jaddo Date: Fri, 19 Oct 2018 04:07:52 +0200 Subject: [PATCH] app/testpmd: update port list for multiple removals 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 Acked-by: Bernard Iremonger --- 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 b057365d15..89fc39cf54 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -2198,6 +2198,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) { @@ -2327,7 +2352,6 @@ void detach_port(portid_t port_id) { char name[RTE_ETH_NAME_MAX_LEN]; - uint16_t i; printf("Detaching a port...\n"); @@ -2344,16 +2368,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.20.1