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
+ ze_lib_handle = NULL ;
27
+ }
28
+ }
29
+
19
30
#if defined(UMF_NO_LEVEL_ZERO_PROVIDER )
20
31
21
32
umf_result_t umfLevelZeroMemoryProviderParamsCreate (
@@ -105,7 +116,6 @@ umf_memory_provider_ops_t *umfLevelZeroMemoryProviderOps(void) {
105
116
#include "utils_assert.h"
106
117
#include "utils_common.h"
107
118
#include "utils_concurrency.h"
108
- #include "utils_load_library.h"
109
119
#include "utils_log.h"
110
120
#include "utils_sanitizers.h"
111
121
#include "ze_api.h"
@@ -207,32 +217,41 @@ static void init_ze_global_state(void) {
207
217
#else
208
218
const char * lib_name = "libze_loader.so" ;
209
219
#endif
210
- // check if Level Zero shared library is already loaded
211
- // we pass 0 as a handle to search the global symbol table
220
+ // The Level Zero shared library should be already loaded by the user
221
+ // of the Level Zero provider. UMF just want to reuse it
222
+ // and increase the reference count to the the Level Zero shared library.
223
+ void * lib_handle =
224
+ utils_open_library (lib_name , UMF_UTIL_OPEN_LIBRARY_NO_LOAD );
225
+ if (!lib_handle ) {
226
+ LOG_ERR ("Failed to open Level Zero shared library" );
227
+ Init_ze_global_state_failed = true;
228
+ return ;
229
+ }
230
+
212
231
* (void * * )& g_ze_ops .zeMemAllocHost =
213
- utils_get_symbol_addr (0 , "zeMemAllocHost" , lib_name );
232
+ utils_get_symbol_addr (lib_handle , "zeMemAllocHost" , lib_name );
214
233
* (void * * )& g_ze_ops .zeMemAllocDevice =
215
- utils_get_symbol_addr (0 , "zeMemAllocDevice" , lib_name );
234
+ utils_get_symbol_addr (lib_handle , "zeMemAllocDevice" , lib_name );
216
235
* (void * * )& g_ze_ops .zeMemAllocShared =
217
- utils_get_symbol_addr (0 , "zeMemAllocShared" , lib_name );
236
+ utils_get_symbol_addr (lib_handle , "zeMemAllocShared" , lib_name );
218
237
* (void * * )& g_ze_ops .zeMemFree =
219
- utils_get_symbol_addr (0 , "zeMemFree" , lib_name );
238
+ utils_get_symbol_addr (lib_handle , "zeMemFree" , lib_name );
220
239
* (void * * )& g_ze_ops .zeMemGetIpcHandle =
221
- utils_get_symbol_addr (0 , "zeMemGetIpcHandle" , lib_name );
240
+ utils_get_symbol_addr (lib_handle , "zeMemGetIpcHandle" , lib_name );
222
241
* (void * * )& g_ze_ops .zeMemPutIpcHandle =
223
- utils_get_symbol_addr (0 , "zeMemPutIpcHandle" , lib_name );
242
+ utils_get_symbol_addr (lib_handle , "zeMemPutIpcHandle" , lib_name );
224
243
* (void * * )& g_ze_ops .zeMemOpenIpcHandle =
225
- utils_get_symbol_addr (0 , "zeMemOpenIpcHandle" , lib_name );
244
+ utils_get_symbol_addr (lib_handle , "zeMemOpenIpcHandle" , lib_name );
226
245
* (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 );
246
+ utils_get_symbol_addr (lib_handle , "zeMemCloseIpcHandle" , lib_name );
247
+ * (void * * )& g_ze_ops .zeContextMakeMemoryResident = utils_get_symbol_addr (
248
+ lib_handle , "zeContextMakeMemoryResident" , lib_name );
230
249
* (void * * )& g_ze_ops .zeDeviceGetProperties =
231
- utils_get_symbol_addr (0 , "zeDeviceGetProperties" , lib_name );
250
+ utils_get_symbol_addr (lib_handle , "zeDeviceGetProperties" , lib_name );
232
251
* (void * * )& g_ze_ops .zeMemFreeExt =
233
- utils_get_symbol_addr (0 , "zeMemFreeExt" , lib_name );
252
+ utils_get_symbol_addr (lib_handle , "zeMemFreeExt" , lib_name );
234
253
* (void * * )& g_ze_ops .zeMemGetAllocProperties =
235
- utils_get_symbol_addr (0 , "zeMemGetAllocProperties" , lib_name );
254
+ utils_get_symbol_addr (lib_handle , "zeMemGetAllocProperties" , lib_name );
236
255
237
256
if (!g_ze_ops .zeMemAllocHost || !g_ze_ops .zeMemAllocDevice ||
238
257
!g_ze_ops .zeMemAllocShared || !g_ze_ops .zeMemFree ||
@@ -244,7 +263,10 @@ static void init_ze_global_state(void) {
244
263
// starting from Level Zero 1.6
245
264
LOG_ERR ("Required Level Zero symbols not found." );
246
265
Init_ze_global_state_failed = true;
266
+ utils_close_library (lib_handle );
267
+ return ;
247
268
}
269
+ ze_lib_handle = lib_handle ;
248
270
}
249
271
250
272
umf_result_t umfLevelZeroMemoryProviderParamsCreate (
@@ -551,7 +573,7 @@ static umf_result_t ze_memory_provider_initialize(void *params,
551
573
utils_init_once (& ze_is_initialized , init_ze_global_state );
552
574
if (Init_ze_global_state_failed ) {
553
575
LOG_ERR ("Loading Level Zero symbols failed" );
554
- return UMF_RESULT_ERROR_UNKNOWN ;
576
+ return UMF_RESULT_ERROR_DEPENDENCY_UNAVAILABLE ;
555
577
}
556
578
557
579
ze_memory_provider_t * ze_provider =
0 commit comments