app/testpmd: update port list for multiple removals
[dpdk.git] / app / test-pmd / testpmd.c
index 5dbbf78..89fc39c 100644 (file)
@@ -565,9 +565,21 @@ set_default_fwd_ports_config(void)
        portid_t pt_id;
        int i = 0;
 
-       RTE_ETH_FOREACH_DEV(pt_id)
+       RTE_ETH_FOREACH_DEV(pt_id) {
                fwd_ports_ids[i++] = pt_id;
 
+               /* Update sockets info according to the attached device */
+               int socket_id = rte_eth_dev_socket_id(pt_id);
+               if (socket_id >= 0 && new_socket_id(socket_id)) {
+                       if (num_sockets >= RTE_MAX_NUMA_NODES) {
+                               rte_exit(EXIT_FAILURE,
+                                        "Total sockets greater than %u\n",
+                                        RTE_MAX_NUMA_NODES);
+                       }
+                       socket_ids[num_sockets++] = socket_id;
+               }
+       }
+
        nb_cfg_ports = nb_ports;
        nb_fwd_ports = nb_ports;
 }
@@ -1021,12 +1033,6 @@ init_config(void)
 
        memset(port_per_socket,0,RTE_MAX_NUMA_NODES);
 
-       if (numa_support) {
-               memset(port_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS);
-               memset(rxring_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS);
-               memset(txring_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS);
-       }
-
        /* Configuration of logical cores. */
        fwd_lcores = rte_zmalloc("testpmd: fwd_lcores",
                                sizeof(struct fwd_lcore *) * nb_lcores,
@@ -1063,9 +1069,12 @@ init_config(void)
                        else {
                                uint32_t socket_id = rte_eth_dev_socket_id(pid);
 
-                               /* if socket_id is invalid, set to 0 */
+                               /*
+                                * if socket_id is invalid,
+                                * set to the first available socket.
+                                */
                                if (check_socket_id(socket_id) < 0)
-                                       socket_id = 0;
+                                       socket_id = socket_ids[0];
                                port_per_socket[socket_id]++;
                        }
                }
@@ -1221,9 +1230,12 @@ init_fwd_streams(void)
                        else {
                                port->socket_id = rte_eth_dev_socket_id(pid);
 
-                               /* if socket_id is invalid, set to 0 */
+                               /*
+                                * if socket_id is invalid,
+                                * set to the first available socket.
+                                */
                                if (check_socket_id(port->socket_id) < 0)
-                                       port->socket_id = 0;
+                                       port->socket_id = socket_ids[0];
                        }
                }
                else {
@@ -1988,7 +2000,7 @@ start_port(portid_t pid)
                                        return -1;
                                }
                        }
-
+                       configure_rxtx_dump_callbacks(0);
                        printf("Configuring Port %d (socket %u)\n", pi,
                                        port->socket_id);
                        /* configure port */
@@ -2087,7 +2099,7 @@ start_port(portid_t pid)
                                return -1;
                        }
                }
-
+               configure_rxtx_dump_callbacks(verbose_level);
                /* start port */
                if (rte_eth_dev_start(pi) < 0) {
                        printf("Fail to start port %d\n", pi);
@@ -2186,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)
 {
@@ -2294,9 +2331,9 @@ attach_port(char *identifier)
                return;
 
        socket_id = (unsigned)rte_eth_dev_socket_id(pi);
-       /* if socket_id is invalid, set to 0 */
+       /* if socket_id is invalid, set to the first available socket. */
        if (check_socket_id(socket_id) < 0)
-               socket_id = 0;
+               socket_id = socket_ids[0];
        reconfig(pi, socket_id);
        rte_eth_promiscuous_enable(pi);
 
@@ -2315,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");
 
@@ -2332,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);
@@ -2954,6 +2981,11 @@ init_port(void)
                                "rte_zmalloc(%d struct rte_port) failed\n",
                                RTE_MAX_ETHPORTS);
        }
+
+       /* Initialize ports NUMA structures */
+       memset(port_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS);
+       memset(rxring_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS);
+       memset(txring_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS);
 }
 
 static void