service: add -S corelist option

This commit allows the -S (captial 's') to be used to indicate
a corelist for Services. This is a "nice to have" patch, and does
not modify any of the service core functionality.

Suggested-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
Suggested-by: Thomas Monjalon <thomas@monjalon.net>
Signed-off-by: Harry van Haaren <harry.van.haaren@intel.com>
This commit is contained in:
Harry van Haaren 2017-07-17 16:21:54 +01:00 committed by Thomas Monjalon
parent b4d75d98f5
commit 7dbd7a6413

View File

@ -65,6 +65,7 @@ eal_short_options[] =
"d:" /* driver */
"h" /* help */
"l:" /* corelist */
"S:" /* service corelist */
"m:" /* memory size */
"n:" /* memory channels */
"r:" /* memory ranks */
@ -401,6 +402,72 @@ eal_parse_coremask(const char *coremask)
return 0;
}
static int
eal_parse_service_corelist(const char *corelist)
{
struct rte_config *cfg = rte_eal_get_configuration();
int i, idx = 0;
unsigned count = 0;
char *end = NULL;
int min, max;
if (corelist == NULL)
return -1;
/* Remove all blank characters ahead and after */
while (isblank(*corelist))
corelist++;
i = strlen(corelist);
while ((i > 0) && isblank(corelist[i - 1]))
i--;
/* Get list of cores */
min = RTE_MAX_LCORE;
do {
while (isblank(*corelist))
corelist++;
if (*corelist == '\0')
return -1;
errno = 0;
idx = strtoul(corelist, &end, 10);
if (errno || end == NULL)
return -1;
while (isblank(*end))
end++;
if (*end == '-') {
min = idx;
} else if ((*end == ',') || (*end == '\0')) {
max = idx;
if (min == RTE_MAX_LCORE)
min = idx;
for (idx = min; idx <= max; idx++) {
if (cfg->lcore_role[idx] != ROLE_SERVICE) {
/* handle master lcore already parsed */
uint32_t lcore = idx;
if (cfg->master_lcore == lcore &&
master_lcore_parsed) {
RTE_LOG(ERR, EAL,
"Error: lcore %u is master lcore, cannot use as service core\n",
idx);
return -1;
}
lcore_config[idx].core_role =
ROLE_SERVICE;
count++;
}
}
min = RTE_MAX_LCORE;
} else
return -1;
corelist = end + 1;
} while (*end != '\0');
if (count == 0)
return -1;
return 0;
}
static int
eal_parse_corelist(const char *corelist)
{
@ -912,6 +979,13 @@ eal_parse_common_option(int opt, const char *optarg,
return -1;
}
break;
/* service corelist */
case 'S':
if (eal_parse_service_corelist(optarg) < 0) {
RTE_LOG(ERR, EAL, "invalid service core list\n");
return -1;
}
break;
/* size of memory */
case 'm':
conf->memory = atoi(optarg);