From: Ivan Boule Date: Fri, 8 Feb 2013 12:01:52 +0000 (+0100) Subject: eal: fix recording of detected/enabled logical cores X-Git-Tag: spdx-start~10973 X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=f563a3727b5dba05b2d5d641516ee99d3d534a93;p=dpdk.git eal: fix recording of detected/enabled logical cores 1) In the EAL initialization phase, invoke the function rte_eal_cpu_init to detect the set of running cores (and enable them by default) before processing the [enabled] core mask option that is performed during the parsing of EAL arguments. 2) In the function rte_eal_cpu_init(): - to parse the set of all running logical cores on the machine, do not use the RTE_LCORE_FOREACH macro that considers the set of already detected cores... Instead, use a standard loop based on the RTE_MAX_LCORE constant. - explicitely set to ROLE_RTE the role of each detected logical core that is recorded in the EAL configuration, as all running cores are enabled by default. 3) In the function eal_parse_coremask(), update the "lcore_count" field of the EAL configuration with the effective number of logical cores that are set in the mask of enabled logical cores. Signed-off-by: Ivan Boule Acked-by: Thomas Monjalon --- diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c index 9ff2a443e9..b7637e35c0 100644 --- a/lib/librte_eal/linuxapp/eal/eal.c +++ b/lib/librte_eal/linuxapp/eal/eal.c @@ -460,6 +460,8 @@ eal_parse_coremask(const char *coremask) cfg->lcore_role[idx] = ROLE_OFF; if(count == 0) return -1; + /* Update the count of enabled logical cores of the EAL configuration */ + cfg->lcore_count = count; return 0; } @@ -950,6 +952,9 @@ rte_eal_init(int argc, char **argv) if (rte_eal_log_early_init() < 0) rte_panic("Cannot init early logs\n"); + if (rte_eal_cpu_init() < 0) + rte_panic("Cannot detect lcores\n"); + fctret = eal_parse_args(argc, argv); if (fctret < 0) exit(1); @@ -985,9 +990,6 @@ rte_eal_init(int argc, char **argv) if (rte_eal_iopl_init() == 0) rte_config.flags |= EAL_FLG_HIGH_IOPL; - if (rte_eal_cpu_init() < 0) - rte_panic("Cannot detect lcores\n"); - if (rte_eal_pci_init() < 0) rte_panic("Cannot init PCI\n"); diff --git a/lib/librte_eal/linuxapp/eal/eal_lcore.c b/lib/librte_eal/linuxapp/eal/eal_lcore.c index 5eed3ae83d..d310d85830 100644 --- a/lib/librte_eal/linuxapp/eal/eal_lcore.c +++ b/lib/librte_eal/linuxapp/eal/eal_lcore.c @@ -151,15 +151,19 @@ rte_eal_cpu_init(void) unsigned lcore_id; unsigned count = 0; - /* disable lcores that were not detected */ - RTE_LCORE_FOREACH(lcore_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++) { lcore_config[lcore_id].detected = cpu_detected(lcore_id); if (lcore_config[lcore_id].detected == 0) { RTE_LOG(DEBUG, EAL, "Skip lcore %u (not detected)\n", lcore_id); config->lcore_role[lcore_id] = ROLE_OFF; continue; } + /* By default, each detected core is enabled */ + config->lcore_role[lcore_id] = ROLE_RTE; lcore_config[lcore_id].core_id = cpu_core_id(lcore_id); lcore_config[lcore_id].socket_id = cpu_socket_id(lcore_id); if (lcore_config[lcore_id].socket_id >= RTE_MAX_NUMA_NODES) @@ -176,7 +180,7 @@ rte_eal_cpu_init(void) lcore_config[lcore_id].socket_id); count ++; } - + /* Set the count of enabled logical cores of the EAL configuration */ config->lcore_count = count; return 0;