diff --git a/cooking_recipe.cmake b/cooking_recipe.cmake index d63ad23d64..0e8138d479 100644 --- a/cooking_recipe.cmake +++ b/cooking_recipe.cmake @@ -110,7 +110,7 @@ cooking_ingredient (nettle BUILD_COMMAND INSTALL_COMMAND ${make_command} install) -# Also a direct dependency of Seastar. +# A dependency of DPDK. cooking_ingredient (numactl EXTERNAL_PROJECT_ARGS URL https://github.com/numactl/numactl/releases/download/v2.0.12/numactl-2.0.12.tar.gz diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 46e7a13daf..6455b09338 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -127,10 +127,6 @@ target_link_libraries (seastar-module yaml-cpp::yaml-cpp "$" Threads::Threads) -if (Seastar_NUMA) - target_link_libraries (seastar-module - PRIVATE numactl::numactl) -endif () if (Seastar_HWLOC) target_link_libraries (seastar-module PRIVATE hwloc::hwloc) diff --git a/src/core/memory.cc b/src/core/memory.cc index 85d9b13ccc..4a3fbd0de1 100644 --- a/src/core/memory.cc +++ b/src/core/memory.cc @@ -101,10 +101,8 @@ module; #include #include #include +#include -#ifdef SEASTAR_HAVE_NUMA -#include -#endif #endif // !defined(SEASTAR_DEFAULT_ALLOCATOR) #ifdef SEASTAR_MODULE @@ -1832,6 +1830,23 @@ void configure_minimal() { init_cpu_mem(); } +static long mbind(void *addr, + unsigned long len, + int mode, + const unsigned long *nodemask, + unsigned long maxnode, + unsigned flags) { + return syscall( + SYS_mbind, + reinterpret_cast(addr), + len, + mode, + reinterpret_cast(nodemask), + maxnode, + flags + ); +} + internal::numa_layout configure(std::vector m, bool mbind, bool transparent_hugepages, @@ -1865,16 +1880,18 @@ configure(std::vector m, bool mbind, get_cpu_mem().replace_memory_backing(sys_alloc); } get_cpu_mem().resize(total, sys_alloc); -#ifdef SEASTAR_HAVE_NUMA size_t pos = 0; for (auto&& x : m) { unsigned long nodemask = 1UL << x.nodeid; if (mbind) { auto start = get_cpu_mem().mem() + pos; - auto r = ::mbind(start, x.bytes, - MPOL_PREFERRED, - &nodemask, std::numeric_limits::digits, - MPOL_MF_MOVE); + static constexpr int mpol_preferred = 1; + static constexpr unsigned int mpol_mf_move = 2; + auto r = seastar::memory::mbind( + start, x.bytes, + mpol_preferred, + &nodemask, std::numeric_limits::digits, + mpol_mf_move); if (r == -1) { char err[1000] = {}; @@ -1890,7 +1907,6 @@ configure(std::vector m, bool mbind, } pos += x.bytes; } -#endif return ret_layout; }