Skip to content

Commit 2e25a3a

Browse files
committed
Add missing checks and comments for umf_numa_mode_t
To be consistent with linux mbind behavior. On windows, UMF_NUMA_MODE_BIND and UMF_NUMA_MODE_INTERLEAVE will not be supported for now (the only mode we can support is UMF_NUMA_MODE_PREFERRED).
1 parent 5a9b468 commit 2e25a3a

File tree

3 files changed

+50
-7
lines changed

3 files changed

+50
-7
lines changed

include/umf/providers/provider_os_memory.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@ typedef enum umf_numa_mode_t {
4242
/// On linux this corresponds to MPOL_DEFAULT. If this mode is specified,
4343
/// nodemask must be NULL and maxnode must be 0.
4444
UMF_NUMA_MODE_BIND, ///< Restricts memory allocation to nodes specified in nodemask. Allocations
45-
/// might come from any of the allowed nodes.
45+
/// might come from any of the allowed nodes. Nodemask must specify at least one node.
4646
UMF_NUMA_MODE_INTERLEAVE, ///< Interleaves memory allocations across the set of nodes specified in nodemask.
47+
/// Nodemask must specify at least one node.
4748
UMF_NUMA_MODE_PREFERRED, ///< Specifies preferred node for allocation. If allocation cannot be fulfilled,
4849
/// memory will be allocated from other nodes.
4950
UMF_NUMA_MODE_LOCAL, ///< The memory is allocated on the node of the CPU that triggered the allocation.

src/provider/provider_os_memory.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,16 @@ static hwloc_membind_policy_t translate_numa_mode(umf_numa_mode_t mode,
146146
}
147147
return HWLOC_MEMBIND_DEFAULT;
148148
case UMF_NUMA_MODE_BIND:
149+
if (nodemaskEmpty) {
150+
// nodeset must not be empty
151+
return -1;
152+
}
149153
return HWLOC_MEMBIND_BIND;
150154
case UMF_NUMA_MODE_INTERLEAVE:
155+
if (nodemaskEmpty) {
156+
// nodeset must not be empty
157+
return -1;
158+
}
151159
return HWLOC_MEMBIND_INTERLEAVE;
152160
case UMF_NUMA_MODE_PREFERRED:
153161
return HWLOC_MEMBIND_BIND;

test/provider_os_memory.cpp

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,21 +126,55 @@ static void test_alloc_failure(umf_memory_provider_handle_t provider,
126126

127127
// negative tests for umfMemoryProviderCreate()
128128

129-
TEST_F(test, create_WRONG_NUMA_MODE) {
129+
static umf_result_t create_os_provider_with_mode(umf_numa_mode_t mode,
130+
unsigned long *nodemask,
131+
unsigned long maxnode) {
130132
umf_result_t umf_result;
131133
umf_memory_provider_handle_t os_memory_provider = nullptr;
132134
umf_os_memory_provider_params_t os_memory_provider_params =
133135
umfOsMemoryProviderParamsDefault();
134136

135-
// NUMA binding mode not supported for UMF_VISIBILITY_SHARED
136-
os_memory_provider_params.visibility = UMF_VISIBILITY_SHARED;
137-
os_memory_provider_params.numa_mode = UMF_NUMA_MODE_BIND;
137+
os_memory_provider_params.numa_mode = mode;
138+
os_memory_provider_params.nodemask = nodemask;
139+
os_memory_provider_params.maxnode = maxnode;
138140

139141
umf_result = umfMemoryProviderCreate(umfOsMemoryProviderOps(),
140142
&os_memory_provider_params,
141143
&os_memory_provider);
142-
ASSERT_EQ(umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
143-
ASSERT_EQ(os_memory_provider, nullptr);
144+
if (umf_result == UMF_RESULT_SUCCESS) {
145+
EXPECT_NE(os_memory_provider, nullptr);
146+
umfMemoryProviderDestroy(os_memory_provider);
147+
} else {
148+
EXPECT_EQ(os_memory_provider, nullptr);
149+
}
150+
151+
return umf_result;
152+
}
153+
154+
static unsigned long valid_nodemask = 0x1;
155+
static unsigned long valid_maxnode = 2;
156+
157+
TEST_F(test, create_WRONG_NUMA_MODE_DEFAULT) {
158+
auto ret = create_os_provider_with_mode(UMF_NUMA_MODE_DEFAULT,
159+
&valid_nodemask, valid_maxnode);
160+
ASSERT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
161+
}
162+
163+
TEST_F(test, create_WRONG_NUMA_MODE_LOCAL) {
164+
auto ret = create_os_provider_with_mode(UMF_NUMA_MODE_LOCAL,
165+
&valid_nodemask, valid_maxnode);
166+
ASSERT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
167+
}
168+
169+
TEST_F(test, create_WRONG_NUMA_MODE_BIND) {
170+
auto ret = create_os_provider_with_mode(UMF_NUMA_MODE_BIND, nullptr, 0);
171+
ASSERT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
172+
}
173+
174+
TEST_F(test, create_WRONG_NUMA_MODE_INTERLEAVE) {
175+
auto ret =
176+
create_os_provider_with_mode(UMF_NUMA_MODE_INTERLEAVE, nullptr, 0);
177+
ASSERT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
144178
}
145179

146180
// positive tests using test_alloc_free_success

0 commit comments

Comments
 (0)