Skip to content

Commit d82a8a3

Browse files
committed
1 parent fb3f1f4 commit d82a8a3

File tree

5 files changed

+80
-66
lines changed

5 files changed

+80
-66
lines changed

test/common/numa_helpers.h

Lines changed: 0 additions & 34 deletions
This file was deleted.

test/common/numa_helpers.hpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Copyright (C) 2024 Intel Corporation
2+
// Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
3+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4+
5+
#ifndef UMF_TEST_NUMA_HELPERS_HPP
6+
#define UMF_TEST_NUMA_HELPERS_HPP 1
7+
8+
#include <gtest/gtest.h>
9+
#include <numa.h>
10+
#include <numaif.h>
11+
#include <stdint.h>
12+
#include <stdio.h>
13+
14+
#include "test_helpers.h"
15+
16+
// returns the node where page starting at 'ptr' resides
17+
static inline void getNumaNodeByPtr(void *ptr, int *node) {
18+
int nodeId;
19+
int ret =
20+
get_mempolicy(&nodeId, nullptr, 0, ptr, MPOL_F_ADDR | MPOL_F_NODE);
21+
22+
ASSERT_EQ(ret, 0) << "get_mempolicy failed";
23+
ASSERT_GE(nodeId, 0)
24+
<< "get_mempolicy returned nodeId < 0 - should never happen";
25+
26+
*node = nodeId;
27+
}
28+
29+
static inline void _assertNode(void *ptr, int nodeId, bool fatal) {
30+
int node = -1;
31+
32+
getNumaNodeByPtr(ptr, &node);
33+
if (testing::Test::HasFatalFailure()) {
34+
return;
35+
}
36+
if (fatal) {
37+
ASSERT_EQ(nodeId, node);
38+
} else {
39+
EXPECT_EQ(nodeId, node);
40+
}
41+
}
42+
43+
//Asserts that given nodeId is equal to the node where given ptr resides
44+
#define ASSERT_NODE_EQ(ptr, nodeId) \
45+
ASSERT_NO_FATAL_FAILURE(_assertNode(ptr, nodeId, true))
46+
47+
#define EXPECT_NODE_EQ(ptr, nodeId) \
48+
ASSERT_NO_FATAL_FAILURE(_assertNode(ptr, nodeId, false))
49+
50+
#endif /* UMF_TEST_NUMA_HELPERS_HPP */

test/memspaces/memspace_highest_capacity.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include "memspace_helpers.hpp"
77
#include "memspace_internal.h"
88
#include "memtarget_numa.h"
9-
#include "numa_helpers.h"
9+
#include "numa_helpers.hpp"
1010
#include "test_helpers.h"
1111

1212
#include <numa.h>
@@ -60,7 +60,10 @@ TEST_F(memspaceHighestCapacityProviderTest, highestCapacityVerify) {
6060
memset(ptr, 0, alloc_size);
6161
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
6262

63-
auto nodeId = getNumaNodeByPtr(ptr);
63+
int nodeId;
64+
65+
ASSERT_NO_FATAL_FAILURE(getNumaNodeByPtr(ptr, &nodeId));
66+
6467
ASSERT_TRUE(std::any_of(maxCapacityNodes.begin(), maxCapacityNodes.end(),
6568
[nodeId](int node) { return nodeId == node; }));
6669

test/memspaces/memspace_host_all.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#include "memspace_helpers.hpp"
1414
#include "memspace_internal.h"
1515
#include "memtarget_numa.h"
16-
#include "numa_helpers.h"
16+
#include "numa_helpers.hpp"
1717
#include "test_helpers.h"
1818
#include "utils_sanitizers.h"
1919

test/provider_os_memory_multiple_numa_nodes.cpp

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
44

55
#include "base.hpp"
6-
#include "numa_helpers.h"
6+
#include "numa_helpers.hpp"
77
#include "test_helpers.h"
88

99
#include <algorithm>
@@ -122,14 +122,10 @@ struct testNuma : testing::Test {
122122
};
123123

124124
struct testNumaOnEachNode : testNuma, testing::WithParamInterface<unsigned> {};
125-
struct testNumaOnEachCpu : testNuma, testing::WithParamInterface<int> {};
126125

127126
INSTANTIATE_TEST_SUITE_P(testNumaNodesAllocations, testNumaOnEachNode,
128127
::testing::ValuesIn(get_available_numa_nodes()));
129128

130-
INSTANTIATE_TEST_SUITE_P(testNumaNodesAllocationsAllCpus, testNumaOnEachCpu,
131-
::testing::ValuesIn(get_available_cpus()));
132-
133129
// Test for allocations on numa nodes. It will be executed on each of
134130
// the available numa nodes.
135131
TEST_P(testNumaOnEachNode, checkNumaNodesAllocations) {
@@ -152,8 +148,7 @@ TEST_P(testNumaOnEachNode, checkNumaNodesAllocations) {
152148

153149
// 'ptr' must point to an initialized value before retrieving its numa node
154150
memset(ptr, 0xFF, alloc_size);
155-
int retrieved_numa_node_number = getNumaNodeByPtr(ptr);
156-
EXPECT_EQ(retrieved_numa_node_number, numa_node_number);
151+
EXPECT_NODE_EQ(ptr, numa_node_number);
157152
}
158153

159154
// Test for allocations on numa nodes with mode preferred. It will be executed
@@ -177,8 +172,7 @@ TEST_P(testNumaOnEachNode, checkModePreferred) {
177172

178173
// 'ptr' must point to an initialized value before retrieving its numa node
179174
memset(ptr, 0xFF, alloc_size);
180-
int retrieved_numa_node_number = getNumaNodeByPtr(ptr);
181-
EXPECT_EQ(retrieved_numa_node_number, numa_node_number);
175+
EXPECT_NODE_EQ(ptr, numa_node_number);
182176
}
183177

184178
// Test for allocation on numa node with default mode enabled.
@@ -202,8 +196,7 @@ TEST_P(testNumaOnEachNode, checkModeDefaultSetMempolicy) {
202196

203197
// 'ptr' must point to an initialized value before retrieving its numa node
204198
memset(ptr, 0xFF, alloc_size);
205-
int retrieved_numa_node_number = getNumaNodeByPtr(ptr);
206-
EXPECT_EQ(retrieved_numa_node_number, numa_node_number);
199+
EXPECT_NODE_EQ(ptr, numa_node_number);
207200
}
208201

209202
// Test for allocations on a single numa node with interleave mode enabled.
@@ -229,10 +222,14 @@ TEST_P(testNumaOnEachNode, checkModeInterleaveSingleNode) {
229222

230223
// 'ptr' must point to an initialized value before retrieving its numa node
231224
memset(ptr, 0xFF, pages_num * page_size);
232-
int retrieved_numa_node_number = getNumaNodeByPtr(ptr);
233-
EXPECT_EQ(retrieved_numa_node_number, numa_node_number);
225+
EXPECT_NODE_EQ(ptr, numa_node_number);
234226
}
235227

228+
struct testNumaOnEachCpu : testNuma, testing::WithParamInterface<int> {};
229+
230+
INSTANTIATE_TEST_SUITE_P(testNumaNodesAllocationsAllCpus, testNumaOnEachCpu,
231+
::testing::ValuesIn(get_available_cpus()));
232+
236233
// Test for allocation on numa node with mode preferred and an empty nodeset.
237234
// For the empty nodeset the memory is allocated on the node of the CPU that
238235
// triggered the allocation. It will be executed on each available CPU.
@@ -269,8 +266,7 @@ TEST_P(testNumaOnEachCpu, checkModePreferredEmptyNodeset) {
269266

270267
// 'ptr' must point to an initialized value before retrieving its numa node
271268
memset(ptr, 0xFF, alloc_size);
272-
int retrieved_numa_node_number = getNumaNodeByPtr(ptr);
273-
EXPECT_EQ(retrieved_numa_node_number, numa_node_number);
269+
EXPECT_NODE_EQ(ptr, numa_node_number);
274270
}
275271

276272
// Test for allocation on numa node with local mode enabled. The memory is
@@ -307,8 +303,7 @@ TEST_P(testNumaOnEachCpu, checkModeLocal) {
307303

308304
// 'ptr' must point to an initialized value before retrieving its numa node
309305
memset(ptr, 0xFF, alloc_size);
310-
int retrieved_numa_node_number = getNumaNodeByPtr(ptr);
311-
EXPECT_EQ(retrieved_numa_node_number, numa_node_number);
306+
EXPECT_NODE_EQ(ptr, numa_node_number);
312307
}
313308

314309
// Test for allocation on numa node with default mode enabled.
@@ -332,8 +327,7 @@ TEST_F(testNuma, checkModeDefault) {
332327

333328
// 'ptr' must point to an initialized value before retrieving its numa node
334329
memset(ptr, 0xFF, alloc_size);
335-
int retrieved_numa_node_number = getNumaNodeByPtr(ptr);
336-
EXPECT_EQ(retrieved_numa_node_number, numa_node_number);
330+
EXPECT_NODE_EQ(ptr, numa_node_number);
337331
}
338332

339333
// Test for allocations on numa nodes with interleave mode enabled.
@@ -363,11 +357,11 @@ TEST_F(testNuma, checkModeInterleave) {
363357

364358
// Test where each page will be allocated.
365359
// Get the first numa node for ptr; Each next page is expected to be on next nodes.
366-
size_t index = getNumaNodeByPtr((char *)ptr);
360+
int index = 0;
361+
ASSERT_NO_FATAL_FAILURE(getNumaNodeByPtr(ptr, &index));
367362
for (size_t i = 1; i < (size_t)pages_num; i++) {
368363
index = (index + 1) % numa_nodes.size();
369-
ASSERT_EQ(numa_nodes[index],
370-
getNumaNodeByPtr((char *)ptr + page_size * i));
364+
EXPECT_NODE_EQ((char *)ptr + page_size * i, numa_nodes[index]);
371365
}
372366

373367
bitmask *retrieved_nodemask = retrieve_nodemask(ptr);
@@ -407,13 +401,11 @@ TEST_F(testNuma, checkModeInterleaveCustomPartSize) {
407401
memset(ptr, 0xFF, size);
408402
// Test where each page will be allocated.
409403
// Get the first numa node for ptr; Each next part is expected to be on next nodes.
410-
size_t index = getNumaNodeByPtr((char *)ptr);
404+
int index = 0;
405+
ASSERT_NO_FATAL_FAILURE(getNumaNodeByPtr(ptr, &index));
411406
for (size_t i = 0; i < (size_t)part_num; i++) {
412407
for (size_t j = 0; j < part_size; j += page_size) {
413-
EXPECT_EQ(numa_nodes[index],
414-
getNumaNodeByPtr((char *)ptr + part_size * i + j))
415-
<< "for ptr " << ptr << " + " << part_size << " * " << i
416-
<< " + " << j;
408+
ASSERT_NODE_EQ((char *)ptr + part_size * i + j, numa_nodes[index]);
417409
}
418410
index = (index + 1) % numa_nodes.size();
419411
}
@@ -425,7 +417,7 @@ TEST_F(testNuma, checkModeInterleaveCustomPartSize) {
425417
ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS);
426418
ASSERT_NE(ptr, nullptr);
427419
memset(ptr, 0xFF, size);
428-
EXPECT_EQ(numa_nodes[index], getNumaNodeByPtr(ptr));
420+
EXPECT_NODE_EQ(ptr, numa_nodes[index]);
429421
umfMemoryProviderFree(os_memory_provider, ptr, size);
430422
}
431423

@@ -627,7 +619,10 @@ TEST_F(testNuma, checkModeBindOnAllNodes) {
627619

628620
// 'ptr' must point to an initialized value before retrieving its numa node
629621
memset(ptr, 0xFF, alloc_size);
630-
unsigned retrieved_numa_node_number = (unsigned)getNumaNodeByPtr(ptr);
622+
623+
int node;
624+
ASSERT_NO_FATAL_FAILURE(getNumaNodeByPtr(ptr, &node));
625+
unsigned retrieved_numa_node_number = (unsigned)node;
631626

632627
int read_cpu = sched_getcpu();
633628
int read_numa_node = numa_node_of_cpu(read_cpu);

0 commit comments

Comments
 (0)