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