DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] eal/service: improve error checking of coremasks
@ 2018-05-15 14:52 Harry van Haaren
  2018-05-15 15:38 ` Thomas Monjalon
  2018-05-15 15:56 ` [dpdk-dev] [PATCH v2] " Harry van Haaren
  0 siblings, 2 replies; 13+ messages in thread
From: Harry van Haaren @ 2018-05-15 14:52 UTC (permalink / raw)
  To: dev; +Cc: Harry van Haaren, thomas, vipin.varghese

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 <vipin.varghese@intel.com>
Signed-off-by: Harry van Haaren <harry.van.haaren@intel.com>

---

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 | 39 ++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
index ecebb29..b6b569f 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,27 @@ 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 - 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 +408,10 @@ 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. Ensure -c is before -s or -S.\n");
+
 	if (coremask == NULL)
 		return -1;
 	/* Remove all blank characters ahead and after .
@@ -418,6 +443,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 +475,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 +517,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 +534,11 @@ 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 - ensure -c or -l includes service cores\n");
+	}
+
 	return 0;
 }
 
@@ -516,6 +551,10 @@ 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. Ensure -l is before -s or -S.\n");
+
 	if (corelist == NULL)
 		return -1;
 
-- 
2.7.4

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2018-07-26 16:40 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-15 14:52 [dpdk-dev] [PATCH] eal/service: improve error checking of coremasks Harry van Haaren
2018-05-15 15:38 ` Thomas Monjalon
2018-05-15 15:56 ` [dpdk-dev] [PATCH v2] " Harry van Haaren
2018-05-21  9:41   ` Varghese, Vipin
2018-07-12  7:35     ` Thomas Monjalon
2018-07-13 17:27       ` Van Haaren, Harry
2018-07-13 17:25   ` [dpdk-dev] [PATCH v3] " Harry van Haaren
2018-07-13 17:33     ` Thomas Monjalon
2018-07-26 14:18       ` Thomas Monjalon
2018-07-13 17:45     ` Varghese, Vipin
2018-07-26 16:16     ` [dpdk-dev] [PATCH v4] " Harry van Haaren
2018-07-26 16:31       ` [dpdk-dev] [PATCH v5] " Harry van Haaren
2018-07-26 16:40         ` Thomas Monjalon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).