During lcore scan, find maximum socket ID and store it.

Signed-off-by: Anatoly Burakov <anatoly.bura...@intel.com>
---

Notes:
    v2:
    - checkpatch changes
    - check socket before deciding if the core is not to be used

 lib/librte_eal/common/eal_common_lcore.c  | 37 +++++++++++++++++++++----------
 lib/librte_eal/common/include/rte_eal.h   |  1 +
 lib/librte_eal/common/include/rte_lcore.h |  8 +++++++
 lib/librte_eal/rte_eal_version.map        |  6 +++++
 4 files changed, 40 insertions(+), 12 deletions(-)

diff --git a/lib/librte_eal/common/eal_common_lcore.c 
b/lib/librte_eal/common/eal_common_lcore.c
index 0db1555..c9729a0 100644
--- a/lib/librte_eal/common/eal_common_lcore.c
+++ b/lib/librte_eal/common/eal_common_lcore.c
@@ -57,6 +57,7 @@ rte_eal_cpu_init(void)
        struct rte_config *config = rte_eal_get_configuration();
        unsigned lcore_id;
        unsigned count = 0;
+       unsigned int socket_id, max_socket_id = 0;
 
        /*
         * Parse the maximum set of logical cores, detect the subset of running
@@ -68,6 +69,19 @@ rte_eal_cpu_init(void)
                /* init cpuset for per lcore config */
                CPU_ZERO(&lcore_config[lcore_id].cpuset);
 
+               /* find socket first */
+               socket_id = eal_cpu_socket_id(lcore_id);
+               if (socket_id >= RTE_MAX_NUMA_NODES) {
+#ifdef RTE_EAL_ALLOW_INV_SOCKET_ID
+                       socket_id = 0;
+#else
+                       RTE_LOG(ERR, EAL, "Socket ID (%u) is greater than 
RTE_MAX_NUMA_NODES (%d)\n",
+                                       socket_id, RTE_MAX_NUMA_NODES);
+                       return -1;
+#endif
+               }
+               max_socket_id = RTE_MAX(max_socket_id, socket_id);
+
                /* in 1:1 mapping, record related cpu detected state */
                lcore_config[lcore_id].detected = eal_cpu_detected(lcore_id);
                if (lcore_config[lcore_id].detected == 0) {
@@ -83,18 +97,7 @@ rte_eal_cpu_init(void)
                config->lcore_role[lcore_id] = ROLE_RTE;
                lcore_config[lcore_id].core_role = ROLE_RTE;
                lcore_config[lcore_id].core_id = eal_cpu_core_id(lcore_id);
-               lcore_config[lcore_id].socket_id = eal_cpu_socket_id(lcore_id);
-               if (lcore_config[lcore_id].socket_id >= RTE_MAX_NUMA_NODES) {
-#ifdef RTE_EAL_ALLOW_INV_SOCKET_ID
-                       lcore_config[lcore_id].socket_id = 0;
-#else
-                       RTE_LOG(ERR, EAL, "Socket ID (%u) is greater than "
-                               "RTE_MAX_NUMA_NODES (%d)\n",
-                               lcore_config[lcore_id].socket_id,
-                               RTE_MAX_NUMA_NODES);
-                       return -1;
-#endif
-               }
+               lcore_config[lcore_id].socket_id = socket_id;
                RTE_LOG(DEBUG, EAL, "Detected lcore %u as "
                                "core %u on socket %u\n",
                                lcore_id, lcore_config[lcore_id].core_id,
@@ -108,5 +111,15 @@ rte_eal_cpu_init(void)
                RTE_MAX_LCORE);
        RTE_LOG(INFO, EAL, "Detected %u lcore(s)\n", config->lcore_count);
 
+       config->numa_node_count = max_socket_id + 1;
+       RTE_LOG(INFO, EAL, "Detected %u NUMA nodes\n", config->numa_node_count);
+
        return 0;
 }
+
+unsigned int
+rte_num_sockets(void)
+{
+       const struct rte_config *config = rte_eal_get_configuration();
+       return config->numa_node_count;
+}
diff --git a/lib/librte_eal/common/include/rte_eal.h 
b/lib/librte_eal/common/include/rte_eal.h
index 8e4e71c..5b12914 100644
--- a/lib/librte_eal/common/include/rte_eal.h
+++ b/lib/librte_eal/common/include/rte_eal.h
@@ -83,6 +83,7 @@ enum rte_proc_type_t {
 struct rte_config {
        uint32_t master_lcore;       /**< Id of the master lcore */
        uint32_t lcore_count;        /**< Number of available logical cores. */
+       uint32_t numa_node_count;    /**< Number of detected NUMA nodes. */
        uint32_t service_lcore_count;/**< Number of available service cores. */
        enum rte_lcore_role_t lcore_role[RTE_MAX_LCORE]; /**< State of cores. */
 
diff --git a/lib/librte_eal/common/include/rte_lcore.h 
b/lib/librte_eal/common/include/rte_lcore.h
index c89e6ba..7c72c9e 100644
--- a/lib/librte_eal/common/include/rte_lcore.h
+++ b/lib/librte_eal/common/include/rte_lcore.h
@@ -148,6 +148,14 @@ rte_lcore_index(int lcore_id)
 unsigned rte_socket_id(void);
 
 /**
+ * Return number of physical sockets on the system.
+ * @return
+ *   the number of physical sockets as recognized by EAL
+ *
+ */
+unsigned int rte_num_sockets(void);
+
+/**
  * Get the ID of the physical socket of the specified lcore
  *
  * @param lcore_id
diff --git a/lib/librte_eal/rte_eal_version.map 
b/lib/librte_eal/rte_eal_version.map
index f4f46c1..e086c6e 100644
--- a/lib/librte_eal/rte_eal_version.map
+++ b/lib/librte_eal/rte_eal_version.map
@@ -200,6 +200,12 @@ DPDK_17.11 {
 
 } DPDK_17.08;
 
+DPDK_18.02 {
+       global:
+
+       rte_num_sockets;
+} DPDK_17.11;
+
 EXPERIMENTAL {
        global:
 
-- 
2.7.4

Reply via email to