[dpdk-dev] [EXT] [PATCH v4 3/3] examples/eventdev: move eth stop to the end
Pavan Nikhilesh Bhagavatula
pbhagavatula at marvell.com
Mon Jan 25 18:51:51 CET 2021
>Move eth stop code from "signal_handler" function to the end of
>"main"
>function. There are two reasons for this:
>
>First, this improves code maintenance and makes code look simple and
>clear. Based on this change, after receiving the interrupt signal,
>"fdata->done" is set as 1. Then the main thread will wait all worker
>lcores to jump out of the loop. Finally, the main thread will stop and
>then close eth dev port.
>
>Second, for older version, the main thread first stops eth dev port and
>then waits the end of worker lcore. This may cause errors because it
>may
>stop the eth dev port which worker lcores are using. This moving
>change
>can fix this by waiting all worker threads to exit and then stop the
>eth dev port.
>
>In the meanwhile, remove wmb in signal_handler.
>
>This is because when the main lcore receive the stop signal, it stores 1
>into fdata->done. And then the worker lcores load "fdata->done" and
>jump
>out of the loop to stop running. Nothing should be stored after
>updating
>fdata->done, so the wmb is unnecessary.
>
>Fixes: 085edac2ca38 ("examples/eventdev_pipeline: support Tx
>adapter")
>Cc: pbhagavatula at marvell.com
>Cc: stable at dpdk.org
>
>Suggested-by: Ruifeng Wang <ruifeng.wang at arm.com>
>Signed-off-by: Feifei Wang <feifei.wang2 at arm.com>
>Reviewed-by: Ruifeng Wang <ruifeng.wang at arm.com>
>Reviewed-by: Honnappa Nagarahalli
><honnappa.nagarahalli at arm.com>
>Acked-by: Harry van Haaren <harry.van.haaren at intel.com>
Acked-by: Pavan Nikhilesh <pbhagavatula at marvell.com>
>---
> examples/eventdev_pipeline/main.c | 16 ++++------------
> 1 file changed, 4 insertions(+), 12 deletions(-)
>
>diff --git a/examples/eventdev_pipeline/main.c
>b/examples/eventdev_pipeline/main.c
>index 3526d4d3d..4621e8a89 100644
>--- a/examples/eventdev_pipeline/main.c
>+++ b/examples/eventdev_pipeline/main.c
>@@ -311,7 +311,6 @@ static void
> signal_handler(int signum)
> {
> static uint8_t once;
>- uint16_t portid;
>
> if (fdata->done)
> rte_exit(1, "Exiting on signal %d\n", signum);
>@@ -322,17 +321,6 @@ signal_handler(int signum)
> rte_event_dev_dump(0, stdout);
> once = 1;
> fdata->done = 1;
>- rte_smp_wmb();
>-
>- RTE_ETH_FOREACH_DEV(portid) {
>- rte_event_eth_rx_adapter_stop(portid);
>- rte_event_eth_tx_adapter_stop(portid);
>- if (rte_eth_dev_stop(portid) < 0)
>- printf("Failed to stop port %u", portid);
>- }
>-
>- rte_eal_mp_wait_lcore();
>-
> }
> if (signum == SIGTSTP)
> rte_event_dev_dump(0, stdout);
>@@ -483,6 +471,10 @@ main(int argc, char **argv)
> }
>
> RTE_ETH_FOREACH_DEV(portid) {
>+ rte_event_eth_rx_adapter_stop(portid);
>+ rte_event_eth_tx_adapter_stop(portid);
>+ if (rte_eth_dev_stop(portid) < 0)
>+ printf("Failed to stop port %u", portid);
> rte_eth_dev_close(portid);
> }
>
>--
>2.25.1
More information about the dev
mailing list