From patchwork Mon Jan 27 10:30:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hariprasad Govindharajan X-Patchwork-Id: 65142 X-Patchwork-Delegate: ferruh.yigit@amd.com 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 70ED9A04B3; Mon, 27 Jan 2020 11:31:19 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 649C81BF87; Mon, 27 Jan 2020 11:31:07 +0100 (CET) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by dpdk.org (Postfix) with ESMTP id 601AF1BF80 for ; Mon, 27 Jan 2020 11:31:05 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Jan 2020 02:31:05 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,369,1574150400"; d="scan'208";a="221694738" Received: from silpixa00393944.ir.intel.com ([10.237.223.184]) by orsmga008.jf.intel.com with ESMTP; 27 Jan 2020 02:31:04 -0800 From: Hariprasad Govindharajan To: Cc: dev@dpdk.org, Hariprasad Govindharajan Date: Mon, 27 Jan 2020 10:30:53 +0000 Message-Id: <1580121053-26083-3-git-send-email-hariprasad.govindharajan@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1580121053-26083-1-git-send-email-hariprasad.govindharajan@intel.com> References: <1580121053-26083-1-git-send-email-hariprasad.govindharajan@intel.com> Subject: [dpdk-dev] [PATCH 2/2] eal: add eal_parse_optionlist to parse user input 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" In current version, there is a function which parses the corelist based on user value. A new generic function eal_parse_optionlist is added which will parse corelist as well as similar user input so that we can use it as a public API too. Signed-off-by: Hariprasad Govindharajan --- lib/librte_eal/common/eal_common_options.c | 45 ++++++++++++++++++------------ lib/librte_eal/common/include/rte_eal.h | 34 ++++++++++++++++++++++ lib/librte_eal/rte_eal_version.map | 1 + 3 files changed, 62 insertions(+), 18 deletions(-) diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c index 5920233..aa59f8b 100644 --- a/lib/librte_eal/common/eal_common_options.c +++ b/lib/librte_eal/common/eal_common_options.c @@ -571,33 +571,36 @@ eal_parse_service_corelist(const char *corelist) return 0; } -static int -eal_parse_corelist(const char *corelist, int *cores) +int +eal_parse_optionlist(const char *list, int *values, int maxsize) { unsigned count = 0; char *end = NULL; int min, max; int idx; - for (idx = 0; idx < RTE_MAX_LCORE; idx++) - cores[idx] = -1; + if (list == NULL || values == NULL || maxsize < 0) + return -1; + + for (idx = 0; idx < maxsize; idx++) + values[idx] = -1; /* Remove all blank characters ahead */ - while (isblank(*corelist)) - corelist++; + while (isblank(*list)) + list++; + + min = maxsize; - /* Get list of cores */ - min = RTE_MAX_LCORE; do { - while (isblank(*corelist)) - corelist++; - if (*corelist == '\0') + while (isblank(*list)) + list++; + if (*list == '\0') return -1; errno = 0; - idx = strtol(corelist, &end, 10); + idx = strtol(list, &end, 10); if (errno || end == NULL) return -1; - if (idx < 0 || idx >= RTE_MAX_LCORE) + if (idx < 0 || idx >= maxsize) return -1; while (isblank(*end)) end++; @@ -605,18 +608,18 @@ eal_parse_corelist(const char *corelist, int *cores) min = idx; } else if ((*end == ',') || (*end == '\0')) { max = idx; - if (min == RTE_MAX_LCORE) + if (min == maxsize) min = idx; for (idx = min; idx <= max; idx++) { - if (cores[idx] == -1) { - cores[idx] = count; + if (values[idx] == -1) { + values[idx] = count; count++; } } - min = RTE_MAX_LCORE; + min = maxsize; } else return -1; - corelist = end + 1; + list = end + 1; } while (*end != '\0'); if (count == 0) @@ -624,6 +627,12 @@ eal_parse_corelist(const char *corelist, int *cores) return 0; } +static int +eal_parse_corelist(const char *corelist, int *cores) +{ + return eal_parse_optionlist(corelist, cores, RTE_MAX_LCORE); +} + /* Changes the lcore id of the master thread */ static int eal_parse_master_lcore(const char *arg) diff --git a/lib/librte_eal/common/include/rte_eal.h b/lib/librte_eal/common/include/rte_eal.h index 2f9ed29..567b754 100644 --- a/lib/librte_eal/common/include/rte_eal.h +++ b/lib/librte_eal/common/include/rte_eal.h @@ -71,6 +71,40 @@ enum rte_proc_type_t rte_eal_process_type(void); int rte_eal_iopl_init(void); /** + * Parse the user input + * + * This function can be used to read and parse the user input + * from the command line. For example, when the user specifies + * corelist or port list this function will read the input + * and set the forwarding cores or ports + * + * @param[in] list + * String containing the user input. User can specify + * in these formats 1,3,5 or 1-3 or 1-2,5 or 3,5-6. + * For example, if the user wants to use all the available + * 4 ports in his system, then the input can be 0-3 or 0,1,2,3. + * If the user wants to use only the ports 1,2 then the input + * is 1,2. + * valid characters are '-' and ',' + * invalid chars like '.' or '#' will result in + * EAL: Error - exiting with code: 1 + * Cause: Invalid fwd port list + * @param[in] values + * An array pointer, used by this function to set the + * array contents to a positive value if they are listed + * in the input + * else sets it to -1 + * @param[in] maxsize + * This is the maximum value the list string can contain + * @return + * -On success, returns 0. + * -On failure, returns -1. + */ +__rte_experimental +int +eal_parse_optionlist(const char *list, int *values, int maxsize); + +/** * Initialize the Environment Abstraction Layer (EAL). * * This function is to be executed on the MASTER lcore only, as soon diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index e38d025..3d72df8 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -332,4 +332,5 @@ EXPERIMENTAL { # added in 19.11 rte_log_get_stream; rte_mcfg_get_single_file_segments; + eal_parse_optionlist; };