|
Packit |
345191 |
/*
|
|
Packit |
345191 |
* Copyright (C) 2020 Intel Corporation.
|
|
Packit |
345191 |
* All rights reserved.
|
|
Packit |
345191 |
*
|
|
Packit |
345191 |
* Redistribution and use in source and binary forms, with or without
|
|
Packit |
345191 |
* modification, are permitted provided that the following conditions are met:
|
|
Packit |
345191 |
* 1. Redistributions of source code must retain the above copyright notice(s),
|
|
Packit |
345191 |
* this list of conditions and the following disclaimer.
|
|
Packit |
345191 |
* 2. Redistributions in binary form must reproduce the above copyright notice(s),
|
|
Packit |
345191 |
* this list of conditions and the following disclaimer in the documentation
|
|
Packit |
345191 |
* and/or other materials provided with the distribution.
|
|
Packit |
345191 |
*
|
|
Packit |
345191 |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
|
|
Packit |
345191 |
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
Packit |
345191 |
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
Packit |
345191 |
* EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
Packit |
345191 |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
Packit |
345191 |
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
Packit |
345191 |
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
Packit |
345191 |
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
|
Packit |
345191 |
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
Packit |
345191 |
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
Packit |
345191 |
*/
|
|
Packit |
345191 |
|
|
Packit |
345191 |
#include <memkind.h>
|
|
Packit |
345191 |
|
|
Packit |
345191 |
#include <algorithm>
|
|
Packit |
345191 |
#include <numaif.h>
|
|
Packit |
345191 |
#include <string>
|
|
Packit |
345191 |
#include <unistd.h>
|
|
Packit |
345191 |
|
|
Packit |
345191 |
#include "common.h"
|
|
Packit |
345191 |
#include "dax_kmem_nodes.h"
|
|
Packit |
345191 |
#include "proc_stat.h"
|
|
Packit |
345191 |
#include "sys/types.h"
|
|
Packit |
345191 |
#include "sys/sysinfo.h"
|
|
Packit |
345191 |
#include "TestPolicy.hpp"
|
|
Packit |
345191 |
|
|
Packit |
345191 |
class MemkindDaxKmemFunctionalTests: public ::testing::Test
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
protected:
|
|
Packit |
345191 |
DaxKmem dax_kmem_nodes;
|
|
Packit |
345191 |
|
|
Packit |
345191 |
void SetUp()
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
if (dax_kmem_nodes.size() < 1) {
|
|
Packit |
345191 |
GTEST_SKIP() << "Minimum 1 PMEM NUMA required." << std::endl;
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
};
|
|
Packit |
345191 |
|
|
Packit |
345191 |
class MemkindDaxKmemTestsParam: public ::testing::Test,
|
|
Packit |
345191 |
public ::testing::WithParamInterface<memkind_t>
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
protected:
|
|
Packit |
345191 |
DaxKmem dax_kmem_nodes;
|
|
Packit |
345191 |
memkind_t kind;
|
|
Packit |
345191 |
void SetUp()
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
kind = GetParam();
|
|
Packit |
345191 |
if (kind == MEMKIND_DAX_KMEM_PREFERRED) {
|
|
Packit |
345191 |
std::set<int> regular_nodes = TestPolicy::get_regular_numa_nodes();
|
|
Packit |
345191 |
for (auto const &node: regular_nodes) {
|
|
Packit |
345191 |
auto closest_dax_kmem_nodes = dax_kmem_nodes.get_closest_numa_nodes(node);
|
|
Packit |
345191 |
if (closest_dax_kmem_nodes.size() > 1)
|
|
Packit |
345191 |
GTEST_SKIP() << "Skip test for MEMKIND_DAX_KMEM_PREFFERED - "
|
|
Packit |
345191 |
"more than one PMEM NUMA node is closest to node: "
|
|
Packit |
345191 |
<< node << std::endl;
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
};
|
|
Packit |
345191 |
|
|
Packit |
345191 |
INSTANTIATE_TEST_CASE_P(
|
|
Packit |
345191 |
KindParam, MemkindDaxKmemTestsParam,
|
|
Packit |
345191 |
::testing::Values(MEMKIND_DAX_KMEM, MEMKIND_DAX_KMEM_ALL,
|
|
Packit |
345191 |
MEMKIND_DAX_KMEM_PREFERRED));
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_P(MemkindDaxKmemTestsParam,
|
|
Packit |
345191 |
test_TC_MEMKIND_MEMKIND_DAX_KMEM_free_with_NULL_kind_4096_bytes)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
void *ptr = memkind_malloc(kind, 4 * KB);
|
|
Packit |
345191 |
ASSERT_NE(nullptr, ptr);
|
|
Packit |
345191 |
memkind_free(nullptr, ptr);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_P(MemkindDaxKmemTestsParam, test_TC_MEMKIND_MEMKIND_DAX_KMEM_alloc_zero)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
void *test1 = memkind_malloc(kind, 0);
|
|
Packit |
345191 |
ASSERT_EQ(test1, nullptr);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_P(MemkindDaxKmemTestsParam,
|
|
Packit |
345191 |
test_TC_MEMKIND_MEMKIND_DAX_KMEM_alloc_size_max)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
errno = 0;
|
|
Packit |
345191 |
void *test1 = memkind_malloc(kind, SIZE_MAX);
|
|
Packit |
345191 |
ASSERT_EQ(test1, nullptr);
|
|
Packit |
345191 |
ASSERT_EQ(errno, ENOMEM);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_P(MemkindDaxKmemTestsParam, test_TC_MEMKIND_MEMKIND_DAX_KMEM_calloc_zero)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
void *test = memkind_calloc(kind, 0, 100);
|
|
Packit |
345191 |
ASSERT_EQ(test, nullptr);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
test = memkind_calloc(kind, 100, 0);
|
|
Packit |
345191 |
ASSERT_EQ(test, nullptr);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_P(MemkindDaxKmemTestsParam,
|
|
Packit |
345191 |
test_TC_MEMKIND_MEMKIND_DAX_KMEM_calloc_size_max)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
const size_t size = SIZE_MAX;
|
|
Packit |
345191 |
const size_t num = 1;
|
|
Packit |
345191 |
errno = 0;
|
|
Packit |
345191 |
|
|
Packit |
345191 |
void *test = memkind_calloc(kind, size, num);
|
|
Packit |
345191 |
ASSERT_EQ(test, nullptr);
|
|
Packit |
345191 |
ASSERT_EQ(errno, ENOMEM);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_P(MemkindDaxKmemTestsParam,
|
|
Packit |
345191 |
test_TC_MEMKIND_MEMKIND_DAX_KMEM_calloc_num_max)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
const size_t size = 10;
|
|
Packit |
345191 |
const size_t num = SIZE_MAX;
|
|
Packit |
345191 |
errno = 0;
|
|
Packit |
345191 |
|
|
Packit |
345191 |
void *test = memkind_calloc(kind, size, num);
|
|
Packit |
345191 |
ASSERT_EQ(test, nullptr);
|
|
Packit |
345191 |
ASSERT_EQ(errno, ENOMEM);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_P(MemkindDaxKmemTestsParam, test_TC_MEMKIND_MEMKIND_DAX_KMEM_realloc)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
const size_t size1 = 512;
|
|
Packit |
345191 |
const size_t size2 = 1 * KB;
|
|
Packit |
345191 |
char *default_str = nullptr;
|
|
Packit |
345191 |
|
|
Packit |
345191 |
default_str = (char *)memkind_realloc(kind, default_str, size1);
|
|
Packit |
345191 |
ASSERT_NE(nullptr, default_str);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
sprintf(default_str, "memkind_realloc with size %zu\n", size1);
|
|
Packit |
345191 |
printf("%s", default_str);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
default_str = (char *)memkind_realloc(kind, default_str, size2);
|
|
Packit |
345191 |
ASSERT_NE(nullptr, default_str);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
sprintf(default_str, "memkind_realloc with size %zu\n", size2);
|
|
Packit |
345191 |
printf("%s", default_str);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
memkind_free(kind, default_str);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_P(MemkindDaxKmemTestsParam, test_TC_MEMKIND_MEMKIND_DAX_KMEM_realloc_zero)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
const size_t size = 1 * KB;
|
|
Packit |
345191 |
|
|
Packit |
345191 |
void *test = memkind_malloc(kind, size);
|
|
Packit |
345191 |
ASSERT_NE(test, nullptr);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
void *new_test = memkind_realloc(kind, test, 0);
|
|
Packit |
345191 |
ASSERT_EQ(new_test, nullptr);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_P(MemkindDaxKmemTestsParam,
|
|
Packit |
345191 |
test_TC_MEMKIND_MEMKIND_DAX_KMEM_realloc_size_max)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
const size_t size = 1 * KB;
|
|
Packit |
345191 |
|
|
Packit |
345191 |
void *test = memkind_malloc(kind, size);
|
|
Packit |
345191 |
ASSERT_NE(test, nullptr);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
errno = 0;
|
|
Packit |
345191 |
void *new_test = memkind_realloc(kind, test, SIZE_MAX);
|
|
Packit |
345191 |
ASSERT_EQ(new_test, nullptr);
|
|
Packit |
345191 |
ASSERT_EQ(errno, ENOMEM);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
memkind_free(kind, test);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_P(MemkindDaxKmemTestsParam,
|
|
Packit |
345191 |
test_TC_MEMKIND_MEMKIND_DAX_KMEM_realloc_size_zero)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
const size_t size = 1 * KB;
|
|
Packit |
345191 |
void *test = nullptr;
|
|
Packit |
345191 |
void *new_test = nullptr;
|
|
Packit |
345191 |
const size_t iteration = 100;
|
|
Packit |
345191 |
|
|
Packit |
345191 |
for (unsigned i = 0; i < iteration; ++i) {
|
|
Packit |
345191 |
test = memkind_malloc(kind, size);
|
|
Packit |
345191 |
ASSERT_NE(test, nullptr);
|
|
Packit |
345191 |
errno = 0;
|
|
Packit |
345191 |
new_test = memkind_realloc(kind, test, 0);
|
|
Packit |
345191 |
ASSERT_EQ(new_test, nullptr);
|
|
Packit |
345191 |
ASSERT_EQ(errno, 0);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_P(MemkindDaxKmemTestsParam,
|
|
Packit |
345191 |
test_TC_MEMKIND_MEMKIND_DAX_KMEM_realloc_nullptr)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
const size_t size = 1 * KB;
|
|
Packit |
345191 |
void *test = nullptr;
|
|
Packit |
345191 |
|
|
Packit |
345191 |
test = memkind_realloc(kind, test, size);
|
|
Packit |
345191 |
ASSERT_NE(test, nullptr);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
memkind_free(kind, test);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_P(MemkindDaxKmemTestsParam,
|
|
Packit |
345191 |
test_TC_MEMKIND_MEMKIND_DAX_KMEM_realloc_increase_decrease_size)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
size_t size = 1 * KB;
|
|
Packit |
345191 |
const char val[] = "test_TC_MEMKIND_PmemReallocIncreaseSizeNullKindVariant";
|
|
Packit |
345191 |
int status;
|
|
Packit |
345191 |
|
|
Packit |
345191 |
char *test1 = (char *)memkind_malloc(kind, size);
|
|
Packit |
345191 |
ASSERT_NE(test1, nullptr);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
sprintf(test1, "%s", val);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
size = 2 * KB;
|
|
Packit |
345191 |
char *test2 = (char *)memkind_realloc(nullptr, test1, size);
|
|
Packit |
345191 |
ASSERT_NE(test2, nullptr);
|
|
Packit |
345191 |
status = memcmp(val, test2, sizeof(val));
|
|
Packit |
345191 |
ASSERT_EQ(status, 0);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
size = 512;
|
|
Packit |
345191 |
char *test3 = (char *)memkind_realloc(nullptr, test2, size);
|
|
Packit |
345191 |
ASSERT_NE(test3, nullptr);
|
|
Packit |
345191 |
status = memcmp(val, test3, sizeof(val));
|
|
Packit |
345191 |
ASSERT_EQ(status, 0);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
memkind_free(kind, test3);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_P(MemkindDaxKmemTestsParam, test_TC_MEMKIND_MEMKIND_DAX_KMEM_free_nullptr)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
const int n_iter = 5000;
|
|
Packit |
345191 |
|
|
Packit |
345191 |
for (int i = 0; i < n_iter; ++i) {
|
|
Packit |
345191 |
memkind_free(kind, nullptr);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_P(MemkindDaxKmemTestsParam,
|
|
Packit |
345191 |
test_TC_MEMKIND_MEMKIND_DAX_KMEM_posix_memalign_alignment_less_than_void)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
void *test = nullptr;
|
|
Packit |
345191 |
const size_t size = 32;
|
|
Packit |
345191 |
const size_t wrong_alignment = 4;
|
|
Packit |
345191 |
|
|
Packit |
345191 |
errno = 0;
|
|
Packit |
345191 |
int ret = memkind_posix_memalign(kind, &test, wrong_alignment, size);
|
|
Packit |
345191 |
ASSERT_EQ(errno, 0);
|
|
Packit |
345191 |
ASSERT_EQ(ret, EINVAL);
|
|
Packit |
345191 |
ASSERT_EQ(test, nullptr);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_P(MemkindDaxKmemTestsParam,
|
|
Packit |
345191 |
test_TC_MEMKIND_MEMKIND_DAX_KMEM_posix_memalign_alignment_not_pow2)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
void *test = nullptr;
|
|
Packit |
345191 |
const size_t size = 32;
|
|
Packit |
345191 |
const size_t wrong_alignment = sizeof(void *)+1;
|
|
Packit |
345191 |
|
|
Packit |
345191 |
errno = 0;
|
|
Packit |
345191 |
int ret = memkind_posix_memalign(kind, &test, wrong_alignment, size);
|
|
Packit |
345191 |
ASSERT_EQ(errno, 0);
|
|
Packit |
345191 |
ASSERT_EQ(ret, EINVAL);
|
|
Packit |
345191 |
ASSERT_EQ(test, nullptr);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_P(MemkindDaxKmemTestsParam,
|
|
Packit |
345191 |
test_TC_MEMKIND_MEMKIND_DAX_KMEM_posix_memalign_correct_alignment)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
void *test = nullptr;
|
|
Packit |
345191 |
const size_t size = 32;
|
|
Packit |
345191 |
const size_t alignment = sizeof(void *);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
errno = 0;
|
|
Packit |
345191 |
int ret = memkind_posix_memalign(kind, &test, alignment, size);
|
|
Packit |
345191 |
ASSERT_EQ(errno, 0);
|
|
Packit |
345191 |
ASSERT_EQ(ret, 0);
|
|
Packit |
345191 |
ASSERT_NE(test, nullptr);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
memkind_free(nullptr, test);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_F(MemkindDaxKmemFunctionalTests,
|
|
Packit |
345191 |
test_TC_MEMKIND_MEMKIND_DAX_KMEM_alloc_until_full_numa)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
ProcStat stat;
|
|
Packit |
345191 |
const size_t alloc_size = 100 * MB;
|
|
Packit |
345191 |
std::set<void *> allocations;
|
|
Packit |
345191 |
size_t numa_size;
|
|
Packit |
345191 |
int numa_id = -1;
|
|
Packit |
345191 |
const int n_swap_alloc = 20;
|
|
Packit |
345191 |
|
|
Packit |
345191 |
void *ptr = memkind_malloc(MEMKIND_DAX_KMEM, alloc_size);
|
|
Packit |
345191 |
ASSERT_NE(nullptr, ptr);
|
|
Packit |
345191 |
memset(ptr, 'a', alloc_size);
|
|
Packit |
345191 |
allocations.insert(ptr);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
get_mempolicy(&numa_id, nullptr, 0, ptr, MPOL_F_NODE | MPOL_F_ADDR);
|
|
Packit |
345191 |
numa_size = numa_node_size64(numa_id, nullptr);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
while (numa_size > alloc_size * allocations.size()) {
|
|
Packit |
345191 |
ptr = memkind_malloc(MEMKIND_DAX_KMEM, alloc_size);
|
|
Packit |
345191 |
ASSERT_NE(nullptr, ptr);
|
|
Packit |
345191 |
memset(ptr, 'a', alloc_size);
|
|
Packit |
345191 |
allocations.insert(ptr);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
size_t init_swap = stat.get_used_swap_space_size_bytes();
|
|
Packit |
345191 |
for(int i = 0; i < n_swap_alloc; ++i) {
|
|
Packit |
345191 |
ptr = memkind_malloc(MEMKIND_DAX_KMEM, alloc_size);
|
|
Packit |
345191 |
ASSERT_NE(nullptr, ptr);
|
|
Packit |
345191 |
memset(ptr, 'a', alloc_size);
|
|
Packit |
345191 |
allocations.insert(ptr);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
ASSERT_GE(stat.get_used_swap_space_size_bytes(), init_swap);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
for (auto const &ptr: allocations) {
|
|
Packit |
345191 |
memkind_free(MEMKIND_DAX_KMEM, ptr);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_F(MemkindDaxKmemFunctionalTests,
|
|
Packit |
345191 |
test_TC_MEMKIND_MEMKIND_DAX_KMEM_ALL_alloc_until_full_numa)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
if (dax_kmem_nodes.size() < 2)
|
|
Packit |
345191 |
GTEST_SKIP() << "This test requires minimum 2 kmem dax nodes";
|
|
Packit |
345191 |
|
|
Packit |
345191 |
ProcStat stat;
|
|
Packit |
345191 |
void *ptr;
|
|
Packit |
345191 |
const size_t alloc_size = 100 * MB;
|
|
Packit |
345191 |
std::set<void *> allocations;
|
|
Packit |
345191 |
size_t sum_of_dax_kmem_free_space = dax_kmem_nodes.get_free_space();
|
|
Packit |
345191 |
int numa_id = -1;
|
|
Packit |
345191 |
const int n_swap_alloc = 20;
|
|
Packit |
345191 |
|
|
Packit |
345191 |
while (sum_of_dax_kmem_free_space > alloc_size * allocations.size()) {
|
|
Packit |
345191 |
ptr = memkind_malloc(MEMKIND_DAX_KMEM_ALL, alloc_size);
|
|
Packit |
345191 |
ASSERT_NE(nullptr, ptr);
|
|
Packit |
345191 |
memset(ptr, 'a', alloc_size);
|
|
Packit |
345191 |
allocations.insert(ptr);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
get_mempolicy(&numa_id, nullptr, 0, ptr, MPOL_F_NODE | MPOL_F_ADDR);
|
|
Packit |
345191 |
ASSERT_TRUE(dax_kmem_nodes.contains(numa_id));
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
size_t init_swap = stat.get_used_swap_space_size_bytes();
|
|
Packit |
345191 |
for(int i = 0; i < n_swap_alloc; ++i) {
|
|
Packit |
345191 |
ptr = memkind_malloc(MEMKIND_DAX_KMEM_ALL, alloc_size);
|
|
Packit |
345191 |
ASSERT_NE(nullptr, ptr);
|
|
Packit |
345191 |
memset(ptr, 'a', alloc_size);
|
|
Packit |
345191 |
allocations.insert(ptr);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
ASSERT_GE(stat.get_used_swap_space_size_bytes(), init_swap);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
for (auto const &ptr: allocations) {
|
|
Packit |
345191 |
memkind_free(MEMKIND_DAX_KMEM_ALL, ptr);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_F(MemkindDaxKmemFunctionalTests,
|
|
Packit |
345191 |
test_TC_MEMKIND_MEMKIND_DAX_KMEM_PREFFERED_alloc_until_full_numa)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
std::set<int> regular_nodes = TestPolicy::get_regular_numa_nodes();
|
|
Packit |
345191 |
for (auto const &node: regular_nodes) {
|
|
Packit |
345191 |
auto closest_dax_kmem_nodes = dax_kmem_nodes.get_closest_numa_nodes(node);
|
|
Packit |
345191 |
if (closest_dax_kmem_nodes.size() > 1)
|
|
Packit |
345191 |
GTEST_SKIP() << "Skip test for MEMKIND_DAX_KMEM_PREFFERED - "
|
|
Packit |
345191 |
"more than one PMEM NUMA node is closest to node: "
|
|
Packit |
345191 |
<< node << std::endl;
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
ProcStat stat;
|
|
Packit |
345191 |
const size_t alloc_size = 100 * MB;
|
|
Packit |
345191 |
std::set<void *> allocations;
|
|
Packit |
345191 |
size_t numa_size;
|
|
Packit |
345191 |
int numa_id = -1;
|
|
Packit |
345191 |
const int n_swap_alloc = 20;
|
|
Packit |
345191 |
|
|
Packit |
345191 |
void *ptr = memkind_malloc(MEMKIND_DAX_KMEM_PREFERRED, alloc_size);
|
|
Packit |
345191 |
ASSERT_NE(nullptr, ptr);
|
|
Packit |
345191 |
memset(ptr, 'a', alloc_size);
|
|
Packit |
345191 |
allocations.insert(ptr);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
get_mempolicy(&numa_id, nullptr, 0, ptr, MPOL_F_NODE | MPOL_F_ADDR);
|
|
Packit |
345191 |
int process_cpu = sched_getcpu();
|
|
Packit |
345191 |
int process_node = numa_node_of_cpu(process_cpu);
|
|
Packit |
345191 |
std::set<int> closest_numa_ids = dax_kmem_nodes.get_closest_numa_nodes(
|
|
Packit |
345191 |
process_node);
|
|
Packit |
345191 |
numa_size = numa_node_size64(numa_id, nullptr);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
while (0.99 * numa_size > alloc_size * allocations.size()) {
|
|
Packit |
345191 |
ptr = memkind_malloc(MEMKIND_DAX_KMEM_PREFERRED, alloc_size);
|
|
Packit |
345191 |
ASSERT_NE(nullptr, ptr);
|
|
Packit |
345191 |
memset(ptr, 'a', alloc_size);
|
|
Packit |
345191 |
allocations.insert(ptr);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
get_mempolicy(&numa_id, nullptr, 0, ptr, MPOL_F_NODE | MPOL_F_ADDR);
|
|
Packit |
345191 |
ASSERT_TRUE(closest_numa_ids.find(numa_id) != closest_numa_ids.end());
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
for (int i = 0; i < n_swap_alloc; ++i) {
|
|
Packit |
345191 |
ptr = memkind_malloc(MEMKIND_DAX_KMEM_PREFERRED, alloc_size);
|
|
Packit |
345191 |
ASSERT_NE(nullptr, ptr);
|
|
Packit |
345191 |
memset(ptr, 'a', alloc_size);
|
|
Packit |
345191 |
allocations.insert(ptr);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
ASSERT_EQ(stat.get_used_swap_space_size_bytes(), 0U);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
for (auto const &ptr: allocations) {
|
|
Packit |
345191 |
memkind_free(MEMKIND_DAX_KMEM_ALL, ptr);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
TEST_F(MemkindDaxKmemFunctionalTests,
|
|
Packit |
345191 |
test_TC_MEMKIND_MEMKIND_DAX_KMEM_PREFFERED_check_prerequisities)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
bool can_run = false;
|
|
Packit |
345191 |
std::set<int> regular_nodes = TestPolicy::get_regular_numa_nodes();
|
|
Packit |
345191 |
|
|
Packit |
345191 |
for (auto const &node: regular_nodes) {
|
|
Packit |
345191 |
auto closest_dax_kmem_nodes = dax_kmem_nodes.get_closest_numa_nodes(node);
|
|
Packit |
345191 |
if (closest_dax_kmem_nodes.size() > 1)
|
|
Packit |
345191 |
can_run = true;
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
if (!can_run)
|
|
Packit |
345191 |
GTEST_SKIP() <<
|
|
Packit |
345191 |
"Skip test for MEMKIND_DAX_KMEM_PREFFERED checking prerequisities - "
|
|
Packit |
345191 |
"none of the nodes have more than one closest PMEM NUMA nodes";
|
|
Packit |
345191 |
|
|
Packit |
345191 |
const size_t alloc_size = 100 * MB;
|
|
Packit |
345191 |
void *ptr = memkind_malloc(MEMKIND_DAX_KMEM_PREFERRED, alloc_size);
|
|
Packit |
345191 |
ASSERT_EQ(nullptr, ptr);
|
|
Packit |
345191 |
}
|