From 4c9599574929f624a218b963d268d97799289945 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Sun, 9 Feb 2020 18:09:31 +0000 Subject: vppinfra: use vm memory allocator for numa mapping Type: refactor Signed-off-by: Florin Coras Change-Id: I13b239cd572ae6dfaec07019d3d9b7c0ed3edcfa --- src/vlib/main.c | 1 + src/vlib/threads.c | 8 +++----- src/vppinfra/CMakeLists.txt | 9 +-------- src/vppinfra/config.h.in | 1 - src/vppinfra/mem.h | 3 ++- src/vppinfra/mem_dlmalloc.c | 49 +++++++++++++-------------------------------- 6 files changed, 21 insertions(+), 50 deletions(-) diff --git a/src/vlib/main.c b/src/vlib/main.c index 28c8c789c0a..94218d3d9d8 100644 --- a/src/vlib/main.c +++ b/src/vlib/main.c @@ -1717,6 +1717,7 @@ vlib_main_or_worker_loop (vlib_main_t * vm, int is_main) vm->cpu_id = clib_get_current_cpu_id (); vm->numa_node = clib_get_current_numa_node (); + os_set_numa_index (vm->numa_node); /* Start all processes. */ if (is_main) diff --git a/src/vlib/threads.c b/src/vlib/threads.c index 8a068875617..d9d781070a3 100644 --- a/src/vlib/threads.c +++ b/src/vlib/threads.c @@ -589,9 +589,8 @@ vlib_get_thread_core_numa (vlib_worker_thread_t * w, unsigned cpu_id) p = format (p, "%s%u/topology/core_id%c", sys_cpu_path, cpu_id, 0); clib_sysfs_read ((char *) p, "%d", &core_id); vec_reset_length (p); - p = - format (p, "%s%u/topology/physical_package_id%c", sys_cpu_path, cpu_id, - 0); + p = format (p, "%s%u/topology/physical_package_id%c", sys_cpu_path, + cpu_id, 0); clib_sysfs_read ((char *) p, "%d", &numa_id); vec_free (p); @@ -608,7 +607,6 @@ vlib_launch_thread_int (void *fp, vlib_worker_thread_t * w, unsigned cpu_id) w->cpu_id = cpu_id; vlib_get_thread_core_numa (w, cpu_id); - os_set_numa_index (w->numa_id); /* Set up NUMA-bound heap if indicated */ if (clib_per_numa_mheaps[w->numa_id] == 0) @@ -617,7 +615,7 @@ vlib_launch_thread_int (void *fp, vlib_worker_thread_t * w, unsigned cpu_id) if (tm->numa_heap_size) { numa_heap = clib_mem_init_thread_safe_numa - (0 /* DIY */ , tm->numa_heap_size); + (0 /* DIY */ , tm->numa_heap_size, w->numa_id); clib_per_numa_mheaps[w->numa_id] = numa_heap; } else diff --git a/src/vppinfra/CMakeLists.txt b/src/vppinfra/CMakeLists.txt index 60e6eeff9fe..1c234cce234 100644 --- a/src/vppinfra/CMakeLists.txt +++ b/src/vppinfra/CMakeLists.txt @@ -24,13 +24,6 @@ else(VPP_USE_DLMALLOC) set(DLMALLOC 0) endif(VPP_USE_DLMALLOC) -find_library(NUMA numa) -if (NUMA) - set(NUMA_LIBRARY_FOUND 1) -else(NUMA) - set(NUMA_LIBRARY_FOUND 0) -endif() - configure_file( ${CMAKE_SOURCE_DIR}/vppinfra/config.h.in ${CMAKE_BINARY_DIR}/vppinfra/config.h @@ -217,7 +210,7 @@ endif(VPP_USE_DLMALLOC) add_vpp_library(vppinfra SOURCES ${VPPINFRA_SRCS} - LINK_LIBRARIES m ${NUMA} + LINK_LIBRARIES m INSTALL_HEADERS ${VPPINFRA_HEADERS} COMPONENT libvppinfra ) diff --git a/src/vppinfra/config.h.in b/src/vppinfra/config.h.in index b2366630447..a7a22a6a992 100644 --- a/src/vppinfra/config.h.in +++ b/src/vppinfra/config.h.in @@ -21,7 +21,6 @@ #endif #define USE_DLMALLOC @DLMALLOC@ -#define HAVE_NUMA_LIBRARY @NUMA_LIBRARY_FOUND@ #define CLIB_TARGET_TRIPLET "@CMAKE_C_COMPILER_TARGET@" #endif diff --git a/src/vppinfra/mem.h b/src/vppinfra/mem.h index c00c78ad9a4..0367c4a1213 100644 --- a/src/vppinfra/mem.h +++ b/src/vppinfra/mem.h @@ -308,7 +308,8 @@ clib_mem_set_heap (void *heap) void *clib_mem_init (void *heap, uword size); void *clib_mem_init_thread_safe (void *memory, uword memory_size); -void *clib_mem_init_thread_safe_numa (void *memory, uword memory_size); +void *clib_mem_init_thread_safe_numa (void *memory, uword memory_size, + u8 numa); void clib_mem_exit (void); diff --git a/src/vppinfra/mem_dlmalloc.c b/src/vppinfra/mem_dlmalloc.c index 38226e26f8f..d62bb740c6c 100644 --- a/src/vppinfra/mem_dlmalloc.c +++ b/src/vppinfra/mem_dlmalloc.c @@ -243,46 +243,25 @@ clib_mem_init_thread_safe (void *memory, uword memory_size) } void * -clib_mem_init_thread_safe_numa (void *memory, uword memory_size) +clib_mem_init_thread_safe_numa (void *memory, uword memory_size, u8 numa) { + clib_mem_vm_alloc_t alloc = { 0 }; + clib_error_t *err; void *heap; - unsigned long this_numa; - heap = - clib_mem_init_internal (memory, memory_size, - 0 /* do NOT clib_mem_set_heap */ ); - - ASSERT (heap); - - this_numa = os_get_numa_index (); - -#if HAVE_NUMA_LIBRARY > 0 - unsigned long nodemask = 1 << this_numa; - void *page_base; - unsigned long page_mask; - long rv; - - /* - * Bind the heap to the current thread's NUMA node. - * heap is not naturally page-aligned, so fix it. - */ - - page_mask = ~(clib_mem_get_page_size () - 1); - page_base = (void *) (((unsigned long) heap) & page_mask); - - clib_warning ("Bind heap at %llx size %llx to NUMA numa %d", - page_base, memory_size, this_numa); + alloc.size = memory_size; + alloc.flags = CLIB_MEM_VM_F_NUMA_FORCE; + alloc.numa_node = numa; + if ((err = clib_mem_vm_ext_alloc (&alloc))) + { + clib_error_report (err); + return 0; + } - rv = mbind (page_base, memory_size, MPOL_BIND /* mode */ , - &nodemask /* nodemask */ , - BITS (nodemask) /* max node number */ , - MPOL_MF_MOVE /* flags */ ); + heap = clib_mem_init_internal (memory, memory_size, + 0 /* do NOT clib_mem_set_heap */ ); - if (rv < 0) - clib_unix_warning ("mbind"); -#else - clib_warning ("mbind unavailable, can't bind to numa %d", this_numa); -#endif + ASSERT (heap); return heap; } -- cgit 1.2.3-korg