@@ -75,6 +75,14 @@ umf_result_t umfLevelZeroMemoryProviderParamsSetResidentDevices(
7575 return UMF_RESULT_ERROR_NOT_SUPPORTED ;
7676}
7777
78+ umf_result_t umfLevelZeroMemoryProviderParamsSetFreePolicy (
79+ umf_level_zero_memory_provider_params_handle_t hParams ,
80+ umf_level_zero_memory_provider_free_policy_t policy ) {
81+ (void )hParams ;
82+ (void )policy ;
83+ return UMF_RESULT_ERROR_NOT_SUPPORTED ;
84+ }
85+
7886umf_memory_provider_ops_t * umfLevelZeroMemoryProviderOps (void ) {
7987 // not supported
8088 LOG_ERR ("L0 memory provider is disabled! (UMF_BUILD_LEVEL_ZERO_PROVIDER is "
@@ -107,6 +115,9 @@ typedef struct umf_level_zero_memory_provider_params_t {
107115 resident_device_handles ; ///< Array of devices for which the memory should be made resident
108116 uint32_t
109117 resident_device_count ; ///< Number of devices for which the memory should be made resident
118+
119+ umf_level_zero_memory_provider_free_policy_t
120+ freePolicy ; ///< Memory free policy
110121} umf_level_zero_memory_provider_params_t ;
111122
112123typedef struct ze_memory_provider_t {
@@ -118,6 +129,8 @@ typedef struct ze_memory_provider_t {
118129 uint32_t resident_device_count ;
119130
120131 ze_device_properties_t device_properties ;
132+
133+ ze_driver_memory_free_policy_ext_flags_t freePolicyFlags ;
121134} ze_memory_provider_t ;
122135
123136typedef struct ze_ops_t {
@@ -144,6 +157,8 @@ typedef struct ze_ops_t {
144157 size_t );
145158 ze_result_t (* zeDeviceGetProperties )(ze_device_handle_t ,
146159 ze_device_properties_t * );
160+ ze_result_t (* zeMemFreeExt )(ze_context_handle_t ,
161+ ze_memory_free_ext_desc_t * , void * );
147162} ze_ops_t ;
148163
149164static ze_ops_t g_ze_ops ;
@@ -197,6 +212,8 @@ static void init_ze_global_state(void) {
197212 utils_get_symbol_addr (0 , "zeContextMakeMemoryResident" , lib_name );
198213 * (void * * )& g_ze_ops .zeDeviceGetProperties =
199214 utils_get_symbol_addr (0 , "zeDeviceGetProperties" , lib_name );
215+ * (void * * )& g_ze_ops .zeMemFreeExt =
216+ utils_get_symbol_addr (0 , "zeMemFreeExt" , lib_name );
200217
201218 if (!g_ze_ops .zeMemAllocHost || !g_ze_ops .zeMemAllocDevice ||
202219 !g_ze_ops .zeMemAllocShared || !g_ze_ops .zeMemFree ||
@@ -232,6 +249,7 @@ umf_result_t umfLevelZeroMemoryProviderParamsCreate(
232249 params -> memory_type = UMF_MEMORY_TYPE_UNKNOWN ;
233250 params -> resident_device_handles = NULL ;
234251 params -> resident_device_count = 0 ;
252+ params -> freePolicy = UMF_LEVEL_ZERO_MEMORY_PROVIDER_FREE_POLICY_DEFAULT ;
235253
236254 * hParams = params ;
237255
@@ -308,6 +326,32 @@ umf_result_t umfLevelZeroMemoryProviderParamsSetResidentDevices(
308326 return UMF_RESULT_SUCCESS ;
309327}
310328
329+ umf_result_t umfLevelZeroMemoryProviderParamsSetFreePolicy (
330+ umf_level_zero_memory_provider_params_handle_t hParams ,
331+ umf_level_zero_memory_provider_free_policy_t policy ) {
332+ if (!hParams ) {
333+ LOG_ERR ("Level zero memory provider params handle is NULL" );
334+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
335+ }
336+
337+ hParams -> freePolicy = policy ;
338+ return UMF_RESULT_SUCCESS ;
339+ }
340+
341+ static ze_driver_memory_free_policy_ext_flags_t
342+ umfFreePolicyToZePolicy (umf_level_zero_memory_provider_free_policy_t policy ) {
343+ switch (policy ) {
344+ case UMF_LEVEL_ZERO_MEMORY_PROVIDER_FREE_POLICY_DEFAULT :
345+ return 0 ;
346+ case UMF_LEVEL_ZERO_MEMORY_PROVIDER_FREE_POLICY_BLOCKING_FREE :
347+ return ZE_DRIVER_MEMORY_FREE_POLICY_EXT_FLAG_BLOCKING_FREE ;
348+ case UMF_LEVEL_ZERO_MEMORY_PROVIDER_FREE_POLICY_DEFER_FREE :
349+ return ZE_DRIVER_MEMORY_FREE_POLICY_EXT_FLAG_DEFER_FREE ;
350+ default :
351+ return 0 ;
352+ }
353+ }
354+
311355static umf_result_t ze_memory_provider_initialize (void * params ,
312356 void * * provider ) {
313357 if (params == NULL ) {
@@ -351,6 +395,8 @@ static umf_result_t ze_memory_provider_initialize(void *params,
351395 ze_provider -> context = ze_params -> level_zero_context_handle ;
352396 ze_provider -> device = ze_params -> level_zero_device_handle ;
353397 ze_provider -> memory_type = (ze_memory_type_t )ze_params -> memory_type ;
398+ ze_provider -> freePolicyFlags =
399+ umfFreePolicyToZePolicy (ze_params -> freePolicy );
354400
355401 memset (& ze_provider -> device_properties , 0 ,
356402 sizeof (ze_provider -> device_properties ));
@@ -493,8 +539,18 @@ static umf_result_t ze_memory_provider_free(void *provider, void *ptr,
493539 }
494540
495541 ze_memory_provider_t * ze_provider = (ze_memory_provider_t * )provider ;
496- ze_result_t ze_result = g_ze_ops .zeMemFree (ze_provider -> context , ptr );
497- return ze2umf_result (ze_result );
542+
543+ if (ze_provider -> freePolicyFlags == 0 ) {
544+ return ze2umf_result (g_ze_ops .zeMemFree (ze_provider -> context , ptr ));
545+ }
546+
547+ ze_memory_free_ext_desc_t desc = {
548+ .stype = ZE_STRUCTURE_TYPE_MEMORY_FREE_EXT_DESC ,
549+ .pNext = NULL ,
550+ .freePolicy = ze_provider -> freePolicyFlags };
551+
552+ return ze2umf_result (
553+ g_ze_ops .zeMemFreeExt (ze_provider -> context , & desc , ptr ));
498554}
499555
500556static void ze_memory_provider_get_last_native_error (void * provider ,
0 commit comments