The CPU init function did extra work in zeroing the runtime config for
lcores, something that was being done a second time in configuring the
argparsing stage when preparing to set up the correct cpu affinities for
each lcore. Therefore we can remove that unnecessary initialization, and
have the function not make any changes to "runtime_state" but only the
"platform_info".

In the process we can make some other cleanups too:
* remove the limit on the lcore_to_socket_id array, and dynamically
  allocate it to the correct number of present cores.
* with the runtime lcore init gone, we can move the assignment to the
  lcore_to_socket_id into the first loop, allowing us to remove the
  second loop entirely.
* the log message about "skipping" lcores was incorrect for modern DPDK,
  since we no longer have a hard-link between physical core numbers and
  lcore ids. Therefore just report what cores are detected on what
  sockets.

Signed-off-by: Bruce Richardson <[email protected]>
---
 lib/eal/common/eal_common_lcore.c | 92 +++++++++----------------------
 1 file changed, 25 insertions(+), 67 deletions(-)

diff --git a/lib/eal/common/eal_common_lcore.c 
b/lib/eal/common/eal_common_lcore.c
index da33790b06..350329db65 100644
--- a/lib/eal/common/eal_common_lcore.c
+++ b/lib/eal/common/eal_common_lcore.c
@@ -166,18 +166,10 @@ socket_id_cmp(const void *a, const void *b)
 int
 rte_eal_cpu_init(void)
 {
-       /* pointer to global configuration */
        struct rte_config *config = rte_eal_get_configuration();
        struct eal_platform_info *platform_info = eal_get_platform_info();
-       struct eal_runtime_state *runtime_state = eal_get_runtime_state();
-       unsigned lcore_id;
-       unsigned count = 0;
-       unsigned int socket_id, prev_socket_id;
-#if CPU_SETSIZE > RTE_MAX_LCORE
-       int lcore_to_socket_id[CPU_SETSIZE] = {0};
-#else
-       int lcore_to_socket_id[RTE_MAX_LCORE] = {0};
-#endif
+       int *lcore_to_socket_id;
+       size_t nb_detected_cpus = 0;
 
        /* allocate cpu_info for all CPUs visible to the OS */
        platform_info->cpu_count = eal_cpu_max();
@@ -187,6 +179,12 @@ rte_eal_cpu_init(void)
                EAL_LOG(ERR, "Cannot allocate cpu_info array");
                return -1;
        }
+       lcore_to_socket_id = calloc(platform_info->cpu_count, 
sizeof(*lcore_to_socket_id));
+       if (lcore_to_socket_id == NULL) {
+               EAL_LOG(ERR, "Cannot allocate lcore_to_socket_id array");
+               free(platform_info->cpu_info);
+               return -1;
+       }
 
        /* populate cpu_info with hardware topology for all detected CPUs */
        for (size_t cpu_id = 0; cpu_id < platform_info->cpu_count; cpu_id++) {
@@ -195,71 +193,30 @@ rte_eal_cpu_init(void)
                platform_info->cpu_info[cpu_id].detected = true;
                platform_info->cpu_info[cpu_id].numa_id = 
eal_cpu_socket_id(cpu_id);
                platform_info->cpu_info[cpu_id].core_id = 
eal_cpu_core_id(cpu_id);
-       }
-
-       /*
-        * Parse the maximum set of logical cores, detect the subset of running
-        * ones and enable them by default.
-        */
-       for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
-               runtime_state->lcore_cfg[lcore_id].core_index = count;
-
-               /* init cpuset for per lcore config */
-               CPU_ZERO(&runtime_state->lcore_cfg[lcore_id].cpuset);
-               runtime_state->lcore_cfg[lcore_id].first_cpu = UINT16_MAX;
+               /* store numa id for later processing to determine all unique 
numa nodes */
+               lcore_to_socket_id[nb_detected_cpus++] = 
platform_info->cpu_info[cpu_id].numa_id;
 
-               if (eal_cpu_detected(lcore_id) == 0) {
-                       config->lcore_role[lcore_id] = ROLE_OFF;
-                       runtime_state->lcore_cfg[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, &runtime_state->lcore_cfg[lcore_id].cpuset);
-               runtime_state->lcore_cfg[lcore_id].first_cpu = lcore_id;
-
-               /* This is the first time we discover the lcores, so the bitset 
should be zeroed */
-               rte_bitset_set(runtime_state->core_indices, count);
-
-               /* By default, each detected core is enabled */
-               config->lcore_role[lcore_id] = ROLE_RTE;
-               EAL_LOG(DEBUG, "Detected lcore %u as "
-                               "core %u on NUMA node %u",
-                               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;
-               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, platform_info->cpu_info[lcore_id].core_id,
-                       platform_info->cpu_info[lcore_id].numa_id);
+               EAL_LOG(DEBUG, "Detected CPU %zu as core %u on NUMA node %u",
+                               cpu_id,
+                               platform_info->cpu_info[cpu_id].core_id,
+                               platform_info->cpu_info[cpu_id].numa_id);
        }
 
-       /* Set the count of enabled logical cores of the EAL configuration */
-       config->lcore_count = count;
-       EAL_LOG(DEBUG,
-                       "Maximum logical cores by configuration: %u",
-                       RTE_MAX_LCORE);
-       EAL_LOG(INFO, "Detected CPU lcores: %u", config->lcore_count);
+       if (nb_detected_cpus == 0) {
+               EAL_LOG(ERR, "No CPUs detected for platform topology");
+               free(platform_info->cpu_info);
+               free(lcore_to_socket_id);
+               return -1;
+       }
 
        /* sort all socket id's in ascending order */
-       qsort(lcore_to_socket_id, RTE_DIM(lcore_to_socket_id),
+       qsort(lcore_to_socket_id, nb_detected_cpus,
                        sizeof(lcore_to_socket_id[0]), socket_id_cmp);
 
-       prev_socket_id = -1;
+       int prev_socket_id = -1;
        config->numa_node_count = 0;
-       for (lcore_id = 0; lcore_id < RTE_DIM(lcore_to_socket_id); lcore_id++) {
-               socket_id = lcore_to_socket_id[lcore_id];
+       for (size_t i = 0; i < nb_detected_cpus; i++) {
+               int socket_id = lcore_to_socket_id[i];
                if (socket_id != prev_socket_id)
                        config->numa_nodes[config->numa_node_count++] = 
socket_id;
                prev_socket_id = socket_id;
@@ -268,6 +225,7 @@ rte_eal_cpu_init(void)
        }
        EAL_LOG(INFO, "Detected NUMA nodes: %u", config->numa_node_count);
 
+       free(lcore_to_socket_id);
        return 0;
 }
 
-- 
2.53.0

Reply via email to