app/eventdev: use proper teardown sequence
Use proper teardown sequence when SIGINT is caught to prevent eventdev from going into undefined state. Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com> Acked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
This commit is contained in:
parent
56aa489e8e
commit
685bb5778f
@ -20,29 +20,41 @@ struct evt_test *test;
|
|||||||
static void
|
static void
|
||||||
signal_handler(int signum)
|
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",
|
printf("\nSignal %d received, preparing to exit...\n",
|
||||||
signum);
|
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.test_result)
|
if (test->ops.ethdev_destroy)
|
||||||
test->ops.test_result(test, &opt);
|
test->ops.ethdev_destroy(test, &opt);
|
||||||
|
|
||||||
if (test->ops.eventdev_destroy)
|
rte_eal_mp_wait_lcore();
|
||||||
test->ops.eventdev_destroy(test, &opt);
|
|
||||||
|
|
||||||
if (test->ops.ethdev_destroy)
|
if (test->ops.test_result)
|
||||||
test->ops.ethdev_destroy(test, &opt);
|
test->ops.test_result(test, &opt);
|
||||||
|
|
||||||
if (test->ops.mempool_destroy)
|
if (opt.prod_type == EVT_PROD_TYPE_ETH_RX_ADPTR) {
|
||||||
test->ops.mempool_destroy(test, &opt);
|
RTE_ETH_FOREACH_DEV(i)
|
||||||
|
rte_eth_dev_close(i);
|
||||||
|
}
|
||||||
|
|
||||||
if (test->ops.test_destroy)
|
if (test->ops.eventdev_destroy)
|
||||||
test->ops.test_destroy(test, &opt);
|
test->ops.eventdev_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 */
|
/* exit with the expected status */
|
||||||
signal(signum, SIG_DFL);
|
signal(signum, SIG_DFL);
|
||||||
|
@ -750,7 +750,6 @@ void perf_ethdev_destroy(struct evt_test *test, struct evt_options *opt)
|
|||||||
RTE_ETH_FOREACH_DEV(i) {
|
RTE_ETH_FOREACH_DEV(i) {
|
||||||
rte_event_eth_rx_adapter_stop(i);
|
rte_event_eth_rx_adapter_stop(i);
|
||||||
rte_eth_dev_stop(i);
|
rte_eth_dev_stop(i);
|
||||||
rte_eth_dev_close(i);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -477,7 +477,6 @@ pipeline_ethdev_destroy(struct evt_test *test, struct evt_options *opt)
|
|||||||
RTE_ETH_FOREACH_DEV(i) {
|
RTE_ETH_FOREACH_DEV(i) {
|
||||||
rte_event_eth_rx_adapter_stop(i);
|
rte_event_eth_rx_adapter_stop(i);
|
||||||
rte_eth_dev_stop(i);
|
rte_eth_dev_stop(i);
|
||||||
rte_eth_dev_close(i);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user