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

Reply via email to