Skip to content

Commit 3a4a450

Browse files
Merge pull request #1374 from lukaszstolarczuk/tests-memtarget
memtarget & memcapacity: tests and fixes
2 parents b894c77 + 9087e18 commit 3a4a450

File tree

5 files changed

+126
-31
lines changed

5 files changed

+126
-31
lines changed

include/umf/memspace.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ umfMemoryProviderCreateFromMemspace(umf_const_memspace_handle_t hMemspace,
4646
umf_const_mempolicy_handle_t hPolicy,
4747
umf_memory_provider_handle_t *hProvider);
4848
///
49-
/// \brief Creates new memspace from array of NUMA node ids.
49+
/// \brief Creates new memspace from an array of NUMA node ids.
5050
/// \param nodeIds array of NUMA node ids
51-
/// \param numIds size of the array
51+
/// \param numIds size of the array; it has to be greater than 0
5252
/// \param hMemspace [out] handle to the newly created memspace
5353
/// \return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
5454
///

src/memspace.c

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,8 @@ static int propertyCmp(const void *a, const void *b) {
204204

205205
umf_result_t umfMemspaceSortDesc(umf_memspace_handle_t hMemspace,
206206
umfGetPropertyFn getProperty) {
207-
if (!hMemspace || !getProperty) {
208-
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
209-
}
207+
assert(hMemspace);
208+
assert(getProperty);
210209

211210
struct memtarget_sort_entry *entries = umf_ba_global_alloc(
212211
sizeof(struct memtarget_sort_entry) * hMemspace->size);
@@ -241,9 +240,8 @@ umf_result_t umfMemspaceSortDesc(umf_memspace_handle_t hMemspace,
241240
umf_result_t umfMemspaceFilter(umf_const_memspace_handle_t hMemspace,
242241
umfGetTargetFn getTarget,
243242
umf_memspace_handle_t *filteredMemspace) {
244-
if (!hMemspace || !getTarget) {
245-
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
246-
}
243+
assert(hMemspace);
244+
assert(getTarget);
247245

248246
umf_memtarget_handle_t *uniqueBestNodes =
249247
umf_ba_global_alloc(hMemspace->size * sizeof(*uniqueBestNodes));
@@ -389,6 +387,7 @@ umfMemspaceMemtargetRemove(umf_memspace_handle_t hMemspace,
389387
if (!hMemspace || !hMemtarget) {
390388
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
391389
}
390+
392391
unsigned i;
393392
for (i = 0; i < hMemspace->size; i++) {
394393
int cmp;
@@ -409,10 +408,16 @@ umfMemspaceMemtargetRemove(umf_memspace_handle_t hMemspace,
409408
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
410409
}
411410

412-
umf_memtarget_handle_t *newNodes =
413-
umf_ba_global_alloc(sizeof(*newNodes) * (hMemspace->size - 1));
414-
if (!newNodes) {
415-
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
411+
umf_memtarget_handle_t *newNodes = NULL;
412+
413+
if (hMemspace->size == 1) {
414+
LOG_DEBUG("Removing the last memory target from the memspace.");
415+
} else {
416+
newNodes =
417+
umf_ba_global_alloc(sizeof(*newNodes) * (hMemspace->size - 1));
418+
if (!newNodes) {
419+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
420+
}
416421
}
417422

418423
for (unsigned j = 0, z = 0; j < hMemspace->size; j++) {
@@ -433,10 +438,8 @@ umfMemspaceMemtargetRemove(umf_memspace_handle_t hMemspace,
433438
static int umfMemspaceFilterHelper(umf_memspace_handle_t memspace,
434439
umf_memspace_filter_func_t filter,
435440
void *args) {
436-
437-
if (!memspace || !filter) {
438-
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
439-
}
441+
assert(memspace);
442+
assert(filter);
440443

441444
size_t idx = 0;
442445
int ret;

src/memtarget.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,8 @@
2020
umf_result_t umfMemtargetCreate(const umf_memtarget_ops_t *ops, void *params,
2121
umf_memtarget_handle_t *memoryTarget) {
2222
libumfInit();
23-
if (!ops || !memoryTarget) {
24-
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
25-
}
23+
assert(ops);
24+
assert(memoryTarget);
2625

2726
umf_memtarget_handle_t target =
2827
umf_ba_global_alloc(sizeof(umf_memtarget_t));
@@ -93,9 +92,9 @@ umf_result_t umfMemtargetGetCapacity(umf_const_memtarget_handle_t memoryTarget,
9392
umf_result_t umfMemtargetGetBandwidth(umf_memtarget_handle_t srcMemoryTarget,
9493
umf_memtarget_handle_t dstMemoryTarget,
9594
size_t *bandwidth) {
96-
if (!srcMemoryTarget || !dstMemoryTarget || !bandwidth) {
97-
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
98-
}
95+
assert(srcMemoryTarget);
96+
assert(dstMemoryTarget);
97+
assert(bandwidth);
9998

10099
return srcMemoryTarget->ops->get_bandwidth(
101100
srcMemoryTarget->priv, dstMemoryTarget->priv, bandwidth);
@@ -104,9 +103,9 @@ umf_result_t umfMemtargetGetBandwidth(umf_memtarget_handle_t srcMemoryTarget,
104103
umf_result_t umfMemtargetGetLatency(umf_memtarget_handle_t srcMemoryTarget,
105104
umf_memtarget_handle_t dstMemoryTarget,
106105
size_t *latency) {
107-
if (!srcMemoryTarget || !dstMemoryTarget || !latency) {
108-
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
109-
}
106+
assert(srcMemoryTarget);
107+
assert(dstMemoryTarget);
108+
assert(latency);
110109

111110
return srcMemoryTarget->ops->get_latency(srcMemoryTarget->priv,
112111
dstMemoryTarget->priv, latency);

test/memspaces/memspace.cpp

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2024 Intel Corporation
1+
// Copyright (C) 2024-2025 Intel Corporation
22
// Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
33
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
44

@@ -35,9 +35,33 @@ TEST_F(emptyMemspace, create_pool) {
3535
ASSERT_EQ(pool, nullptr);
3636
}
3737

38-
TEST_F(emptyMemspace, create_provider) {
38+
TEST_F(emptyMemspace, invalid_create_from_memspace) {
3939
umf_memory_provider_handle_t provider = nullptr;
40-
auto ret = umfMemoryProviderCreateFromMemspace(memspace, NULL, &provider);
41-
ASSERT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
42-
ASSERT_EQ(provider, nullptr);
40+
umf_mempolicy_handle_t policy = nullptr;
41+
42+
// invalid memspace
43+
umf_result_t ret =
44+
umfMemoryProviderCreateFromMemspace(NULL, policy, &provider);
45+
EXPECT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
46+
EXPECT_EQ(provider, nullptr);
47+
48+
// invalid provider
49+
ret = umfMemoryProviderCreateFromMemspace(memspace, policy, nullptr);
50+
EXPECT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
51+
52+
// Valid params, but memspace is empty
53+
ret = umfMemoryProviderCreateFromMemspace(memspace, policy, &provider);
54+
EXPECT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
55+
EXPECT_EQ(provider, nullptr);
56+
}
57+
58+
TEST_F(emptyMemspace, invalid_clone) {
59+
umf_const_memspace_handle_t memspace = nullptr;
60+
umf_memspace_handle_t out_memspace = nullptr;
61+
62+
umf_result_t ret = umfMemspaceClone(memspace, nullptr);
63+
EXPECT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
64+
65+
ret = umfMemspaceClone(nullptr, &out_memspace);
66+
EXPECT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
4367
}

test/memspaces/memtarget.cpp

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2024 Intel Corporation
1+
// Copyright (C) 2024-2025 Intel Corporation
22
// Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
33
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
44

@@ -103,3 +103,72 @@ TEST_F(numaNodesTest, getIdInvalid) {
103103
ret = umfMemtargetGetId(hTarget, NULL);
104104
EXPECT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
105105
}
106+
107+
TEST_F(test, memTargetInvalidAdd) {
108+
umf_const_memspace_handle_t const_memspace = umfMemspaceHostAllGet();
109+
umf_memspace_handle_t memspace = nullptr;
110+
umf_result_t ret = umfMemspaceClone(const_memspace, &memspace);
111+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
112+
ASSERT_NE(memspace, nullptr);
113+
umf_const_memtarget_handle_t memtarget =
114+
umfMemspaceMemtargetGet(memspace, 0);
115+
116+
ret = umfMemspaceMemtargetAdd(memspace, nullptr);
117+
EXPECT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
118+
119+
ret = umfMemspaceMemtargetAdd(nullptr, memtarget);
120+
EXPECT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
121+
122+
// Try to add the same memtarget again
123+
ret = umfMemspaceMemtargetAdd(memspace, memtarget);
124+
EXPECT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
125+
126+
ret = umfMemspaceDestroy(memspace);
127+
EXPECT_EQ(ret, UMF_RESULT_SUCCESS);
128+
}
129+
130+
TEST_F(test, memTargetInvalidRemove) {
131+
umf_const_memspace_handle_t const_memspace = umfMemspaceHostAllGet();
132+
umf_memspace_handle_t memspace = nullptr;
133+
umf_result_t ret = umfMemspaceClone(const_memspace, &memspace);
134+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
135+
ASSERT_NE(memspace, nullptr);
136+
umf_const_memtarget_handle_t memtarget =
137+
umfMemspaceMemtargetGet(memspace, 0);
138+
139+
ret = umfMemspaceMemtargetRemove(memspace, nullptr);
140+
EXPECT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
141+
142+
ret = umfMemspaceMemtargetRemove(nullptr, memtarget);
143+
EXPECT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
144+
145+
ret = umfMemspaceDestroy(memspace);
146+
EXPECT_EQ(ret, UMF_RESULT_SUCCESS);
147+
}
148+
149+
TEST_F(test, memTargetRemoveAll) {
150+
umf_const_memspace_handle_t const_memspace = umfMemspaceHostAllGet();
151+
umf_memspace_handle_t memspace = nullptr;
152+
umf_result_t ret = umfMemspaceClone(const_memspace, &memspace);
153+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
154+
ASSERT_NE(memspace, nullptr);
155+
umf_const_memtarget_handle_t memtarget = nullptr;
156+
157+
// Remove all memtargets
158+
size_t len = umfMemspaceMemtargetNum(memspace);
159+
ASSERT_GT(len, 0);
160+
size_t i = len - 1;
161+
do {
162+
memtarget = umfMemspaceMemtargetGet(memspace, i);
163+
EXPECT_NE(memtarget, nullptr);
164+
ret = umfMemspaceMemtargetRemove(memspace, memtarget);
165+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
166+
} while (i-- > 0);
167+
168+
// Try to remove the last one for the second time
169+
ret = umfMemspaceMemtargetRemove(memspace, memtarget);
170+
EXPECT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
171+
172+
ret = umfMemspaceDestroy(memspace);
173+
EXPECT_EQ(ret, UMF_RESULT_SUCCESS);
174+
}

0 commit comments

Comments
 (0)