@@ -3323,9 +3323,6 @@ reset_port(portid_t pid)
void
attach_port(char *identifier)
{
- portid_t pi;
- struct rte_dev_iterator iterator;
-
printf("Attaching a new port...\n");
if (identifier == NULL) {
@@ -3337,24 +3334,6 @@ attach_port(char *identifier)
TESTPMD_LOG(ERR, "Failed to attach port %s\n", identifier);
return;
}
-
- /* first attach mode: event */
- if (setup_on_probe_event) {
- /* new ports are detected on RTE_ETH_EVENT_NEW event */
- for (pi = 0; pi < RTE_MAX_ETHPORTS; pi++)
- if (ports[pi].port_status == RTE_PORT_HANDLING &&
- ports[pi].need_setup != 0)
- setup_attached_port(pi);
- return;
- }
-
- /* second attach mode: iterator */
- RTE_ETH_FOREACH_MATCHING_DEV(pi, identifier, &iterator) {
- /* setup ports matching the devargs used for probing */
- if (port_is_forwarding(pi))
- continue; /* port was already attached before */
- setup_attached_port(pi);
- }
}
static void
@@ -3377,7 +3356,6 @@ setup_attached_port(portid_t pi)
ports_ids[nb_ports++] = pi;
fwd_ports_ids[nb_fwd_ports++] = pi;
nb_cfg_ports = nb_fwd_ports;
- ports[pi].need_setup = 0;
ports[pi].port_status = RTE_PORT_STOPPED;
printf("Port %d is attached. Now total ports is %d\n", pi, nb_ports);
@@ -3411,11 +3389,10 @@ detach_device(struct rte_device *dev)
TESTPMD_LOG(ERR, "Failed to detach device %s\n", dev->name);
return;
}
- remove_invalid_ports();
printf("Device is detached\n");
- printf("Now total ports is %d\n", nb_ports);
printf("Done\n");
+
return;
}
@@ -3481,11 +3458,9 @@ detach_devargs(char *identifier)
return;
}
- remove_invalid_ports();
-
printf("Device %s is detached\n", identifier);
- printf("Now total ports is %d\n", nb_ports);
printf("Done\n");
+
rte_devargs_reset(&da);
}
@@ -3649,11 +3624,52 @@ rmv_port_callback(void *arg)
struct rte_device *device = dev_info.device;
close_port(port_id);
detach_device(device); /* might be already removed or have more ports */
+ remove_invalid_ports();
+ printf("Now total ports is %d\n", nb_ports);
}
if (need_to_start)
start_packet_forwarding(0);
}
+static void config_attached_port(portid_t port_id)
+{
+ struct rte_dev_iterator iterator;
+ struct rte_eth_dev_info dev_info;
+ portid_t pi;
+ int ret;
+
+ /* first attach mode: event */
+ if (setup_on_probe_event) {
+ /* new ports are detected on RTE_ETH_EVENT_NEW event */
+ setup_attached_port(port_id);
+ return;
+ }
+
+ ret = eth_dev_info_get_print_err(port_id, &dev_info);
+ if (ret != 0) {
+ TESTPMD_LOG(ERR,
+ "Failed to get device info for port %d, not detaching\n",
+ port_id);
+ return;
+ }
+ /* second attach mode: iterator */
+ RTE_ETH_FOREACH_MATCHING_DEV(pi, dev_info.device->name, &iterator) {
+ /* setup ports matching the devargs used for probing */
+ if (port_is_forwarding(port_id))
+ continue; /* port was already attached before */
+ setup_attached_port(port_id);
+ }
+}
+
+static void
+remove_invalid_ports_callback(void *arg)
+{
+ RTE_SET_USED(arg);
+
+ remove_invalid_ports();
+ printf("Now total ports is %d\n", nb_ports);
+}
+
/* This function is used by the interrupt thread */
static int
eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param,
@@ -3678,8 +3694,7 @@ eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param,
switch (type) {
case RTE_ETH_EVENT_NEW:
- ports[port_id].need_setup = 1;
- ports[port_id].port_status = RTE_PORT_HANDLING;
+ config_attached_port(port_id);
break;
case RTE_ETH_EVENT_INTR_RMV:
if (rte_eal_alarm_set(100000,
@@ -3690,6 +3705,9 @@ eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param,
case RTE_ETH_EVENT_DESTROY:
ports[port_id].port_status = RTE_PORT_CLOSED;
printf("Port %u is closed\n", port_id);
+ if (rte_eal_alarm_set(100000, remove_invalid_ports_callback,
+ (void *)(intptr_t)port_id))
+ fprintf(stderr, "Could not set up deferred device released\n");
break;
case RTE_ETH_EVENT_RX_AVAIL_THRESH: {
uint16_t rxq_id;
@@ -278,7 +278,6 @@ struct rte_port {
uint16_t tx_vlan_id;/**< The tag ID */
uint16_t tx_vlan_id_outer;/**< The outer tag ID */
volatile uint16_t port_status; /**< port started or not */
- uint8_t need_setup; /**< port just attached */
uint8_t need_reconfig; /**< need reconfiguring port or not */
uint8_t need_reconfig_queues; /**< need reconfiguring queues or not */
uint8_t rss_flag; /**< enable rss or not */
@@ -763,7 +763,6 @@ static void cmd_create_bonded_device_parsed(void *parsed_result,
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;
}