service: add -S corelist option
authorHarry van Haaren <harry.van.haaren@intel.com>
Mon, 17 Jul 2017 15:21:54 +0000 (16:21 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Wed, 19 Jul 2017 05:42:48 +0000 (08:42 +0300)
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>
lib/librte_eal/common/eal_common_options.c

index 00265d6..696a627 100644 (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);