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+ ze_lib_handle = NULL ;
27+ }
28+ }
29+
1930#if defined(UMF_NO_LEVEL_ZERO_PROVIDER )
2031
2132umf_result_t umfLevelZeroMemoryProviderParamsCreate (
@@ -105,7 +116,6 @@ umf_memory_provider_ops_t *umfLevelZeroMemoryProviderOps(void) {
105116#include "utils_assert.h"
106117#include "utils_common.h"
107118#include "utils_concurrency.h"
108- #include "utils_load_library.h"
109119#include "utils_log.h"
110120#include "utils_sanitizers.h"
111121#include "ze_api.h"
@@ -207,32 +217,41 @@ static void init_ze_global_state(void) {
207217#else
208218 const char * lib_name = "libze_loader.so" ;
209219#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 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_FATAL ("Failed to open Level Zero shared library" );
227+ Init_ze_global_state_failed = true;
228+ return ;
229+ }
230+
212231 * (void * * )& g_ze_ops .zeMemAllocHost =
213- utils_get_symbol_addr (0 , "zeMemAllocHost" , lib_name );
232+ utils_get_symbol_addr (lib_handle , "zeMemAllocHost" , lib_name );
214233 * (void * * )& g_ze_ops .zeMemAllocDevice =
215- utils_get_symbol_addr (0 , "zeMemAllocDevice" , lib_name );
234+ utils_get_symbol_addr (lib_handle , "zeMemAllocDevice" , lib_name );
216235 * (void * * )& g_ze_ops .zeMemAllocShared =
217- utils_get_symbol_addr (0 , "zeMemAllocShared" , lib_name );
236+ utils_get_symbol_addr (lib_handle , "zeMemAllocShared" , lib_name );
218237 * (void * * )& g_ze_ops .zeMemFree =
219- utils_get_symbol_addr (0 , "zeMemFree" , lib_name );
238+ utils_get_symbol_addr (lib_handle , "zeMemFree" , lib_name );
220239 * (void * * )& g_ze_ops .zeMemGetIpcHandle =
221- utils_get_symbol_addr (0 , "zeMemGetIpcHandle" , lib_name );
240+ utils_get_symbol_addr (lib_handle , "zeMemGetIpcHandle" , lib_name );
222241 * (void * * )& g_ze_ops .zeMemPutIpcHandle =
223- utils_get_symbol_addr (0 , "zeMemPutIpcHandle" , lib_name );
242+ utils_get_symbol_addr (lib_handle , "zeMemPutIpcHandle" , lib_name );
224243 * (void * * )& g_ze_ops .zeMemOpenIpcHandle =
225- utils_get_symbol_addr (0 , "zeMemOpenIpcHandle" , lib_name );
244+ utils_get_symbol_addr (lib_handle , "zeMemOpenIpcHandle" , lib_name );
226245 * (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 );
230249 * (void * * )& g_ze_ops .zeDeviceGetProperties =
231- utils_get_symbol_addr (0 , "zeDeviceGetProperties" , lib_name );
250+ utils_get_symbol_addr (lib_handle , "zeDeviceGetProperties" , lib_name );
232251 * (void * * )& g_ze_ops .zeMemFreeExt =
233- utils_get_symbol_addr (0 , "zeMemFreeExt" , lib_name );
252+ utils_get_symbol_addr (lib_handle , "zeMemFreeExt" , lib_name );
234253 * (void * * )& g_ze_ops .zeMemGetAllocProperties =
235- utils_get_symbol_addr (0 , "zeMemGetAllocProperties" , lib_name );
254+ utils_get_symbol_addr (lib_handle , "zeMemGetAllocProperties" , lib_name );
236255
237256 if (!g_ze_ops .zeMemAllocHost || !g_ze_ops .zeMemAllocDevice ||
238257 !g_ze_ops .zeMemAllocShared || !g_ze_ops .zeMemFree ||
@@ -244,7 +263,10 @@ static void init_ze_global_state(void) {
244263 // starting from Level Zero 1.6
245264 LOG_FATAL ("Required Level Zero symbols not found." );
246265 Init_ze_global_state_failed = true;
266+ utils_close_library (lib_handle );
267+ return ;
247268 }
269+ ze_lib_handle = lib_handle ;
248270}
249271
250272umf_result_t umfLevelZeroMemoryProviderParamsCreate (
@@ -551,7 +573,7 @@ static umf_result_t ze_memory_provider_initialize(void *params,
551573 utils_init_once (& ze_is_initialized , init_ze_global_state );
552574 if (Init_ze_global_state_failed ) {
553575 LOG_FATAL ("Loading Level Zero symbols failed" );
554- return UMF_RESULT_ERROR_UNKNOWN ;
576+ return UMF_RESULT_ERROR_DEPENDENCY_UNAVAILABLE ;
555577 }
556578
557579 ze_memory_provider_t * ze_provider =
0 commit comments