Hi Harry,

> -----Original Message-----
> From: dev [mailto:dev-boun...@dpdk.org] On Behalf Of Harry van Haaren
> Sent: Monday, July 17, 2017 4:22 PM
> To: dev@dpdk.org
> Cc: tho...@monjalon.net; jerin.ja...@caviumnetworks.com; Van Haaren, Harry 
> <harry.van.haa...@intel.com>
> Subject: [dpdk-dev] [PATCH] service: add corelist to EAL arguments
> 
> 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.ja...@caviumnetworks.com>
> Suggested-by: Thomas Monjalon <tho...@monjalon.net>
> Signed-off-by: Harry van Haaren <harry.van.haa...@intel.com>
> ---
>  lib/librte_eal/common/eal_common_options.c | 74 
> ++++++++++++++++++++++++++++++
>  1 file changed, 74 insertions(+)
> 
> diff --git a/lib/librte_eal/common/eal_common_options.c 
> b/lib/librte_eal/common/eal_common_options.c
> index 00265d6..696a627 100644
> --- a/lib/librte_eal/common/eal_common_options.c
> +++ b/lib/librte_eal/common/eal_common_options.c
> @@ -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 */
> @@ -402,6 +403,72 @@ eal_parse_coremask(const char *coremask)
>  }
> 

Do we need a new parsing function here?
Can't we reuse at least part of '-l' parsing code?
Konstantin

>  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)
>  {
>       struct rte_config *cfg = rte_eal_get_configuration();
> @@ -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);
> --
> 2.7.4

Reply via email to