|
7 | 7 | #include "cpp_helpers.hpp"
|
8 | 8 | #include "provider_os_memory_internal.h"
|
9 | 9 | #include "umf/providers/provider_os_memory.h"
|
| 10 | +#include <numa.h> |
| 11 | +#include <numaif.h> |
10 | 12 | #include <umf/memory_provider.h>
|
11 | 13 |
|
12 | 14 | using umf_test::test;
|
@@ -295,3 +297,48 @@ TEST_P(umfProviderTest, purge_force_INVALID_POINTER) {
|
295 | 297 | verify_last_native_error(provider.get(),
|
296 | 298 | UMF_OS_RESULT_ERROR_PURGE_FORCE_FAILED);
|
297 | 299 | }
|
| 300 | + |
| 301 | +// Tests for allocations on numa nodes |
| 302 | +TEST_F(test, checkNUMAnodesAllocation) { |
| 303 | + if (numa_available() == -1 || numa_num_task_nodes() <= 1) { |
| 304 | + GTEST_SKIP(); |
| 305 | + } |
| 306 | + |
| 307 | + umf_memory_provider_handle_t os_memory_provider = nullptr; |
| 308 | + umf_os_memory_provider_params_t os_memory_provider_params = |
| 309 | + UMF_OS_MEMORY_PROVIDER_PARAMS_TEST; |
| 310 | + |
| 311 | + bitmask *nodemask = numa_parse_nodestring("1"); |
| 312 | + ASSERT_NE(nodemask, nullptr); |
| 313 | + long unsigned int *nodemask_ptr = nodemask->maskp; |
| 314 | + |
| 315 | + os_memory_provider_params.maxnode = numa_max_node() + 1; |
| 316 | + os_memory_provider_params.nodemask = nodemask_ptr; |
| 317 | + os_memory_provider_params.numa_mode = UMF_NUMA_MODE_BIND; |
| 318 | + |
| 319 | + umf_result_t umf_result; |
| 320 | + umf_result = umfMemoryProviderCreate(&UMF_OS_MEMORY_PROVIDER_OPS, |
| 321 | + &os_memory_provider_params, |
| 322 | + &os_memory_provider); |
| 323 | + ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS); |
| 324 | + ASSERT_NE(os_memory_provider, nullptr); |
| 325 | + |
| 326 | + size_t size; |
| 327 | + umf_result = |
| 328 | + umfMemoryProviderGetMinPageSize(os_memory_provider, NULL, &size); |
| 329 | + ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS); |
| 330 | + |
| 331 | + void *ptr = nullptr; |
| 332 | + umf_result = umfMemoryProviderAlloc(os_memory_provider, size, 0, &ptr); |
| 333 | + ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS); |
| 334 | + ASSERT_NE(ptr, nullptr); |
| 335 | + |
| 336 | + int numa_node; |
| 337 | + get_mempolicy(&numa_node, NULL, numa_max_node() + 1, (void *)ptr, |
| 338 | + MPOL_F_NODE | MPOL_F_ADDR); |
| 339 | + ASSERT_EQ(numa_node, 1); |
| 340 | + |
| 341 | + memset(ptr, 0xFF, size); |
| 342 | + umf_result = umfMemoryProviderFree(os_memory_provider, ptr, size); |
| 343 | + ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS); |
| 344 | +} |
0 commit comments