mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-05 15:09:31 +03:00
remove numaif dependency on linux
This commit is contained in:
parent
867d78f877
commit
d4f54dcf30
2 changed files with 14 additions and 18 deletions
|
@ -15,7 +15,6 @@ option(MI_LOCAL_DYNAMIC_TLS "Use slightly slower, dlopen-compatible TLS mechanis
|
||||||
option(MI_BUILD_TESTS "Build test executables" ON)
|
option(MI_BUILD_TESTS "Build test executables" ON)
|
||||||
|
|
||||||
include("cmake/mimalloc-config-version.cmake")
|
include("cmake/mimalloc-config-version.cmake")
|
||||||
include("CheckIncludeFile")
|
|
||||||
|
|
||||||
set(mi_install_dir "lib/mimalloc-${mi_version}")
|
set(mi_install_dir "lib/mimalloc-${mi_version}")
|
||||||
|
|
||||||
|
@ -98,16 +97,6 @@ if(MI_USE_CXX MATCHES "ON")
|
||||||
set_source_files_properties(src/static.c test/test-api.c PROPERTIES LANGUAGE CXX )
|
set_source_files_properties(src/static.c test/test-api.c PROPERTIES LANGUAGE CXX )
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
CHECK_INCLUDE_FILE("numaif.h" MI_HAVE_NUMA_H)
|
|
||||||
if(MI_HAVE_NUMA_H)
|
|
||||||
list(APPEND mi_defines MI_HAS_NUMA)
|
|
||||||
list(APPEND mi_libraries numa)
|
|
||||||
else()
|
|
||||||
if (NOT(WIN32))
|
|
||||||
message(WARNING "Compiling without using NUMA optimized allocation (on Linux, install libnuma-dev?)")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Compiler flags
|
# Compiler flags
|
||||||
if(CMAKE_C_COMPILER_ID MATCHES "AppleClang|Clang|GNU")
|
if(CMAKE_C_COMPILER_ID MATCHES "AppleClang|Clang|GNU")
|
||||||
list(APPEND mi_cflags -Wall -Wextra -Wno-unknown-pragmas)
|
list(APPEND mi_cflags -Wall -Wextra -Wno-unknown-pragmas)
|
||||||
|
|
21
src/os.c
21
src/os.c
|
@ -827,28 +827,35 @@ static void* mi_os_alloc_huge_os_pagesx(void* addr, size_t size, int numa_node)
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(MI_OS_USE_MMAP) && (MI_INTPTR_SIZE >= 8)
|
#elif defined(MI_OS_USE_MMAP) && (MI_INTPTR_SIZE >= 8)
|
||||||
#ifdef MI_HAS_NUMA
|
#include <sys/syscall.h>
|
||||||
#include <numaif.h> // mbind, and use -lnuma
|
#ifndef MPOL_PREFERRED
|
||||||
|
#define MPOL_PREFERRED 1
|
||||||
|
#endif
|
||||||
|
#if defined(SYS_mbind)
|
||||||
|
static long mi_os_mbind(void* start, unsigned long len, unsigned long mode, const unsigned long* nmask, unsigned long maxnode, unsigned flags) {
|
||||||
|
return syscall(SYS_mbind, start, len, mode, nmask, maxnode, flags);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static long mi_os_mbind(void* start, unsigned long len, unsigned long mode, const unsigned long* nmask, unsigned long maxnode, unsigned flags) {
|
||||||
|
UNUSED(start); UNUSED(len); UNUSED(mode); UNUSED(nmask); UNUSED(maxnode); UNUSED(flags);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
static void* mi_os_alloc_huge_os_pagesx(void* addr, size_t size, int numa_node) {
|
static void* mi_os_alloc_huge_os_pagesx(void* addr, size_t size, int numa_node) {
|
||||||
mi_assert_internal(size%GiB == 0);
|
mi_assert_internal(size%GiB == 0);
|
||||||
bool is_large = true;
|
bool is_large = true;
|
||||||
void* p = mi_unix_mmap(addr, size, MI_SEGMENT_SIZE, PROT_READ | PROT_WRITE, true, true, &is_large);
|
void* p = mi_unix_mmap(addr, size, MI_SEGMENT_SIZE, PROT_READ | PROT_WRITE, true, true, &is_large);
|
||||||
if (p == NULL) return NULL;
|
if (p == NULL) return NULL;
|
||||||
#ifdef MI_HAS_NUMA
|
|
||||||
if (numa_node >= 0 && numa_node < 8*MI_INTPTR_SIZE) { // at most 64 nodes
|
if (numa_node >= 0 && numa_node < 8*MI_INTPTR_SIZE) { // at most 64 nodes
|
||||||
uintptr_t numa_mask = (1UL << numa_node);
|
uintptr_t numa_mask = (1UL << numa_node);
|
||||||
// TODO: does `mbind` work correctly for huge OS pages? should we
|
// TODO: does `mbind` work correctly for huge OS pages? should we
|
||||||
// use `set_mempolicy` before calling mmap instead?
|
// use `set_mempolicy` before calling mmap instead?
|
||||||
// see: <https://lkml.org/lkml/2017/2/9/875>
|
// see: <https://lkml.org/lkml/2017/2/9/875>
|
||||||
long err = mbind(p, size, MPOL_PREFERRED, &numa_mask, 8*MI_INTPTR_SIZE, 0);
|
long err = mi_os_mbind(p, size, MPOL_PREFERRED, &numa_mask, 8*MI_INTPTR_SIZE, 0);
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
_mi_warning_message("failed to bind huge (1GiB) pages to NUMA node %d: %s\n", numa_node, strerror(errno));
|
_mi_warning_message("failed to bind huge (1GiB) pages to NUMA node %d: %s\n", numa_node, strerror(errno));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
UNUSED(numa_node);
|
|
||||||
#endif
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
Loading…
Add table
Reference in a new issue