Rather than storing the lcore and numa fields in the lcore_config
structure - which is a structure indexed by logical core id, rather than
physical cpu - use the platform info struct as the one source of truth
for cpu topology info.

Signed-off-by: Bruce Richardson <[email protected]>
---
 lib/eal/common/eal_common_lcore.c  | 42 ++++++++++++++++--------
 lib/eal/common/eal_common_thread.c | 51 +++++++++---------------------
 lib/eal/common/eal_private.h       |  2 --
 3 files changed, 43 insertions(+), 52 deletions(-)

diff --git a/lib/eal/common/eal_common_lcore.c 
b/lib/eal/common/eal_common_lcore.c
index d8cc5e1a91..ba3a0c8a92 100644
--- a/lib/eal/common/eal_common_lcore.c
+++ b/lib/eal/common/eal_common_lcore.c
@@ -50,6 +50,9 @@ int rte_lcore_index(int lcore_id)
 RTE_EXPORT_SYMBOL(rte_lcore_to_cpu_id)
 int rte_lcore_to_cpu_id(int lcore_id)
 {
+       const struct eal_platform_info *platform_info = eal_get_platform_info();
+       unsigned int cpu;
+
        if (unlikely(lcore_id >= RTE_MAX_LCORE))
                return -1;
 
@@ -60,7 +63,11 @@ int rte_lcore_to_cpu_id(int lcore_id)
                lcore_id = (int)rte_lcore_id();
        }
 
-       return lcore_config[lcore_id].core_id;
+       for (cpu = 0; cpu < CPU_SETSIZE && cpu < platform_info->cpu_count; 
cpu++) {
+               if (CPU_ISSET(cpu, &lcore_config[lcore_id].cpuset))
+                       return (int)platform_info->cpu_info[cpu].core_id;
+       }
+       return -1;
 }
 
 RTE_EXPORT_SYMBOL(rte_lcore_cpuset)
@@ -126,7 +133,14 @@ RTE_EXPORT_SYMBOL(rte_lcore_to_socket_id)
 unsigned int
 rte_lcore_to_socket_id(unsigned int lcore_id)
 {
-       return lcore_config[lcore_id].numa_id;
+       const struct eal_platform_info *platform_info = eal_get_platform_info();
+       unsigned int cpu;
+
+       for (cpu = 0; cpu < CPU_SETSIZE && cpu < platform_info->cpu_count; 
cpu++) {
+               if (CPU_ISSET(cpu, &lcore_config[lcore_id].cpuset))
+                       return platform_info->cpu_info[cpu].numa_id;
+       }
+       return 0;
 }
 
 static int
@@ -190,38 +204,38 @@ 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);
-               lcore_to_socket_id[lcore_id] = socket_id;
-
                if (eal_cpu_detected(lcore_id) == 0) {
                        config->lcore_role[lcore_id] = ROLE_OFF;
                        lcore_config[lcore_id].core_index = -1;
                        continue;
                }
 
+               /* find socket first */
+               socket_id = platform_info->cpu_info[lcore_id].numa_id;
+               lcore_to_socket_id[lcore_id] = socket_id;
+
                /* By default, lcore 1:1 map to cpu id */
                CPU_SET(lcore_id, &lcore_config[lcore_id].cpuset);
 
                /* By default, each detected core is enabled */
                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].numa_id = socket_id;
                EAL_LOG(DEBUG, "Detected lcore %u as "
                                "core %u on NUMA node %u",
-                               lcore_id, lcore_config[lcore_id].core_id,
-                               lcore_config[lcore_id].numa_id);
+                               lcore_id,
+                               platform_info->cpu_info[lcore_id].core_id,
+                               platform_info->cpu_info[lcore_id].numa_id);
                count++;
        }
        for (; lcore_id < CPU_SETSIZE; lcore_id++) {
                if (eal_cpu_detected(lcore_id) == 0)
                        continue;
-               socket_id = eal_cpu_socket_id(lcore_id);
-               lcore_to_socket_id[lcore_id] = socket_id;
+               if (unlikely(lcore_id >= platform_info->cpu_count))
+                       break;
+               lcore_to_socket_id[lcore_id] = 
platform_info->cpu_info[lcore_id].numa_id;
                EAL_LOG(DEBUG, "Skipped lcore %u as core %u on NUMA node %u",
-                       lcore_id, eal_cpu_core_id(lcore_id),
-                       socket_id);
+                       lcore_id, platform_info->cpu_info[lcore_id].core_id,
+                       platform_info->cpu_info[lcore_id].numa_id);
        }
 
        /* Set the count of enabled logical cores of the EAL configuration */
diff --git a/lib/eal/common/eal_common_thread.c 
b/lib/eal/common/eal_common_thread.c
index c2e7315bf4..774344013d 100644
--- a/lib/eal/common/eal_common_thread.c
+++ b/lib/eal/common/eal_common_thread.c
@@ -37,52 +37,31 @@ unsigned rte_socket_id(void)
        return RTE_PER_LCORE(_numa_id);
 }
 
-static int
-eal_cpuset_socket_id(rte_cpuset_t *cpusetp)
-{
-       unsigned cpu = 0;
-       int socket_id = SOCKET_ID_ANY;
-       int sid;
-
-       if (cpusetp == NULL)
-               return SOCKET_ID_ANY;
-
-       do {
-               if (!CPU_ISSET(cpu, cpusetp))
-                       continue;
-
-               if (socket_id == SOCKET_ID_ANY)
-                       socket_id = eal_cpu_socket_id(cpu);
-
-               sid = eal_cpu_socket_id(cpu);
-               if (socket_id != sid) {
-                       socket_id = SOCKET_ID_ANY;
-                       break;
-               }
-
-       } while (++cpu < CPU_SETSIZE);
-
-       return socket_id;
-}
-
 static void
 thread_update_affinity(rte_cpuset_t *cpusetp)
 {
        unsigned int lcore_id = rte_lcore_id();
 
-       /* store numa_id in TLS for quick access */
-       RTE_PER_LCORE(_numa_id) =
-               eal_cpuset_socket_id(cpusetp);
-
        /* store cpuset in TLS for quick access */
-       memmove(&RTE_PER_LCORE(_cpuset), cpusetp,
-               sizeof(rte_cpuset_t));
+       memmove(&RTE_PER_LCORE(_cpuset), cpusetp, sizeof(rte_cpuset_t));
 
        if (lcore_id != (unsigned)LCORE_ID_ANY) {
-               /* EAL thread will update lcore_config */
-               lcore_config[lcore_id].numa_id = RTE_PER_LCORE(_numa_id);
+               /* EAL thread: update lcore_config cpuset first then find numa 
based on that */
                memmove(&lcore_config[lcore_id].cpuset, cpusetp,
                        sizeof(rte_cpuset_t));
+               RTE_PER_LCORE(_numa_id) = rte_lcore_to_socket_id(lcore_id);
+       } else {
+               /* Non-EAL thread: derive NUMA node from first CPU in cpuset. */
+               const struct eal_platform_info *platform_info = 
eal_get_platform_info();
+               unsigned int cpu;
+
+               RTE_PER_LCORE(_numa_id) = SOCKET_ID_ANY;
+               for (cpu = 0; cpu < CPU_SETSIZE  && cpu < 
platform_info->cpu_count; cpu++) {
+                       if (CPU_ISSET(cpu, cpusetp)) {
+                               RTE_PER_LCORE(_numa_id) = 
platform_info->cpu_info[cpu].numa_id;
+                               break;
+                       }
+               }
        }
 }
 
diff --git a/lib/eal/common/eal_private.h b/lib/eal/common/eal_private.h
index 00a73a9d61..48569f2ed7 100644
--- a/lib/eal/common/eal_private.h
+++ b/lib/eal/common/eal_private.h
@@ -30,8 +30,6 @@ struct lcore_config {
        volatile int ret;          /**< return value of function */
 
        volatile RTE_ATOMIC(enum rte_lcore_state_t) state; /**< lcore state */
-       unsigned int numa_id;      /**< NUMA node ID for this lcore */
-       unsigned int core_id;      /**< core number on socket for this lcore */
        int core_index;            /**< relative index, starting from 0 */
        uint8_t core_role;         /**< role of core eg: OFF, RTE, SERVICE */
 
-- 
2.51.0

Reply via email to