hi, matan
On 5/3/2018 3:25 PM, Matan Azrad wrote:
Hi Jeff
From: Jeff Guo, Wednesday, April 18, 2018 4:38 PM
Use testpmd for example, to show how an application smoothly handle
failure when device being hot unplug. Once app detect the removal event,
the callback would be called, it first stop the packet forwarding, then stop the
port, close the port and finally detach the port.
Signed-off-by: Jeff Guo <jia....@intel.com>
---
v20->v19:
remove the auto binding example.
---
app/test-pmd/testpmd.c | 29 +++++++++++++++++++++++++----
1 file changed, 25 insertions(+), 4 deletions(-)
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index
5986ff7..3751901 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1125,6 +1125,9 @@ run_pkt_fwd_on_lcore(struct fwd_lcore *fc,
packet_fwd_t pkt_fwd)
tics_datum = rte_rdtsc();
tics_per_1sec = rte_get_timer_hz();
#endif
+ if (hot_plug)
+ rte_dev_handle_hot_unplug();
+
Again, I don't understand why the application should configure it - it already
started the hot-plug,
Can't the EAL handle this automatically when the user starts the hot-plug?
please check v21, agree with you and have already modify it.
fsm = &fwd_streams[fc->stream_idx];
nb_fs = fc->stream_nb;
do {
@@ -2069,6 +2072,26 @@ rmv_event_callback(void *arg)
dev->device->name);
}
+static void
+rmv_dev_event_callback(char *dev_name)
+{
+ uint16_t port_id;
+ int ret;
+
+ ret = rte_eth_dev_get_port_by_name(dev_name, &port_id);
+ if (ret) {
+ printf("can not get port by device %s!\n", dev_name);
+ return;
+ }
+
+ RTE_ETH_VALID_PORTID_OR_RET(port_id);
+ printf("removing port id:%u\n", port_id);
+ stop_packet_forwarding();
+ stop_port(port_id);
+ close_port(port_id);
+ detach_port(port_id);
+}
We have also the rmv_event_callback() which is triggered by a RMV interrupt and
running by the host thread.
What is the context thread of rmv_dev_event_callback()?
Shouldn't they be synchronized? Should we need both in the same time?
the context thread is interrupt thread. and we might be discuss how to
sync it. do you have comment if i combine these 2 into 1 callback?
+
/* 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, @@ -2130,9 +2153,7 @@ eth_dev_event_callback(char
*device_name, enum rte_dev_event_type type,
case RTE_DEV_EVENT_REMOVE:
RTE_LOG(ERR, EAL, "The device: %s has been removed!\n",
device_name);
- /* TODO: After finish failure handle, begin to stop
- * packet forward, stop port, close port, detach port.
- */
+ rmv_dev_event_callback(device_name);
break;
case RTE_DEV_EVENT_ADD:
RTE_LOG(ERR, EAL, "The device: %s has been added!\n",
@@ -2640,7 +2661,7 @@ main(int argc, char** argv)
return -1;
}
eth_dev_event_callback_register();
-
+ rte_dev_handle_hot_unplug();
}
if (start_port(RTE_PORT_ALL) != 0)
--
2.7.4