From 613ce6691c0d5ac0f99d7995f1e8e4ac86643882 Mon Sep 17 00:00:00 2001 From: Anatoly Burakov Date: Mon, 20 Apr 2020 17:56:52 +0000 Subject: [PATCH] examples/l3fwd-power: implement proper shutdown Currently, shutdown for l3fwd-power application is all over the place and may or may not happen either in the signal handler or in the main() function. Fix this so that the signal handler will only set the exit variable, thereby allowing all of the loops to end properly and proceed to deinitialize everything. Signed-off-by: Anatoly Burakov Acked-by: David Hunt Reviewed-by: Reshma Pattan --- examples/l3fwd-power/main.c | 74 ++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c index be50ec0498..293b3da4ae 100644 --- a/examples/l3fwd-power/main.c +++ b/examples/l3fwd-power/main.c @@ -422,41 +422,10 @@ static int is_done(void) static void signal_exit_now(int sigtype) { - unsigned lcore_id; - unsigned int portid; - int ret; - - if (sigtype == SIGINT) { - if (app_mode == APP_MODE_EMPTY_POLL || - app_mode == APP_MODE_TELEMETRY) - quit_signal = true; + if (sigtype == SIGINT) + quit_signal = true; - for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) { - if (rte_lcore_is_enabled(lcore_id) == 0) - continue; - - /* init power management library */ - ret = rte_power_exit(lcore_id); - if (ret) - rte_exit(EXIT_FAILURE, "Power management " - "library de-initialization failed on " - "core%u\n", lcore_id); - } - - if (app_mode != APP_MODE_EMPTY_POLL) { - RTE_ETH_FOREACH_DEV(portid) { - if ((enabled_port_mask & (1 << portid)) == 0) - continue; - - rte_eth_dev_stop(portid); - rte_eth_dev_close(portid); - } - } - } - - if (app_mode != APP_MODE_EMPTY_POLL) - rte_exit(EXIT_SUCCESS, "User forced exit\n"); } /* Freqency scale down timer callback */ @@ -1196,7 +1165,7 @@ main_loop(__rte_unused void *dummy) else RTE_LOG(INFO, L3FWD_POWER, "RX interrupt won't enable.\n"); - while (1) { + while (!is_done()) { stats[lcore_id].nb_iteration_looped++; cur_tsc = rte_rdtsc(); @@ -1343,6 +1312,8 @@ start_rx: stats[lcore_id].sleep_time += lcore_idle_hint; } } + + return 0; } static int @@ -2080,6 +2051,26 @@ init_power_library(void) } return ret; } + +static int +deinit_power_library(void) +{ + unsigned int lcore_id; + int ret = 0; + + RTE_LCORE_FOREACH(lcore_id) { + /* deinit power management library */ + ret = rte_power_exit(lcore_id); + if (ret) { + RTE_LOG(ERR, POWER, + "Library deinitialization failed on core %u\n", + lcore_id); + return ret; + } + } + return ret; +} + static void update_telemetry(__rte_unused struct rte_timer *tim, __rte_unused void *arg) @@ -2530,8 +2521,23 @@ main(int argc, char **argv) return -1; } + RTE_ETH_FOREACH_DEV(portid) + { + if ((enabled_port_mask & (1 << portid)) == 0) + continue; + + rte_eth_dev_stop(portid); + rte_eth_dev_close(portid); + } + if (app_mode == APP_MODE_EMPTY_POLL) rte_power_empty_poll_stat_free(); + if (app_mode != APP_MODE_TELEMETRY && deinit_power_library()) + rte_exit(EXIT_FAILURE, "deinit_power_library failed\n"); + + if (rte_eal_cleanup() < 0) + RTE_LOG(ERR, L3FWD_POWER, "EAL cleanup failed\n"); + return 0; } -- 2.20.1