[dpdk-dev] [RFC 4/4] testpmd: enable async device reset

Qi Zhang qi.z.zhang at intel.com
Wed Aug 8 09:00:45 CEST 2018


rte_eth_dev_reset is claimed as an async API, so re-work
on the device reset handling.

Signed-off-by: Qi Zhang <qi.z.zhang at intel.com>
---
 app/test-pmd/testpmd.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 54 insertions(+), 1 deletion(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index ee48db2a3..24d5c5d9c 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1918,6 +1918,59 @@ close_port(portid_t pid)
 	printf("Done\n");
 }
 
+static pthread_mutex_t dev_reset_lock;
+static pthread_cond_t dev_reset_cond;
+static int reset_status;
+
+static int
+on_reset_complete(__rte_unused uint16_t port_id,
+		__rte_unused enum rte_eth_event_type event,
+		__rte_unused void *cb_arg,
+		void *ret_param)
+{
+	RTE_ASSERT(event == RTE_ETH_EVENT_RESET_COMPLETE);
+
+	pthread_cond_broadcast(&dev_reset_cond);
+
+	reset_status = *(int *)ret_param;
+	return 0;
+}
+
+static int
+do_dev_reset_sync(portid_t pid)
+{
+	int ret;
+
+	pthread_mutex_init(&dev_reset_lock, NULL);
+	pthread_cond_init(&dev_reset_cond, NULL);
+
+	ret = rte_eth_dev_callback_register(pid,
+			RTE_ETH_EVENT_RESET_COMPLETE,
+			on_reset_complete, NULL);
+
+	if (ret) {
+		printf("Fail to reigster callback function\n");
+		return ret;
+	}
+
+	ret = rte_eth_dev_reset(pid);
+	if (ret)
+		goto finish;
+
+	pthread_mutex_lock(&dev_reset_lock);
+	pthread_cond_wait(&dev_reset_cond, &dev_reset_lock);
+	pthread_mutex_unlock(&dev_reset_lock);
+
+	ret = reset_status;
+
+finish:
+	rte_eth_dev_callback_unregister(pid,
+			RTE_ETH_EVENT_RESET_COMPLETE,
+			on_reset_complete, NULL);
+
+	return ret;
+}
+
 void
 reset_port(portid_t pid)
 {
@@ -1946,7 +1999,7 @@ reset_port(portid_t pid)
 			continue;
 		}
 
-		diag = rte_eth_dev_reset(pi);
+		diag = do_dev_reset_sync(pi);
 		if (diag == 0) {
 			port = &ports[pi];
 			port->need_reconfig = 1;
-- 
2.13.6



More information about the dev mailing list