Use proper teardown sequence when SIGINT is caught to prevent eventdev from going into undefined state.
Signed-off-by: Pavan Nikhilesh <pbhagavat...@caviumnetworks.com> --- v3 Changes: - Segregate ethdev_stop and close to prevent possible SEGFAULT. - handle early shutdown. v2 Changes: - Only stopping the ethdev(producer) is sufficient.(Jerin) app/test-eventdev/evt_main.c | 40 +++++++++++++++--------- app/test-eventdev/test_perf_common.c | 1 - app/test-eventdev/test_pipeline_common.c | 1 - 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/app/test-eventdev/evt_main.c b/app/test-eventdev/evt_main.c index 57bb94570..0d5028c17 100644 --- a/app/test-eventdev/evt_main.c +++ b/app/test-eventdev/evt_main.c @@ -20,29 +20,39 @@ struct evt_test *test; static void signal_handler(int signum) { - if (signum == SIGINT || signum == SIGTERM) { + int i; + static uint8_t once; + + if ((signum == SIGINT || signum == SIGTERM) && !once) { + once = true; printf("\nSignal %d received, preparing to exit...\n", signum); - /* request all lcores to exit from the main loop */ - *(int *)test->test_priv = true; - rte_wmb(); - rte_eal_mp_wait_lcore(); + if (test != NULL) { + /* request all lcores to exit from the main loop */ + *(int *)test->test_priv = true; + rte_wmb(); + + if (test->ops.ethdev_destroy) + test->ops.ethdev_destroy(test, &opt); - if (test->ops.test_result) - test->ops.test_result(test, &opt); + rte_eal_mp_wait_lcore(); - if (test->ops.eventdev_destroy) - test->ops.eventdev_destroy(test, &opt); + if (test->ops.test_result) + test->ops.test_result(test, &opt); - if (test->ops.ethdev_destroy) - test->ops.ethdev_destroy(test, &opt); + RTE_ETH_FOREACH_DEV(i) + rte_eth_dev_close(i); - if (test->ops.mempool_destroy) - test->ops.mempool_destroy(test, &opt); + if (test->ops.eventdev_destroy) + test->ops.eventdev_destroy(test, &opt); - if (test->ops.test_destroy) - test->ops.test_destroy(test, &opt); + if (test->ops.mempool_destroy) + test->ops.mempool_destroy(test, &opt); + + if (test->ops.test_destroy) + test->ops.test_destroy(test, &opt); + } /* exit with the expected status */ signal(signum, SIG_DFL); diff --git a/app/test-eventdev/test_perf_common.c b/app/test-eventdev/test_perf_common.c index d00f91802..6d39f98e0 100644 --- a/app/test-eventdev/test_perf_common.c +++ b/app/test-eventdev/test_perf_common.c @@ -743,7 +743,6 @@ void perf_ethdev_destroy(struct evt_test *test, struct evt_options *opt) RTE_ETH_FOREACH_DEV(i) { rte_event_eth_rx_adapter_stop(i); rte_eth_dev_stop(i); - rte_eth_dev_close(i); } } } diff --git a/app/test-eventdev/test_pipeline_common.c b/app/test-eventdev/test_pipeline_common.c index 719518ff3..96e7c9882 100644 --- a/app/test-eventdev/test_pipeline_common.c +++ b/app/test-eventdev/test_pipeline_common.c @@ -467,7 +467,6 @@ pipeline_ethdev_destroy(struct evt_test *test, struct evt_options *opt) RTE_ETH_FOREACH_DEV(i) { rte_event_eth_rx_adapter_stop(i); rte_eth_dev_stop(i); - rte_eth_dev_close(i); } } -- 2.18.0