On Mon, Mar 24, 2025 at 6:31 PM Bruce Richardson
<bruce.richard...@intel.com> wrote:
>
> Rather than parsing the lcore parameters as they are encountered, just
> save off the lcore parameters and then parse them at the end. This
> allows better knowledge of what parameters are available or not when
> parsing.
>
> Signed-off-by: Bruce Richardson <bruce.richard...@intel.com>
> ---
>  lib/eal/common/eal_common_options.c | 183 +++++++++++++---------------
>  1 file changed, 84 insertions(+), 99 deletions(-)
>
> diff --git a/lib/eal/common/eal_common_options.c 
> b/lib/eal/common/eal_common_options.c
> index 79db9a47dd..55c49a923f 100644
> --- a/lib/eal/common/eal_common_options.c
> +++ b/lib/eal/common/eal_common_options.c
> @@ -151,7 +151,13 @@ TAILQ_HEAD_INITIALIZER(devopt_list);
>
>  static int main_lcore_parsed;
>  static int mem_parsed;
> -static int core_parsed;
> +static struct lcore_options {
> +       const char *core_mask_opt;
> +       const char *core_list_opt;
> +       const char *core_map_opt;
> +       const char *service_mask_opt;
> +       const char *service_list_opt;
> +} lcore_options = {0};

eal_parse_main_lcore() still checks if selected main lcore is a
service lcore. I think this check is useless now.


>
>  /* Allow the application to print its usage message too if set */
>  static rte_usage_hook_t rte_application_usage_hook;
> @@ -674,7 +680,7 @@ eal_parse_service_coremask(const char *coremask)
>         if (count == 0)
>                 return -1;
>
> -       if (core_parsed && taken_lcore_count != count) {
> +       if (taken_lcore_count != count) {
>                 EAL_LOG(WARNING,
>                         "Not all service cores are in the coremask. "
>                         "Please ensure -c or -l includes service cores");
> @@ -684,17 +690,6 @@ eal_parse_service_coremask(const char *coremask)
>         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
>  update_lcore_config(int *cores)
>  {
> @@ -903,7 +898,7 @@ eal_parse_service_corelist(const char *corelist)
>         if (count == 0)
>                 return -1;
>
> -       if (core_parsed && taken_lcore_count != count) {
> +       if (taken_lcore_count != count) {
>                 EAL_LOG(WARNING,
>                         "Not all service cores were in the coremask. "
>                         "Please ensure -c or -l includes service cores");
> @@ -1673,83 +1668,20 @@ eal_parse_common_option(int opt, const char *optarg,
>                 a_used = 1;
>                 break;
>         /* coremask */
> -       case 'c': {
> -               int lcore_indexes[RTE_MAX_LCORE];
> -
> -               if (eal_service_cores_parsed())
> -                       EAL_LOG(WARNING,
> -                               "Service cores parsed before dataplane cores. 
> Please ensure -c is before -s or -S");
> -               if (rte_eal_parse_coremask(optarg, lcore_indexes) < 0) {
> -                       EAL_LOG(ERR, "invalid coremask syntax");
> -                       return -1;
> -               }
> -               if (update_lcore_config(lcore_indexes) < 0) {
> -                       char *available = available_cores();
> -
> -                       EAL_LOG(ERR,
> -                               "invalid coremask, please check specified 
> cores are part of %s",
> -                               available);
> -                       free(available);
> -                       return -1;
> -               }
> -
> -               if (core_parsed) {
> -                       EAL_LOG(ERR, "Option -c is ignored, because (%s) is 
> set!",
> -                               (core_parsed == LCORE_OPT_LST) ? "-l" :
> -                               (core_parsed == LCORE_OPT_MAP) ? "--lcores" :
> -                               "-c");
> -                       return -1;
> -               }
> -
> -               core_parsed = LCORE_OPT_MSK;
> +       case 'c':
> +               lcore_options.core_mask_opt = optarg;
>                 break;
> -       }
>         /* corelist */
> -       case 'l': {
> -               int lcore_indexes[RTE_MAX_LCORE];
> -
> -               if (eal_service_cores_parsed())
> -                       EAL_LOG(WARNING,
> -                               "Service cores parsed before dataplane cores. 
> Please ensure -l is before -s or -S");
> -
> -               if (eal_parse_corelist(optarg, lcore_indexes) < 0) {
> -                       EAL_LOG(ERR, "invalid core list syntax");
> -                       return -1;
> -               }
> -               if (update_lcore_config(lcore_indexes) < 0) {
> -                       char *available = available_cores();
> -
> -                       EAL_LOG(ERR,
> -                               "invalid core list, please check specified 
> cores are part of %s",
> -                               available);
> -                       free(available);
> -                       return -1;
> -               }
> -
> -               if (core_parsed) {
> -                       EAL_LOG(ERR, "Option -l is ignored, because (%s) is 
> set!",
> -                               (core_parsed == LCORE_OPT_MSK) ? "-c" :
> -                               (core_parsed == LCORE_OPT_MAP) ? "--lcores" :
> -                               "-l");
> -                       return -1;
> -               }
> -
> -               core_parsed = LCORE_OPT_LST;
> +       case 'l':
> +               lcore_options.core_list_opt = optarg;
>                 break;
> -       }
>         /* service coremask */
>         case 's':
> -               if (eal_parse_service_coremask(optarg) < 0) {
> -                       EAL_LOG(ERR, "invalid service coremask");
> -                       return -1;
> -               }
> +               lcore_options.service_mask_opt = optarg;
>                 break;
>         /* service corelist */
>         case 'S':
> -               if (eal_parse_service_corelist(optarg) < 0) {
> -                       EAL_LOG(ERR, "invalid service core list");
> -                       return -1;
> -               }
> +               lcore_options.service_list_opt = optarg;
>                 break;
>         /* size of memory */
>         case 'm':
> @@ -1918,21 +1850,7 @@ eal_parse_common_option(int opt, const char *optarg,
>  #endif /* !RTE_EXEC_ENV_WINDOWS */
>
>         case OPT_LCORES_NUM:
> -               if (eal_parse_lcores(optarg) < 0) {
> -                       EAL_LOG(ERR, "invalid parameter for --"
> -                               OPT_LCORES);
> -                       return -1;
> -               }
> -
> -               if (core_parsed) {
> -                       EAL_LOG(ERR, "Option --lcores is ignored, because 
> (%s) is set!",
> -                               (core_parsed == LCORE_OPT_LST) ? "-l" :
> -                               (core_parsed == LCORE_OPT_MSK) ? "-c" :
> -                               "--lcores");
> -                       return -1;
> -               }
> -
> -               core_parsed = LCORE_OPT_MAP;
> +               lcore_options.core_map_opt = optarg;
>                 break;
>         case OPT_LEGACY_MEM_NUM:
>                 conf->legacy_mem = 1;
> @@ -1973,6 +1891,7 @@ eal_parse_common_option(int opt, const char *optarg,
>
>         }
>
> +

Unneeded empty line.

>         return 0;
>
>  ba_conflict:
> @@ -2046,8 +1965,74 @@ eal_adjust_config(struct internal_config *internal_cfg)
>         struct internal_config *internal_conf =
>                 eal_get_internal_configuration();
>
> -       if (!core_parsed)
> +       /* handle all the various core options, ignoring order of them.

Handle

> +        * First check that multiple lcore options (coremask, corelist, 
> coremap) are
> +        * not used together. Then check that the service options (coremask, 
> corelist)
> +        * are not both set. In both cases error out if multiple options are 
> set.
> +        */
> +       if ((lcore_options.core_mask_opt && lcore_options.core_list_opt) ||
> +                       (lcore_options.core_mask_opt && 
> lcore_options.core_map_opt) ||
> +                       (lcore_options.core_list_opt && 
> lcore_options.core_map_opt)) {
> +               EAL_LOG(ERR, "Only one of -c, -l and --"OPT_LCORES" may be 
> given at a time");
> +               return -1;
> +       }
> +       if ((lcore_options.service_mask_opt && 
> lcore_options.service_list_opt)) {
> +               EAL_LOG(ERR, "Only one of -s and -S may be given at a time");
> +               return -1;
> +       }
> +
> +       if (lcore_options.core_mask_opt) {
> +               int lcore_indexes[RTE_MAX_LCORE];
> +
> +               if (rte_eal_parse_coremask(lcore_options.core_mask_opt, 
> lcore_indexes) < 0) {
> +                       EAL_LOG(ERR, "invalid coremask syntax");
> +                       return -1;
> +               }
> +               if (update_lcore_config(lcore_indexes) < 0) {
> +                       char *available = available_cores();
> +
> +                       EAL_LOG(ERR,
> +                               "invalid coremask, please check specified 
> cores are part of %s",
> +                               available);
> +                       free(available);
> +                       return -1;
> +               }
> +       } else if (lcore_options.core_list_opt) {
> +               int lcore_indexes[RTE_MAX_LCORE];
> +
> +               if (eal_parse_corelist(lcore_options.core_list_opt, 
> lcore_indexes) < 0) {
> +                       EAL_LOG(ERR, "invalid core list syntax");
> +                       return -1;
> +               }
> +               if (update_lcore_config(lcore_indexes) < 0) {
> +                       char *available = available_cores();
> +
> +                       EAL_LOG(ERR,
> +                               "invalid core list, please check specified 
> cores are part of %s",
> +                               available);
> +                       free(available);
> +                       return -1;
> +               }
> +       } else if (lcore_options.core_map_opt) {
> +               if (eal_parse_lcores(lcore_options.core_map_opt) < 0) {
> +                       EAL_LOG(ERR, "invalid parameter for --" OPT_LCORES);
> +                       return -1;
> +               }
> +       } else {
>                 eal_auto_detect_cores(cfg);
> +       }
> +
> +       if (lcore_options.service_mask_opt) {
> +               if 
> (eal_parse_service_coremask(lcore_options.service_mask_opt) < 0) {
> +                       EAL_LOG(ERR, "invalid service coremask");
> +                       return -1;
> +               }
> +       } else if (lcore_options.service_list_opt) {
> +               if 
> (eal_parse_service_corelist(lcore_options.service_list_opt) < 0) {
> +                       EAL_LOG(ERR, "invalid service core list");
> +                       return -1;
> +               }
> +       }
>
>         if (internal_conf->process_type == RTE_PROC_AUTO)
>                 internal_conf->process_type = eal_proc_type_detect();
> --
> 2.45.2
>


-- 
David Marchand

Reply via email to