eal: provide API for querying valid socket ids

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>
This commit is contained in:
Anatoly Burakov 2018-03-31 18:08:13 +01:00 committed by Thomas Monjalon
parent f05e26051c
commit 952b207772
9 changed files with 101 additions and 19 deletions

View 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.

View 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

View 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

View 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>
@ -16,6 +17,19 @@
#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];
}

View 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. */

View 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
*

View 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

View 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'

View 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;