From patchwork Tue May 15 15:56:22 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Van Haaren, Harry" X-Patchwork-Id: 40057 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A6B9A1B7CC; Tue, 15 May 2018 17:56:32 +0200 (CEST) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by dpdk.org (Postfix) with ESMTP id 48F641B7C4 for ; Tue, 15 May 2018 17:56:29 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 15 May 2018 08:56:29 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,403,1520924400"; d="scan'208";a="54560751" Received: from silpixa00399779.ir.intel.com ([10.237.223.187]) by fmsmga004.fm.intel.com with ESMTP; 15 May 2018 08:56:27 -0700 From: Harry van Haaren To: dev@dpdk.org Cc: Harry van Haaren , thomas@monjalon.net, vipin.varghese@intel.com Date: Tue, 15 May 2018 16:56:22 +0100 Message-Id: <1526399782-156061-1-git-send-email-harry.van.haaren@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1526395965-133647-1-git-send-email-harry.van.haaren@intel.com> References: <1526395965-133647-1-git-send-email-harry.van.haaren@intel.com> Subject: [dpdk-dev] [PATCH v2] eal/service: improve error checking of coremasks 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" This commit improves the error checking performed on the core masks (or lists) of the service cores, in particular with respect to the data-plane (RTE) cores of DPDK. With this commit, invalid configurations are detected at runtime, and warning messages are printed to inform the user. For example specifying the coremask as 0xf, and the service coremask as 0xff00 is invalid as not all service-cores are contained within the coremask. A warning is now printed to inform the user. Reported-by: Vipin Varghese Signed-off-by: Harry van Haaren --- v2, thanks for review: - Consistency in message endings - vs . (Thomas) - Wrap lines as they're very long otherwise (Thomas) Cc: thomas@monjalon.net Cc: vipin.varghese@intel.com @Thomas, please consider this patch for RC4, it adds checks and prints warnings, better usability, no functional changes. --- lib/librte_eal/common/eal_common_options.c | 43 ++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c index ecebb29..9f3a484 100644 --- a/lib/librte_eal/common/eal_common_options.c +++ b/lib/librte_eal/common/eal_common_options.c @@ -315,6 +315,7 @@ eal_parse_service_coremask(const char *coremask) unsigned int count = 0; char c; int val; + uint32_t taken_lcore_count = 0; if (coremask == NULL) return -1; @@ -358,6 +359,10 @@ eal_parse_service_coremask(const char *coremask) "lcore %u unavailable\n", idx); return -1; } + + if (cfg->lcore_role[idx] == ROLE_RTE) + taken_lcore_count++; + lcore_config[idx].core_role = ROLE_SERVICE; count++; } @@ -374,11 +379,28 @@ eal_parse_service_coremask(const char *coremask) if (count == 0) return -1; + if (core_parsed && taken_lcore_count != count) { + RTE_LOG(ERR, EAL, + "Warning: not all service cores were in the coremask. " + "Please ensure -c or -l includes service cores\n"); + } + cfg->service_lcore_count = count; return 0; } static int +eal_service_cores_parsed(void) +{ + int idx; + for (idx = 0; idx < RTE_MAX_LCORE; idx++) { + if (lcore_config[idx].core_role == ROLE_SERVICE) + return 1; + } + return 0; +} + +static int eal_parse_coremask(const char *coremask) { struct rte_config *cfg = rte_eal_get_configuration(); @@ -387,6 +409,11 @@ eal_parse_coremask(const char *coremask) char c; int val; + if (eal_service_cores_parsed()) + RTE_LOG(ERR, EAL, + "Warning: Service cores parsed before dataplane cores. " + "Please ensure -c is before -s or -S.\n"); + if (coremask == NULL) return -1; /* Remove all blank characters ahead and after . @@ -418,6 +445,7 @@ eal_parse_coremask(const char *coremask) "unavailable\n", idx); return -1; } + cfg->lcore_role[idx] = ROLE_RTE; lcore_config[idx].core_index = count; count++; @@ -449,6 +477,7 @@ eal_parse_service_corelist(const char *corelist) unsigned count = 0; char *end = NULL; int min, max; + uint32_t taken_lcore_count = 0; if (corelist == NULL) return -1; @@ -490,6 +519,9 @@ eal_parse_service_corelist(const char *corelist) idx); return -1; } + if (cfg->lcore_role[idx] == ROLE_RTE) + taken_lcore_count++; + lcore_config[idx].core_role = ROLE_SERVICE; count++; @@ -504,6 +536,12 @@ eal_parse_service_corelist(const char *corelist) if (count == 0) return -1; + if (core_parsed && taken_lcore_count != count) { + RTE_LOG(ERR, EAL, + "Warning: not all service cores were in the coremask. " + "Please ensure -c or -l includes service cores\n"); + } + return 0; } @@ -516,6 +554,11 @@ eal_parse_corelist(const char *corelist) char *end = NULL; int min, max; + if (eal_service_cores_parsed()) + RTE_LOG(ERR, EAL, + "Warning: Service cores parsed before dataplane cores. " + "Please ensure -l is before -s or -S.\n"); + if (corelist == NULL) return -1;