]> git.droids-corp.org - dpdk.git/commitdiff
eal: provide API for querying valid socket ids
authorAnatoly Burakov <anatoly.burakov@intel.com>
Sat, 31 Mar 2018 17:08:13 +0000 (18:08 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Wed, 4 Apr 2018 22:27:13 +0000 (00:27 +0200)
During lcore scan, find all socket ID's and store them, and
provide public API to query valid socket id's. This will break
the ABI, so bump ABI version.

Also, remove deprecation notice corresponding to this change.

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Gowrishankar Muthukrishnan <gowrishankar.m@linux.vnet.ibm.com>
doc/guides/rel_notes/deprecation.rst
doc/guides/rel_notes/release_18_05.rst
lib/librte_eal/bsdapp/eal/Makefile
lib/librte_eal/common/eal_common_lcore.c
lib/librte_eal/common/include/rte_eal.h
lib/librte_eal/common/include/rte_lcore.h
lib/librte_eal/linuxapp/eal/Makefile
lib/librte_eal/meson.build
lib/librte_eal/rte_eal_version.map

index 0c696f743995899a0df33749a59658ec32cca15d..ec70b5fa909af370ea55728c33d6b51a56bb93ca 100644 (file)
@@ -38,9 +38,6 @@ Deprecation Notices
   success and failure, respectively.  This will change to 1 and 0 for true and
   false, respectively, to make use of the function more intuitive.
 
-* eal: new ``numa_node_count`` member will be added to ``rte_config`` structure
-  in v18.05.
-
 * eal: due to internal data layout reorganization, there will be changes to
   several structures and functions as a result of coming changes to support
   memory hotplug in v18.05.
index 04ff4feea5bf61172eb087debe097461d5e245d6..e5fac1cd1c7df1d26bdc9d6939420e09d11102a7 100644 (file)
@@ -145,7 +145,7 @@ The libraries prepended with a plus sign were incremented in this version.
    + librte_common_octeontx.so.1
      librte_cryptodev.so.4
      librte_distributor.so.1
-     librte_eal.so.6
+   + librte_eal.so.7
    + librte_ethdev.so.9
      librte_eventdev.so.3
      librte_flow_classify.so.1
index dd455e671bfc873a8290f5016419cbf5be3dd59a..ed1d17b44216c4347e5e45dad68b563a75f8d3fa 100644 (file)
@@ -21,7 +21,7 @@ LDLIBS += -lgcc_s
 
 EXPORT_MAP := ../../rte_eal_version.map
 
-LIBABIVER := 6
+LIBABIVER := 7
 
 # specific to bsdapp exec-env
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) := eal.c
index 7724fa43342e0e6108520993779221ff09514615..3167e9d79667219b555de082221775bf0a65cf5a 100644 (file)
@@ -7,6 +7,7 @@
 #include <string.h>
 #include <dirent.h>
 
+#include <rte_errno.h>
 #include <rte_log.h>
 #include <rte_eal.h>
 #include <rte_lcore.h>
 #include "eal_private.h"
 #include "eal_thread.h"
 
+static int
+socket_id_cmp(const void *a, const void *b)
+{
+       const int *lcore_id_a = a;
+       const int *lcore_id_b = b;
+
+       if (*lcore_id_a < *lcore_id_b)
+               return -1;
+       if (*lcore_id_a > *lcore_id_b)
+               return 1;
+       return 0;
+}
+
 /*
  * Parse /sys/devices/system/cpu to get the number of physical and logical
  * processors on the machine. The function will fill the cpu_info
@@ -28,6 +42,8 @@ rte_eal_cpu_init(void)
        struct rte_config *config = rte_eal_get_configuration();
        unsigned lcore_id;
        unsigned count = 0;
+       unsigned int socket_id, prev_socket_id;
+       int lcore_to_socket_id[RTE_MAX_LCORE];
 
        /*
         * Parse the maximum set of logical cores, detect the subset of running
@@ -39,6 +55,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
+               }
+               lcore_to_socket_id[lcore_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) {
@@ -54,18 +83,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,
@@ -79,5 +97,38 @@ rte_eal_cpu_init(void)
                RTE_MAX_LCORE);
        RTE_LOG(INFO, EAL, "Detected %u lcore(s)\n", config->lcore_count);
 
+       /* sort all socket id's in ascending order */
+       qsort(lcore_to_socket_id, RTE_DIM(lcore_to_socket_id),
+                       sizeof(lcore_to_socket_id[0]), socket_id_cmp);
+
+       prev_socket_id = -1;
+       config->numa_node_count = 0;
+       for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
+               socket_id = lcore_to_socket_id[lcore_id];
+               if (socket_id != prev_socket_id)
+                       config->numa_nodes[config->numa_node_count++] =
+                                       socket_id;
+               prev_socket_id = socket_id;
+       }
+       RTE_LOG(INFO, EAL, "Detected %u NUMA nodes\n", config->numa_node_count);
+
        return 0;
 }
+
+unsigned int __rte_experimental
+rte_socket_count(void)
+{
+       const struct rte_config *config = rte_eal_get_configuration();
+       return config->numa_node_count;
+}
+
+int __rte_experimental
+rte_socket_id_by_idx(unsigned int idx)
+{
+       const struct rte_config *config = rte_eal_get_configuration();
+       if (idx >= config->numa_node_count) {
+               rte_errno = EINVAL;
+               return -1;
+       }
+       return config->numa_nodes[idx];
+}
index b804ff529c655bb32f7c674650088e4e95107564..c698b3155c7a125577bf414fced6f9a70ac7ee49 100644 (file)
@@ -57,6 +57,8 @@ 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 numa_nodes[RTE_MAX_NUMA_NODES]; /**< List 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. */
 
index 047222030f2b08644902c2fe58ff42fa905d67c4..731297574a18bf4c46927b9f34e63707ad02575e 100644 (file)
@@ -131,6 +131,36 @@ rte_lcore_index(int lcore_id)
  */
 unsigned rte_socket_id(void);
 
+/**
+ * Return number of physical sockets detected on the system.
+ *
+ * Note that number of nodes may not be correspondent to their physical id's:
+ * for example, a system may report two socket id's, but the actual socket id's
+ * may be 0 and 8.
+ *
+ * @return
+ *   the number of physical sockets as recognized by EAL
+ */
+unsigned int __rte_experimental
+rte_socket_count(void);
+
+/**
+ * Return socket id with a particular index.
+ *
+ * This will return socket id at a particular position in list of all detected
+ * physical socket id's. For example, on a machine with sockets [0, 8], passing
+ * 1 as a parameter will return 8.
+ *
+ * @param idx
+ *   index of physical socket id to return
+ *
+ * @return
+ *   - physical socket id as recognized by EAL
+ *   - -1 on error, with errno set to EINVAL
+ */
+int __rte_experimental
+rte_socket_id_by_idx(unsigned int idx);
+
 /**
  * Get the ID of the physical socket of the specified lcore
  *
index 7e5bbe8898f2af914106d19c01b1368dd3b09c4a..b9c7727c8eae31ecbb75f1c4552a68b40e4b238d 100644 (file)
@@ -10,7 +10,7 @@ ARCH_DIR ?= $(RTE_ARCH)
 EXPORT_MAP := ../../rte_eal_version.map
 VPATH += $(RTE_SDK)/lib/librte_eal/common/arch/$(ARCH_DIR)
 
-LIBABIVER := 6
+LIBABIVER := 7
 
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
index 15d1c6afd305c88a8e716313778e57f60d26dc07..4aa63e3d0bb539535b9650a88e308e84205947e2 100644 (file)
@@ -21,7 +21,7 @@ else
        error('unsupported system type @0@'.format(hostmachine.system()))
 endif
 
-version = 6  # the version of the EAL API
+version = 7  # the version of the EAL API
 allow_experimental_apis = true
 deps += 'compat'
 cflags += '-D_GNU_SOURCE'
index 82999462690ef3232b6ed6081a8e57f42fbdd4b2..dd38783a2cd503173a310871be7d8782410b9ddf 100644 (file)
@@ -256,5 +256,7 @@ EXPERIMENTAL {
        rte_service_set_runstate_mapped_check;
        rte_service_set_stats_enable;
        rte_service_start_with_defaults;
+       rte_socket_count;
+       rte_socket_id_by_idx;
 
 } DPDK_18.02;