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

