-----Original Message----- > Date: Tue, 24 Jul 2018 21:09:50 +0530 > From: Jerin Jacob <jerin.ja...@caviumnetworks.com> > To: Pavan Nikhilesh <pbhagavat...@caviumnetworks.com> > Cc: dev@dpdk.org > Subject: Re: [dpdk-dev] [PATCH v4] app/eventdev: use proper teardown > sequence > User-Agent: Mutt/1.10.1 (2018-07-13) > > -----Original Message----- > > Date: Tue, 24 Jul 2018 17:44:50 +0530 > > From: Pavan Nikhilesh <pbhagavat...@caviumnetworks.com> > > To: jerin.ja...@caviumnetworks.com > > Cc: dev@dpdk.org, Pavan Nikhilesh <pbhagavat...@caviumnetworks.com> > > Subject: [dpdk-dev] [PATCH v4] app/eventdev: use proper teardown sequence > > X-Mailer: git-send-email 2.18.0 > > > > Use proper teardown sequence when SIGINT is caught to prevent > > eventdev from going into undefined state. > > > > Signed-off-by: Pavan Nikhilesh <pbhagavat...@caviumnetworks.com> > > Acked-by: Jerin Jacob <jerin.ja...@caviumnetworks.com>
Applied to dpdk-next-eventdev/master. Thanks. > > > --- > > v4 Changes: > > - Check opts before closing ethdev. > > > > 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 | 42 +++++++++++++++--------- > > app/test-eventdev/test_perf_common.c | 1 - > > app/test-eventdev/test_pipeline_common.c | 1 - > > 3 files changed, 27 insertions(+), 17 deletions(-) > > > > diff --git a/app/test-eventdev/evt_main.c b/app/test-eventdev/evt_main.c > > index 57bb94570..a8d304bab 100644 > > --- a/app/test-eventdev/evt_main.c > > +++ b/app/test-eventdev/evt_main.c > > @@ -20,29 +20,41 @@ 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); > > + if (opt.prod_type == EVT_PROD_TYPE_ETH_RX_ADPTR) { > > + 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 > >