Skip to content

Commit 2a0bef7

Browse files
committed
Increase refcount to ze_loader library when Level Zero provider is used
1 parent f046ffd commit 2a0bef7

File tree

6 files changed

+58
-20
lines changed

6 files changed

+58
-20
lines changed

include/umf/base.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
*
3-
* Copyright (C) 2023-2024 Intel Corporation
3+
* Copyright (C) 2023-2025 Intel Corporation
44
*
55
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
66
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
@@ -45,6 +45,8 @@ typedef enum umf_result_t {
4545
UMF_RESULT_ERROR_NOT_SUPPORTED = 5, ///< Operation not supported
4646
UMF_RESULT_ERROR_USER_SPECIFIC =
4747
6, ///< Failure in user provider code (i.e in user provided callback)
48+
UMF_RESULT_ERROR_DEPENDENCY_UNAVAILABLE =
49+
7, ///< External required dependency is unavailable or missing
4850
UMF_RESULT_ERROR_UNKNOWN = 0x7ffffffe ///< Unknown or internal error
4951
} umf_result_t;
5052

src/libumf.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
*
3-
* Copyright (C) 2024 Intel Corporation
3+
* Copyright (C) 2024-2025 Intel Corporation
44
*
55
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
66
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
@@ -12,6 +12,7 @@
1212
#include "base_alloc_global.h"
1313
#include "ipc_cache.h"
1414
#include "memspace_internal.h"
15+
#include "provider_level_zero_internal.h"
1516
#include "provider_tracking.h"
1617
#include "utils_common.h"
1718
#include "utils_log.h"
@@ -79,6 +80,7 @@ void umfTearDown(void) {
7980
LOG_DEBUG("UMF base allocator destroyed");
8081

8182
fini_umfTearDown:
83+
fini_ze_global_state();
8284
LOG_DEBUG("UMF library finalized");
8385
}
8486
}

src/provider/provider_level_zero.c

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,18 @@
1414
#include <umf/memory_provider_ops.h>
1515
#include <umf/providers/provider_level_zero.h>
1616

17+
#include "provider_level_zero_internal.h"
18+
#include "utils_load_library.h"
1719
#include "utils_log.h"
1820

21+
static void *ze_lib_handle = NULL;
22+
23+
void fini_ze_global_state(void) {
24+
if (ze_lib_handle) {
25+
utils_close_library(ze_lib_handle);
26+
}
27+
}
28+
1929
#if defined(UMF_NO_LEVEL_ZERO_PROVIDER)
2030

2131
umf_result_t umfLevelZeroMemoryProviderParamsCreate(
@@ -105,7 +115,6 @@ umf_memory_provider_ops_t *umfLevelZeroMemoryProviderOps(void) {
105115
#include "utils_assert.h"
106116
#include "utils_common.h"
107117
#include "utils_concurrency.h"
108-
#include "utils_load_library.h"
109118
#include "utils_log.h"
110119
#include "utils_sanitizers.h"
111120
#include "ze_api.h"
@@ -207,32 +216,34 @@ static void init_ze_global_state(void) {
207216
#else
208217
const char *lib_name = "libze_loader.so";
209218
#endif
219+
void *lib_handle =
220+
utils_open_library(lib_name, UMF_UTIL_OPEN_LIBRARY_NO_LOAD);
210221
// check if Level Zero shared library is already loaded
211222
// we pass 0 as a handle to search the global symbol table
212223
*(void **)&g_ze_ops.zeMemAllocHost =
213-
utils_get_symbol_addr(0, "zeMemAllocHost", lib_name);
224+
utils_get_symbol_addr(lib_handle, "zeMemAllocHost", lib_name);
214225
*(void **)&g_ze_ops.zeMemAllocDevice =
215-
utils_get_symbol_addr(0, "zeMemAllocDevice", lib_name);
226+
utils_get_symbol_addr(lib_handle, "zeMemAllocDevice", lib_name);
216227
*(void **)&g_ze_ops.zeMemAllocShared =
217-
utils_get_symbol_addr(0, "zeMemAllocShared", lib_name);
228+
utils_get_symbol_addr(lib_handle, "zeMemAllocShared", lib_name);
218229
*(void **)&g_ze_ops.zeMemFree =
219-
utils_get_symbol_addr(0, "zeMemFree", lib_name);
230+
utils_get_symbol_addr(lib_handle, "zeMemFree", lib_name);
220231
*(void **)&g_ze_ops.zeMemGetIpcHandle =
221-
utils_get_symbol_addr(0, "zeMemGetIpcHandle", lib_name);
232+
utils_get_symbol_addr(lib_handle, "zeMemGetIpcHandle", lib_name);
222233
*(void **)&g_ze_ops.zeMemPutIpcHandle =
223-
utils_get_symbol_addr(0, "zeMemPutIpcHandle", lib_name);
234+
utils_get_symbol_addr(lib_handle, "zeMemPutIpcHandle", lib_name);
224235
*(void **)&g_ze_ops.zeMemOpenIpcHandle =
225-
utils_get_symbol_addr(0, "zeMemOpenIpcHandle", lib_name);
236+
utils_get_symbol_addr(lib_handle, "zeMemOpenIpcHandle", lib_name);
226237
*(void **)&g_ze_ops.zeMemCloseIpcHandle =
227-
utils_get_symbol_addr(0, "zeMemCloseIpcHandle", lib_name);
228-
*(void **)&g_ze_ops.zeContextMakeMemoryResident =
229-
utils_get_symbol_addr(0, "zeContextMakeMemoryResident", lib_name);
238+
utils_get_symbol_addr(lib_handle, "zeMemCloseIpcHandle", lib_name);
239+
*(void **)&g_ze_ops.zeContextMakeMemoryResident = utils_get_symbol_addr(
240+
lib_handle, "zeContextMakeMemoryResident", lib_name);
230241
*(void **)&g_ze_ops.zeDeviceGetProperties =
231-
utils_get_symbol_addr(0, "zeDeviceGetProperties", lib_name);
242+
utils_get_symbol_addr(lib_handle, "zeDeviceGetProperties", lib_name);
232243
*(void **)&g_ze_ops.zeMemFreeExt =
233-
utils_get_symbol_addr(0, "zeMemFreeExt", lib_name);
244+
utils_get_symbol_addr(lib_handle, "zeMemFreeExt", lib_name);
234245
*(void **)&g_ze_ops.zeMemGetAllocProperties =
235-
utils_get_symbol_addr(0, "zeMemGetAllocProperties", lib_name);
246+
utils_get_symbol_addr(lib_handle, "zeMemGetAllocProperties", lib_name);
236247

237248
if (!g_ze_ops.zeMemAllocHost || !g_ze_ops.zeMemAllocDevice ||
238249
!g_ze_ops.zeMemAllocShared || !g_ze_ops.zeMemFree ||
@@ -244,7 +255,10 @@ static void init_ze_global_state(void) {
244255
// starting from Level Zero 1.6
245256
LOG_ERR("Required Level Zero symbols not found.");
246257
Init_ze_global_state_failed = true;
258+
utils_close_library(lib_handle);
259+
return;
247260
}
261+
ze_lib_handle = lib_handle;
248262
}
249263

250264
umf_result_t umfLevelZeroMemoryProviderParamsCreate(
@@ -551,7 +565,7 @@ static umf_result_t ze_memory_provider_initialize(void *params,
551565
utils_init_once(&ze_is_initialized, init_ze_global_state);
552566
if (Init_ze_global_state_failed) {
553567
LOG_ERR("Loading Level Zero symbols failed");
554-
return UMF_RESULT_ERROR_UNKNOWN;
568+
return UMF_RESULT_ERROR_DEPENDENCY_UNAVAILABLE;
555569
}
556570

557571
ze_memory_provider_t *ze_provider =
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/*
2+
*
3+
* Copyright (C) 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+
10+
void fini_ze_global_state(void);

src/utils/utils_load_library.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
*
3-
* Copyright (C) 2024 Intel Corporation
3+
* Copyright (C) 2024-2025 Intel Corporation
44
*
55
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
66
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
@@ -32,7 +32,11 @@
3232
#ifdef _WIN32
3333

3434
void *utils_open_library(const char *filename, int userFlags) {
35-
(void)userFlags; //unused for win
35+
if (userFlags & UMF_UTIL_OPEN_LIBRARY_NO_LOAD) {
36+
HMODULE hModule;
37+
BOLL ret = GetModuleHandleEx(0, TEXT(filename), &hModule);
38+
return ret ? hModule : NULL;
39+
}
3640
return LoadLibrary(TEXT(filename));
3741
}
3842

@@ -66,6 +70,9 @@ void *utils_open_library(const char *filename, int userFlags) {
6670
if (userFlags & UMF_UTIL_OPEN_LIBRARY_GLOBAL) {
6771
dlopenFlags |= RTLD_GLOBAL;
6872
}
73+
if (userFlags & UMF_UTIL_OPEN_LIBRARY_NO_LOAD) {
74+
dlopenFlags |= RTLD_NOLOAD;
75+
}
6976

7077
void *handle = dlopen(filename, dlopenFlags);
7178
if (handle == NULL) {

src/utils/utils_load_library.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
*
3-
* Copyright (C) 2024 Intel Corporation
3+
* Copyright (C) 2024-2025 Intel Corporation
44
*
55
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
66
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
@@ -17,7 +17,10 @@
1717
#ifdef __cplusplus
1818
extern "C" {
1919
#endif
20+
// The symbols defined by this library will be made available for symbol resolution of subsequently loaded libraries.
2021
#define UMF_UTIL_OPEN_LIBRARY_GLOBAL 1
22+
// Don't load the library. utils_open_library succeeds if the library is already loaded.
23+
#define UMF_UTIL_OPEN_LIBRARY_NO_LOAD 1 << 1
2124

2225
void *utils_open_library(const char *filename, int userFlags);
2326
int utils_close_library(void *handle);

0 commit comments

Comments
 (0)