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.zh...@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

Reply via email to