The existing "available_cores" function in eal_common_options.c has general code for converting a set of cores to a printable string. Generalize this code into an "eal_cpuset_to_str" function which takes a cpuset as parameter, and create a new "available_cores" function using this new utility function.
Signed-off-by: Bruce Richardson <bruce.richard...@intel.com> --- lib/eal/common/eal_common_options.c | 33 ++++++++++++++++++++++------- lib/eal/common/eal_private.h | 10 +++++++++ 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/lib/eal/common/eal_common_options.c b/lib/eal/common/eal_common_options.c index d7a8263f08..e89ca615b8 100644 --- a/lib/eal/common/eal_common_options.c +++ b/lib/eal/common/eal_common_options.c @@ -1570,8 +1570,8 @@ eal_parse_base_virtaddr(const char *arg) } /* caller is responsible for freeing the returned string */ -static char * -available_cores(void) +char * +eal_cpuset_to_str(const rte_cpuset_t *cpuset) { char *str = NULL; int previous; @@ -1579,13 +1579,13 @@ available_cores(void) char *tmp; int idx; - /* find the first available cpu */ - for (idx = 0; idx < RTE_MAX_LCORE; idx++) { - if (eal_cpu_detected(idx) == 0) + /* find the first set cpu */ + for (idx = 0; idx < CPU_SETSIZE; idx++) { + if (!CPU_ISSET(idx, cpuset)) continue; break; } - if (idx >= RTE_MAX_LCORE) + if (idx >= CPU_SETSIZE) return NULL; /* first sequence */ @@ -1594,8 +1594,8 @@ available_cores(void) previous = idx; sequence = 0; - for (idx++ ; idx < RTE_MAX_LCORE; idx++) { - if (eal_cpu_detected(idx) == 0) + for (idx++ ; idx < CPU_SETSIZE; idx++) { + if (!CPU_ISSET(idx, cpuset)) continue; if (idx == previous + 1) { @@ -1638,6 +1638,23 @@ available_cores(void) return str; } +/* caller is responsible for freeing the returned string */ +static char * +available_cores(void) +{ + rte_cpuset_t cpuset; + int idx; + + /* build cpuset of available cores */ + CPU_ZERO(&cpuset); + for (idx = 0; idx < RTE_MAX_LCORE; idx++) { + if (eal_cpu_detected(idx)) + CPU_SET(idx, &cpuset); + } + + return eal_cpuset_to_str(&cpuset); +} + #define HUGE_UNLINK_NEVER "never" static int diff --git a/lib/eal/common/eal_private.h b/lib/eal/common/eal_private.h index ab8b37b956..e032dd10c9 100644 --- a/lib/eal/common/eal_private.h +++ b/lib/eal/common/eal_private.h @@ -83,6 +83,16 @@ struct rte_config *rte_eal_get_configuration(void); */ int eal_collate_args(int argc, char **argv); +/** + * Convert an rte_cpuset_t to string form suitable for parsing by argparse. + * + * @param cpuset + * The cpuset to convert to string form. + * @return + * String representation of the cpuset (caller must free), or NULL on error. + */ +char *eal_cpuset_to_str(const rte_cpuset_t *cpuset); + /** * Initialize the memzone subsystem (private to eal). * -- 2.48.1