All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Hunt <david.hunt@intel.com>
To: dev@dpdk.org
Cc: bruce.richardson@intel.com, thomas@monjalon.net,
	david.marchand@redhat.com, David Hunt <david.hunt@intel.com>
Subject: [dpdk-dev] [PATCH v6 1/2] eal: add additional info if core list too long
Date: Wed,  3 Nov 2021 14:32:28 +0000	[thread overview]
Message-ID: <20211103143229.34503-1-david.hunt@intel.com> (raw)
In-Reply-To: <20210923110213.21350-1-david.hunt@intel.com>

If the user requests to use an lcore above 128 using -l,
the eal will exit with "EAL: invalid core list syntax" and
very little else useful information.

This patch adds some extra information suggesting to use --lcores
so that physical cores above RTE_MAX_LCORE (default 128) can be
used. This is achieved by using the --lcores option by mapping
the logical cores in the application to physical cores.

For example, if "-l 12-16,130,132" is used, we see the following
additional output on the command line:

EAL: lcore 132 >= RTE_MAX_LCORE (128)
EAL: lcore 133 >= RTE_MAX_LCORE (128)
EAL: to use high physical core ids , please use --lcores to map
them to lcore ids below RTE_MAX_LCORE,
EAL:     e.g. --lcores 0@12,1@13,2@14,3@15,4@16,5@132,6@133

Signed-off-by: David Hunt <david.hunt@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>

---
changes in v6
   * none
changes in v5
   * removed un-needed index variables
   * now ensures snprintf ret > 0 before using
   * removed corelist_copy, not needed.
   * reverted err: usage to -1, as no free() needed.
   * added in code to allow duplicates
   * other code cleanups
changes in v4
   * tweaked log messages to be a bit clearer about mapping lcores
     to physical cores.
   * improved indenting of log messages.
   * fixed bug in overrunning end of lcore array
   * switched from strlcpy to strdup because of a clang error
changes in v3
   * separated out some of the corelist cheking into separate function
   * added extra messages for the different failure conditions.
   * changed allocation of the core strings from static to dynamic
   * now prints out a message for each core above RTE_MAX_LCORE
changes in v2
   * Rather than increasing the default max lcores (as in v1),
     it was agreed to do this instead (switch to --lcores).
   * As the other patches in the v1 of the set are no longer related
     to this change, I'll submit as a separate patch set.
---
 lib/eal/common/eal_common_options.c | 87 ++++++++++++++++++++++++++---
 1 file changed, 79 insertions(+), 8 deletions(-)

diff --git a/lib/eal/common/eal_common_options.c b/lib/eal/common/eal_common_options.c
index 1802e3d9e1..c35798b288 100644
--- a/lib/eal/common/eal_common_options.c
+++ b/lib/eal/common/eal_common_options.c
@@ -703,6 +703,50 @@ update_lcore_config(int *cores)
 	return ret;
 }
 
+static int
+check_core_list(int *lcores, unsigned int count)
+{
+	unsigned int i;
+	char *lcorestr;
+	int len = 0, ret;
+	bool overflow = false;
+
+	for (i = 0; i < count; i++) {
+		if (lcores[i] >= RTE_MAX_LCORE) {
+			RTE_LOG(ERR, EAL, "lcore %d >= RTE_MAX_LCORE (%d)\n",
+					lcores[i], RTE_MAX_LCORE);
+			overflow = true;
+		}
+	}
+	if (!overflow)
+		return 0;
+
+	/*
+	 * We've encountered a core that's greater than
+	 * RTE_MAX_LCORE, suggest using --lcores option to
+	 * map lcores onto physical cores greater than
+	 * RTE_MAX_LCORE, then return.
+	 */
+	lcorestr = calloc(1, RTE_MAX_LCORE * 10);
+	if (lcorestr == NULL) {
+		RTE_LOG(ERR, EAL, "Unable to allocate lcore string\n");
+		return -ENOMEM;
+	}
+	for (i = 0; i < count; i++) {
+		ret = snprintf(&lcorestr[len],
+				RTE_MAX_LCORE * 10 - len,
+				"%d@%d,", i, lcores[i]);
+		if (ret > 0)
+			len = len + ret;
+	}
+	if (len > 0)
+		lcorestr[len - 1] = 0;
+	RTE_LOG(ERR, EAL, "to use high physical core ids , please use --lcores to map them to lcore ids below RTE_MAX_LCORE,\n");
+	RTE_LOG(ERR, EAL, "    e.g. --lcores %s\n", lcorestr);
+	free(lcorestr);
+	return -1;
+}
+
 static int
 eal_parse_coremask(const char *coremask, int *cores)
 {
@@ -833,10 +877,12 @@ eal_parse_service_corelist(const char *corelist)
 static int
 eal_parse_corelist(const char *corelist, int *cores)
 {
-	unsigned count = 0;
+	unsigned int count = 0, i;
 	char *end = NULL;
 	int min, max;
 	int idx;
+	int lcores[RTE_MAX_LCORE];
+	bool dup;
 
 	for (idx = 0; idx < RTE_MAX_LCORE; idx++)
 		cores[idx] = -1;
@@ -846,7 +892,7 @@ eal_parse_corelist(const char *corelist, int *cores)
 		corelist++;
 
 	/* Get list of cores */
-	min = RTE_MAX_LCORE;
+	min = -1;
 	do {
 		while (isblank(*corelist))
 			corelist++;
@@ -856,7 +902,7 @@ eal_parse_corelist(const char *corelist, int *cores)
 		idx = strtol(corelist, &end, 10);
 		if (errno || end == NULL)
 			return -1;
-		if (idx < 0 || idx >= RTE_MAX_LCORE)
+		if (idx < 0)
 			return -1;
 		while (isblank(*end))
 			end++;
@@ -864,15 +910,25 @@ eal_parse_corelist(const char *corelist, int *cores)
 			min = idx;
 		} else if ((*end == ',') || (*end == '\0')) {
 			max = idx;
-			if (min == RTE_MAX_LCORE)
+			if (min == -1)
 				min = idx;
 			for (idx = min; idx <= max; idx++) {
-				if (cores[idx] == -1) {
-					cores[idx] = count;
-					count++;
+				dup = false;
+				/* Check if this idx is already present */
+				for (i = 0; i < count; i++)
+					if (lcores[i] == idx)
+						dup = true;
+				if (dup)
+					continue;
+				if (count < RTE_MAX_LCORE)
+					lcores[count++] = idx;
+				else {
+					RTE_LOG(ERR, EAL, "Too many lcores provided. Cannot exceed %d\n",
+							RTE_MAX_LCORE);
+					return -1;
 				}
 			}
-			min = RTE_MAX_LCORE;
+			min = -1;
 		} else
 			return -1;
 		corelist = end + 1;
@@ -880,6 +936,21 @@ eal_parse_corelist(const char *corelist, int *cores)
 
 	if (count == 0)
 		return -1;
+
+	if (check_core_list(lcores, count))
+		return -1;
+
+	/*
+	 * Now that we've got a list of cores no longer than
+	 * RTE_MAX_LCORE, and no lcore in that list is greater
+	 * than RTE_MAX_LCORE, populate the cores
+	 * array and return.
+	 */
+	do {
+		count--;
+		cores[lcores[count]] = count;
+	} while (count != 0);
+
 	return 0;
 }
 
-- 
2.17.1


  parent reply	other threads:[~2021-11-03 14:32 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-09 13:45 [dpdk-dev] build: Increase the default value of RTE_MAX_LCORE David Hunt
2021-09-09 13:45 ` [dpdk-dev] [PATCH v1 1/6] build: increase default of max lcores to 512 David Hunt
2021-09-09 14:37   ` Bruce Richardson
2021-09-10  6:51     ` David Marchand
2021-09-10  7:54       ` Bruce Richardson
2021-09-10  8:06         ` David Marchand
2021-09-10  8:24           ` Thomas Monjalon
2021-09-14  9:34             ` David Hunt
2021-09-14 10:00               ` David Marchand
2021-09-14 11:07                 ` David Hunt
2021-09-14 11:29                   ` David Marchand
2021-09-15 12:13                     ` David Hunt
2021-11-17 15:55                   ` Morten Brørup
2021-11-17 19:01                     ` David Hunt
2021-09-15 12:11   ` [dpdk-dev] [PATCH v2] eal: add additional info if lcore exceeds max cores David Hunt
2021-09-16 12:34     ` David Marchand
2021-09-20  9:30       ` David Hunt
2021-09-21 11:50     ` [dpdk-dev] [PATCH v3 1/2] eal: add additional info if core list too long David Hunt
2021-09-21 11:50       ` [dpdk-dev] [PATCH v3 2/2] eal: add additional info if core mask " David Hunt
2021-09-21 12:00         ` Bruce Richardson
2021-09-21 11:57       ` [dpdk-dev] [PATCH v3 1/2] eal: add additional info if core list " Bruce Richardson
2021-09-21 12:04         ` David Hunt
2021-09-21 13:16           ` David Hunt
2021-09-21 13:20             ` Bruce Richardson
2021-09-21 13:51       ` David Marchand
2021-09-21 15:10         ` David Hunt
2021-09-22 12:29       ` [dpdk-dev] [PATCH v4 " David Hunt
2021-09-22 12:29         ` [dpdk-dev] [PATCH v4 2/2] eal: add additional info if core mask " David Hunt
2021-09-23  8:12           ` David Marchand
2021-09-23 10:21             ` David Hunt
2021-09-23  8:11         ` [dpdk-dev] [PATCH v4 1/2] eal: add additional info if core list " David Marchand
2021-09-23  9:47           ` David Hunt
2021-09-23 11:02         ` [dpdk-dev] [PATCH v5 " David Hunt
2021-09-23 11:02           ` [dpdk-dev] [PATCH v5 2/2] eal: add additional info if core mask " David Hunt
2021-11-02 17:45             ` David Marchand
2021-11-03 10:27               ` David Hunt
2021-11-03 10:29                 ` David Marchand
2021-11-03 13:30                 ` David Hunt
2021-11-03 14:32           ` David Hunt [this message]
2021-11-03 14:32             ` [dpdk-dev] [PATCH v6 " David Hunt
2021-11-05 10:50               ` David Marchand
2021-09-09 13:45 ` [dpdk-dev] [PATCH v1 2/6] lib/power: reduce memory footprint of acpi lib David Hunt
2021-09-09 13:45 ` [dpdk-dev] [PATCH v1 3/6] lib/power: reduce memory footprint of pstate lib David Hunt
2021-09-09 13:45 ` [dpdk-dev] [PATCH v1 4/6] lib/power: reduce memory footprint of cppc lib David Hunt
2021-09-09 13:45 ` [dpdk-dev] [PATCH v1 5/6] lib/power: reduce memory footprint of channels David Hunt
2021-09-09 13:45 ` [dpdk-dev] [PATCH v1 6/6] lib/power: switch empty poll to max cores config David Hunt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211103143229.34503-1-david.hunt@intel.com \
    --to=david.hunt@intel.com \
    --cc=bruce.richardson@intel.com \
    --cc=david.marchand@redhat.com \
    --cc=dev@dpdk.org \
    --cc=thomas@monjalon.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.