Trying to allocate memory on the first detected numa node,it has less chance to find some memory actually available rather than on the main lcore numa node (especially when the DPDK application is started only on one numa node).
Fixes: 8b0a1b8cb481 ("eal: stop using pthread for lcores and control threads") Fixes: 770d41bf3309 ("malloc: fix allocation with unknown socket ID") Cc: sta...@dpdk.org Signed-off-by: David Marchand <david.march...@redhat.com> Signed-off-by: Kaisen You <kaisenx....@intel.com> --- Changes since v5: - Add comments to the code, Changes since v4: - mod the patch title, Changes since v3: - add the assignment of socket_id in thread initialization, Changes since v2: - add uncommitted local change and fix compilation, Changes since v1: - accomodate for configurations with main lcore running on multiples physical cores belonging to different numa, --- lib/eal/common/eal_common_thread.c | 4 ++++ lib/eal/common/malloc_heap.c | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/lib/eal/common/eal_common_thread.c b/lib/eal/common/eal_common_thread.c index 079a385630..d65bfe251b 100644 --- a/lib/eal/common/eal_common_thread.c +++ b/lib/eal/common/eal_common_thread.c @@ -252,6 +252,10 @@ static int ctrl_thread_init(void *arg) struct rte_thread_ctrl_params *params = arg; __rte_thread_init(rte_lcore_id(), cpuset); + /* set the value of the per-core variable _socket_id. + * Convenient for threads to find memory. + */ + RTE_PER_LCORE(_socket_id) = SOCKET_ID_ANY; params->ret = rte_thread_set_affinity_by_id(rte_thread_self(), cpuset); if (params->ret != 0) { __atomic_store_n(¶ms->ctrl_thread_status, diff --git a/lib/eal/common/malloc_heap.c b/lib/eal/common/malloc_heap.c index d25bdc98f9..a624f08cf7 100644 --- a/lib/eal/common/malloc_heap.c +++ b/lib/eal/common/malloc_heap.c @@ -716,6 +716,12 @@ malloc_get_numa_socket(void) if (conf->socket_mem[socket_id] != 0) return socket_id; } + /* Trying to allocate memory on the main lcore numa node. + * especially when the DPDK application is started only on one numa node. + */ + socket_id = rte_lcore_to_socket_id(rte_get_main_lcore()); + if (socket_id != (unsigned int)SOCKET_ID_ANY) + return socket_id; return rte_socket_id_by_idx(0); } -- 2.25.1