Skip to content

Commit 272bd66

Browse files
committed
Lukasz and Rafal comments applied
1 parent d13a3ef commit 272bd66

File tree

7 files changed

+114
-58
lines changed

7 files changed

+114
-58
lines changed

src/libumf.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ EXPORTS
1919
umfCUDAMemoryProviderParamsSetContext
2020
umfCUDAMemoryProviderParamsSetDevice
2121
umfCUDAMemoryProviderParamsSetMemoryType
22-
umfLevelZeroMemoryProviderParamsSetResidentDevices
2322
umfDevDaxMemoryProviderOps
2423
umfDevDaxMemoryProviderParamsCreate
2524
umfDevDaxMemoryProviderParamsDestroy
@@ -42,6 +41,7 @@ EXPORTS
4241
umfLevelZeroMemoryProviderParamsSetContext
4342
umfLevelZeroMemoryProviderParamsSetDevice
4443
umfLevelZeroMemoryProviderParamsSetMemoryType
44+
umfLevelZeroMemoryProviderParamsSetResidentDevices
4545
umfMemoryProviderAlloc
4646
umfMemoryProviderAllocationMerge
4747
umfMemoryProviderAllocationSplit

src/provider/provider_level_zero.c

Lines changed: 54 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,43 @@ static ze_relaxed_allocation_limits_exp_desc_t relaxed_device_allocation_desc =
422422
.pNext = NULL,
423423
.flags = ZE_RELAXED_ALLOCATION_LIMITS_EXP_FLAG_MAX_SIZE};
424424

425+
static umf_result_t ze_memory_provider_free_helper(void *provider, void *ptr,
426+
size_t bytes,
427+
int update_stats) {
428+
if (ptr == NULL) {
429+
return UMF_RESULT_SUCCESS;
430+
}
431+
432+
ze_memory_provider_t *ze_provider = (ze_memory_provider_t *)provider;
433+
umf_result_t ret;
434+
if (ze_provider->freePolicyFlags == 0) {
435+
ret = ze2umf_result(g_ze_ops.zeMemFree(ze_provider->context, ptr));
436+
} else {
437+
ze_memory_free_ext_desc_t desc = {
438+
.stype = ZE_STRUCTURE_TYPE_MEMORY_FREE_EXT_DESC,
439+
.pNext = NULL,
440+
.freePolicy = ze_provider->freePolicyFlags};
441+
442+
ret = ze2umf_result(
443+
g_ze_ops.zeMemFreeExt(ze_provider->context, &desc, ptr));
444+
}
445+
446+
if (ret != UMF_RESULT_SUCCESS) {
447+
return ret;
448+
}
449+
450+
if (update_stats) {
451+
provider_ctl_stats_free(ze_provider, bytes);
452+
}
453+
454+
return UMF_RESULT_SUCCESS;
455+
}
456+
457+
static umf_result_t ze_memory_provider_free(void *provider, void *ptr,
458+
size_t bytes) {
459+
return ze_memory_provider_free_helper(provider, ptr, bytes, 1);
460+
}
461+
425462
static umf_result_t ze_memory_provider_alloc_helper(void *provider, size_t size,
426463
size_t alignment,
427464
int update_stats,
@@ -488,10 +525,17 @@ static umf_result_t ze_memory_provider_alloc_helper(void *provider, size_t size,
488525
*resultPtr, size);
489526
if (ze_result != ZE_RESULT_SUCCESS) {
490527
utils_read_unlock(&ze_provider->resident_device_rwlock);
491-
LOG_DEBUG("making resident allocation %p of size:%lu on device %p "
492-
"failed with %d",
493-
*resultPtr, size, ze_provider->resident_device_handles[i],
494-
ze_result);
528+
LOG_ERR("making resident allocation %p of size:%lu on device %p "
529+
"failed with 0x%x",
530+
*resultPtr, size, ze_provider->resident_device_handles[i],
531+
ze_result);
532+
umf_result_t free_result =
533+
ze_memory_provider_free(ze_provider, *resultPtr, size);
534+
if (free_result != UMF_RESULT_SUCCESS) {
535+
LOG_ERR("failed to free memory with: 0x%x after failed making "
536+
"resident, free fail ignored",
537+
free_result);
538+
}
495539
return ze2umf_result(ze_result);
496540
}
497541
LOG_DEBUG("allocation %p of size:%lu made resident on device %p",
@@ -512,43 +556,6 @@ static umf_result_t ze_memory_provider_alloc(void *provider, size_t size,
512556
resultPtr);
513557
}
514558

515-
static umf_result_t ze_memory_provider_free_helper(void *provider, void *ptr,
516-
size_t bytes,
517-
int update_stats) {
518-
if (ptr == NULL) {
519-
return UMF_RESULT_SUCCESS;
520-
}
521-
522-
ze_memory_provider_t *ze_provider = (ze_memory_provider_t *)provider;
523-
umf_result_t ret;
524-
if (ze_provider->freePolicyFlags == 0) {
525-
ret = ze2umf_result(g_ze_ops.zeMemFree(ze_provider->context, ptr));
526-
} else {
527-
ze_memory_free_ext_desc_t desc = {
528-
.stype = ZE_STRUCTURE_TYPE_MEMORY_FREE_EXT_DESC,
529-
.pNext = NULL,
530-
.freePolicy = ze_provider->freePolicyFlags};
531-
532-
ret = ze2umf_result(
533-
g_ze_ops.zeMemFreeExt(ze_provider->context, &desc, ptr));
534-
}
535-
536-
if (ret != UMF_RESULT_SUCCESS) {
537-
return ret;
538-
}
539-
540-
if (update_stats) {
541-
provider_ctl_stats_free(ze_provider, bytes);
542-
}
543-
544-
return UMF_RESULT_SUCCESS;
545-
}
546-
547-
static umf_result_t ze_memory_provider_free(void *provider, void *ptr,
548-
size_t bytes) {
549-
return ze_memory_provider_free_helper(provider, ptr, bytes, 1);
550-
}
551-
552559
static umf_result_t query_min_page_size(ze_memory_provider_t *ze_provider,
553560
size_t *min_page_size) {
554561
assert(min_page_size);
@@ -997,8 +1004,8 @@ static int ze_memory_provider_resident_device_change_helper(uintptr_t key,
9971004

9981005
// TODO: add assertions to UMF and change it to be an assertion
9991006
if (info->props.base != (void *)key) {
1000-
LOG_ERR("key:%p is different than base:%p", (void *)key,
1001-
info->props.base);
1007+
LOG_FATAL("key:%p is different than base:%p", (void *)key,
1008+
info->props.base);
10021009
abort();
10031010
}
10041011

@@ -1060,8 +1067,7 @@ static umf_result_t ze_memory_provider_resident_device_change(void *provider,
10601067
if (ze_provider->resident_device_count ==
10611068
ze_provider->resident_device_capacity) {
10621069
const uint32_t new_capacity =
1063-
ze_provider->resident_device_capacity * 2 +
1064-
1; // +1 to work also with old capacity == 0
1070+
ze_provider->resident_device_capacity + 1;
10651071
ze_device_handle_t *new_handles =
10661072
umf_ba_global_alloc(sizeof(ze_device_handle_t) * new_capacity);
10671073
if (new_handles == NULL) {
@@ -1087,7 +1093,6 @@ static umf_result_t ze_memory_provider_resident_device_change(void *provider,
10871093
// found
10881094
if (is_adding) {
10891095
utils_write_unlock(&ze_provider->resident_device_rwlock);
1090-
// impossible for UR, should be an assertion
10911096
LOG_ERR("trying to add resident device:%p but the device is "
10921097
"already a peer of provider:%p",
10931098
ze_device, provider);
@@ -1109,6 +1114,9 @@ static umf_result_t ze_memory_provider_resident_device_change(void *provider,
11091114
.failed_changes = 0,
11101115
};
11111116

1117+
// This is "hacky" and it will not work if someone uses pool without tracker
1118+
// or just use provider without pool. It can be solved by keeping track of
1119+
// allocations by the provider like in os_provider.
11121120
umf_result_t result = umfMemoryTrackerIterateAll(
11131121
&ze_memory_provider_resident_device_change_helper, &privData);
11141122
if (result != UMF_RESULT_SUCCESS) {

test/common/CMakeLists.txt

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (C) 2023-2024 Intel Corporation
1+
# Copyright (C) 2023-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

@@ -21,16 +21,18 @@ add_umf_library(
2121
target_include_directories(umf_test_common
2222
PRIVATE ${UMF_CMAKE_SOURCE_DIR}/include)
2323

24-
add_library(umf_test_mocks STATIC level_zero_mocks.cpp)
24+
if(UMF_LEVEL_ZERO_ENABLED)
25+
add_library(umf_test_mocks STATIC level_zero_mocks.cpp)
2526

26-
target_link_libraries(umf_test_mocks GTest::gmock)
27+
target_link_libraries(umf_test_mocks GTest::gmock)
2728

28-
target_include_directories(
29-
umf_test_mocks
30-
PRIVATE ${UMF_CMAKE_SOURCE_DIR}/include ${UMF_CMAKE_SOURCE_DIR}/src
31-
${UMF_CMAKE_SOURCE_DIR}/src/utils)
29+
target_include_directories(
30+
umf_test_mocks
31+
PRIVATE ${UMF_CMAKE_SOURCE_DIR}/include ${UMF_CMAKE_SOURCE_DIR}/src
32+
${UMF_CMAKE_SOURCE_DIR}/src/utils)
3233

33-
add_library(umf_ze_loopback SHARED ze_loopback.h ze_loopback.cpp)
34-
target_include_directories(
35-
umf_ze_loopback PRIVATE ${ZE_LOADER_INCLUDE_DIRS} ${UMF_UTILS_DIR}
36-
${UMF_SRC_DIR} ${UMF_CMAKE_SOURCE_DIR}/include)
34+
add_library(umf_ze_loopback SHARED ze_loopback.h ze_loopback.cpp)
35+
target_include_directories(
36+
umf_ze_loopback PRIVATE ${ZE_LOADER_INCLUDE_DIRS} ${UMF_UTILS_DIR}
37+
${UMF_SRC_DIR} ${UMF_CMAKE_SOURCE_DIR}/include)
38+
endif()

test/common/level_zero_mocks.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
/*
2+
*
3+
* Copyright (C) 2023-2025 Intel Corporation
4+
*
5+
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
6+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
*
8+
*/
9+
110
#include "level_zero_mocks.h"
211
#include "umf/providers/provider_level_zero.h"
312
#include <cstdlib>

test/common/level_zero_mocks.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
/*
2+
*
3+
* Copyright (C) 2023-2025 Intel Corporation
4+
*
5+
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
6+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
*
8+
*/
9+
110
#ifndef UMF_PROVIDER_LEVEL_ZERO_MOCKS_H
211
#define UMF_PROVIDER_LEVEL_ZERO_MOCKS_H
312

test/common/ze_loopback.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
/*
2+
*
3+
* Copyright (C) 2023-2025 Intel Corporation
4+
*
5+
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
6+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
*
8+
*/
9+
110
#include "ze_loopback.h"
211
#include "utils_log.h"
312

test/pools/pool_residency.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,25 @@ TEST_F(PoolResidencyTestFixture,
126126
umfPoolFree(pool, ptr);
127127
}
128128

129+
TEST_F(PoolResidencyTestFixture,
130+
allocationThatFailedToBeMadeResidedShouldBeFreed) {
131+
initializeMemoryPool(l0mock.initializeMemoryProviderWithResidentDevices(
132+
OUR_DEVICE, {DEVICE_2}));
133+
134+
EXPECT_CALL(l0mock, zeMemAllocDevice(CONTEXT, _, _, _, OUR_DEVICE, _))
135+
.WillOnce(
136+
DoAll(SetArgPointee<5>(POINTER_0), Return(ZE_RESULT_SUCCESS)));
137+
EXPECT_CALL(l0mock, zeContextMakeMemoryResident(CONTEXT, DEVICE_2, _, _))
138+
.WillOnce(Return(ZE_RESULT_ERROR_DEVICE_LOST));
139+
EXPECT_CALL(l0mock, zeMemFree(CONTEXT, _))
140+
.WillOnce(Return(ZE_RESULT_ERROR_DEVICE_IN_LOW_POWER_STATE));
141+
142+
void *ptr = umfPoolMalloc(pool, 16 * 1024 * 1024);
143+
EXPECT_EQ(ptr, nullptr);
144+
145+
umfPoolFree(pool, ptr);
146+
}
147+
129148
int main(int argc, char **argv) {
130149
InitGoogleTest(&argc, argv);
131150
AddGlobalTestEnvironment(new MockedLevelZeroTestEnvironment);

0 commit comments

Comments
 (0)