From patchwork Mon Apr 20 17:56:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anatoly Burakov X-Patchwork-Id: 69009 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 320E4A0598; Tue, 21 Apr 2020 12:50:04 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 7ACE31D8F1; Tue, 21 Apr 2020 12:50:03 +0200 (CEST) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by dpdk.org (Postfix) with ESMTP id DE1831D8E9 for ; Tue, 21 Apr 2020 12:50:01 +0200 (CEST) IronPort-SDR: GYlnUUgA44IzdvOznITmQeTXOdozbQBjH5xSdrXrME9omftgcJCq3kxe/G8UMILwPrrG5mNaYh d2d7tSTAaEcA== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Apr 2020 03:50:00 -0700 IronPort-SDR: LPam7gdF+y7hOGQQ1FXvf/4SClG1zcgaVGP3WAUGilhMxNeQDbujuZkeBOvb1EP9c968HYWXhb bGJSaoxY5lzQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,410,1580803200"; d="scan'208";a="456058652" Received: from aburakov-mobl.ger.corp.intel.com (HELO localhost.localdomain) ([10.213.208.123]) by fmsmga005.fm.intel.com with ESMTP; 21 Apr 2020 03:50:00 -0700 From: Anatoly Burakov To: dev@dpdk.org Cc: David Hunt , reshma.pattan@intel.com Date: Mon, 20 Apr 2020 17:56:51 +0000 Message-Id: X-Mailer: git-send-email 2.17.1 In-Reply-To: <854770a880777e7ad200481294a7aa5ac9a45f2d.1586361368.git.anatoly.burakov@intel.com> References: <854770a880777e7ad200481294a7aa5ac9a45f2d.1586361368.git.anatoly.burakov@intel.com> Subject: [dpdk-dev] [PATCH v2 1/2] l3fwd-power: exit if initializing power library failed X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Currently, if power library initialization fails, only a log message is displayed. This is suboptimal for a number of reasons, but the main one is that telemetry mode does not depend on the power library and can therefore run in environments where l3fwd-power would normally not run correctly (such as inside a VM). This will lead to attempts to deinitialize the power library on exit, with a subsequent forced unclean shutdown of DPDK. Fix this by only initializing the power library in modes that actually need it, and change a log message to a failure to initialize. Signed-off-by: Anatoly Burakov Acked-by: David Hunt Reviewed-by: Reshma Pattan Tested-by: Xie,WeiX < weix.xie@intel.com> Signed-off-by: Anatoly Burakov Acked-by: David Hunt Reviewed-by: Reshma Pattan --- examples/l3fwd-power/main.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c index b46aa7bac..be50ec049 100644 --- a/examples/l3fwd-power/main.c +++ b/examples/l3fwd-power/main.c @@ -2065,15 +2065,17 @@ static int check_ptype(uint16_t portid) static int init_power_library(void) { - int ret = 0, lcore_id; - for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) { - if (rte_lcore_is_enabled(lcore_id)) { - /* init power management library */ - ret = rte_power_init(lcore_id); - if (ret) - RTE_LOG(ERR, POWER, + unsigned int lcore_id; + int ret = 0; + + RTE_LCORE_FOREACH(lcore_id) { + /* init power management library */ + ret = rte_power_init(lcore_id); + if (ret) { + RTE_LOG(ERR, POWER, "Library initialization failed on core %u\n", lcore_id); + return ret; } } return ret; @@ -2224,8 +2226,8 @@ main(int argc, char **argv) if (ret < 0) rte_exit(EXIT_FAILURE, "Invalid L3FWD parameters\n"); - if (init_power_library()) - RTE_LOG(ERR, L3FWD_POWER, "init_power_library failed\n"); + if (app_mode != APP_MODE_TELEMETRY && init_power_library()) + rte_exit(EXIT_FAILURE, "init_power_library failed\n"); if (update_lcore_params() < 0) rte_exit(EXIT_FAILURE, "update_lcore_params failed\n"); From patchwork Mon Apr 20 17:56:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anatoly Burakov X-Patchwork-Id: 69010 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 31726A0598; Tue, 21 Apr 2020 12:50:11 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E3ECD1D970; Tue, 21 Apr 2020 12:50:09 +0200 (CEST) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by dpdk.org (Postfix) with ESMTP id 875861D8E9 for ; Tue, 21 Apr 2020 12:50:02 +0200 (CEST) IronPort-SDR: iY/nRiieajrX88UA08QXBLpfkFMBTHT0DN3G9Ri5To0YVIyrKo+xKniuypQeF3KXnPCR/qv2jP nwFs5KC+/Udw== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Apr 2020 03:50:02 -0700 IronPort-SDR: 1ig2gOZQVoMT8MI8qnf6BHM03I/x+jclLy1I/E+XV4wM3bsLb/fqkVgzz7jvBUwv3LCld34pgh pf3xoZ+tYGmA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,410,1580803200"; d="scan'208";a="456058671" Received: from aburakov-mobl.ger.corp.intel.com (HELO localhost.localdomain) ([10.213.208.123]) by fmsmga005.fm.intel.com with ESMTP; 21 Apr 2020 03:50:01 -0700 From: Anatoly Burakov To: dev@dpdk.org Cc: David Hunt , reshma.pattan@intel.com Date: Mon, 20 Apr 2020 17:56:52 +0000 Message-Id: X-Mailer: git-send-email 2.17.1 In-Reply-To: References: In-Reply-To: <854770a880777e7ad200481294a7aa5ac9a45f2d.1586361368.git.anatoly.burakov@intel.com> References: <854770a880777e7ad200481294a7aa5ac9a45f2d.1586361368.git.anatoly.burakov@intel.com> Subject: [dpdk-dev] [PATCH v2 2/2] l3fwd-power: implement proper shutdown handling X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 Tested-by: Xie,WeiX < weix.xie@intel.com> Signed-off-by: Anatoly Burakov Acked-by: David Hunt Reviewed-by: Reshma Pattan --- Notes: v2: - rebase on top of latest master 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 be50ec049..293b3da4a 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 @@ main_loop(__rte_unused void *dummy) 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; }