Skip to content

Commit

Permalink
examples/l3fwd-power: implement proper shutdown
Browse files Browse the repository at this point in the history
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 <anatoly.burakov@intel.com>
Acked-by: David Hunt <david.hunt@intel.com>
Reviewed-by: Reshma Pattan <reshma.pattan@intel.com>
  • Loading branch information
anatolyburakov authored and tmonjalo committed Apr 26, 2020
1 parent a163130 commit 613ce66
Showing 1 changed file with 40 additions and 34 deletions.
74 changes: 40 additions & 34 deletions examples/l3fwd-power/main.c
Expand Up @@ -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 */
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -1343,6 +1312,8 @@ main_loop(__rte_unused void *dummy)
stats[lcore_id].sleep_time += lcore_idle_hint;
}
}

return 0;
}

static int
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}

0 comments on commit 613ce66

Please sign in to comment.