14
14
#include <umf/memory_provider_ops.h>
15
15
#include <umf/providers/provider_level_zero.h>
16
16
17
+ #include "provider_level_zero_internal.h"
18
+ #include "utils_load_library.h"
17
19
#include "utils_log.h"
18
20
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
+
19
29
#if defined(UMF_NO_LEVEL_ZERO_PROVIDER )
20
30
21
31
umf_result_t umfLevelZeroMemoryProviderParamsCreate (
@@ -105,7 +115,6 @@ umf_memory_provider_ops_t *umfLevelZeroMemoryProviderOps(void) {
105
115
#include "utils_assert.h"
106
116
#include "utils_common.h"
107
117
#include "utils_concurrency.h"
108
- #include "utils_load_library.h"
109
118
#include "utils_log.h"
110
119
#include "utils_sanitizers.h"
111
120
#include "ze_api.h"
@@ -207,32 +216,34 @@ static void init_ze_global_state(void) {
207
216
#else
208
217
const char * lib_name = "libze_loader.so" ;
209
218
#endif
219
+ void * lib_handle =
220
+ utils_open_library (lib_name , UMF_UTIL_OPEN_LIBRARY_NO_LOAD );
210
221
// check if Level Zero shared library is already loaded
211
222
// we pass 0 as a handle to search the global symbol table
212
223
* (void * * )& g_ze_ops .zeMemAllocHost =
213
- utils_get_symbol_addr (0 , "zeMemAllocHost" , lib_name );
224
+ utils_get_symbol_addr (lib_handle , "zeMemAllocHost" , lib_name );
214
225
* (void * * )& g_ze_ops .zeMemAllocDevice =
215
- utils_get_symbol_addr (0 , "zeMemAllocDevice" , lib_name );
226
+ utils_get_symbol_addr (lib_handle , "zeMemAllocDevice" , lib_name );
216
227
* (void * * )& g_ze_ops .zeMemAllocShared =
217
- utils_get_symbol_addr (0 , "zeMemAllocShared" , lib_name );
228
+ utils_get_symbol_addr (lib_handle , "zeMemAllocShared" , lib_name );
218
229
* (void * * )& g_ze_ops .zeMemFree =
219
- utils_get_symbol_addr (0 , "zeMemFree" , lib_name );
230
+ utils_get_symbol_addr (lib_handle , "zeMemFree" , lib_name );
220
231
* (void * * )& g_ze_ops .zeMemGetIpcHandle =
221
- utils_get_symbol_addr (0 , "zeMemGetIpcHandle" , lib_name );
232
+ utils_get_symbol_addr (lib_handle , "zeMemGetIpcHandle" , lib_name );
222
233
* (void * * )& g_ze_ops .zeMemPutIpcHandle =
223
- utils_get_symbol_addr (0 , "zeMemPutIpcHandle" , lib_name );
234
+ utils_get_symbol_addr (lib_handle , "zeMemPutIpcHandle" , lib_name );
224
235
* (void * * )& g_ze_ops .zeMemOpenIpcHandle =
225
- utils_get_symbol_addr (0 , "zeMemOpenIpcHandle" , lib_name );
236
+ utils_get_symbol_addr (lib_handle , "zeMemOpenIpcHandle" , lib_name );
226
237
* (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 );
230
241
* (void * * )& g_ze_ops .zeDeviceGetProperties =
231
- utils_get_symbol_addr (0 , "zeDeviceGetProperties" , lib_name );
242
+ utils_get_symbol_addr (lib_handle , "zeDeviceGetProperties" , lib_name );
232
243
* (void * * )& g_ze_ops .zeMemFreeExt =
233
- utils_get_symbol_addr (0 , "zeMemFreeExt" , lib_name );
244
+ utils_get_symbol_addr (lib_handle , "zeMemFreeExt" , lib_name );
234
245
* (void * * )& g_ze_ops .zeMemGetAllocProperties =
235
- utils_get_symbol_addr (0 , "zeMemGetAllocProperties" , lib_name );
246
+ utils_get_symbol_addr (lib_handle , "zeMemGetAllocProperties" , lib_name );
236
247
237
248
if (!g_ze_ops .zeMemAllocHost || !g_ze_ops .zeMemAllocDevice ||
238
249
!g_ze_ops .zeMemAllocShared || !g_ze_ops .zeMemFree ||
@@ -244,7 +255,10 @@ static void init_ze_global_state(void) {
244
255
// starting from Level Zero 1.6
245
256
LOG_ERR ("Required Level Zero symbols not found." );
246
257
Init_ze_global_state_failed = true;
258
+ utils_close_library (lib_handle );
259
+ return ;
247
260
}
261
+ ze_lib_handle = lib_handle ;
248
262
}
249
263
250
264
umf_result_t umfLevelZeroMemoryProviderParamsCreate (
@@ -551,7 +565,7 @@ static umf_result_t ze_memory_provider_initialize(void *params,
551
565
utils_init_once (& ze_is_initialized , init_ze_global_state );
552
566
if (Init_ze_global_state_failed ) {
553
567
LOG_ERR ("Loading Level Zero symbols failed" );
554
- return UMF_RESULT_ERROR_UNKNOWN ;
568
+ return UMF_RESULT_ERROR_DEPENDENCY_UNAVAILABLE ;
555
569
}
556
570
557
571
ze_memory_provider_t * ze_provider =
0 commit comments