@@ -422,6 +422,43 @@ static ze_relaxed_allocation_limits_exp_desc_t relaxed_device_allocation_desc =
422422 .pNext = NULL ,
423423 .flags = ZE_RELAXED_ALLOCATION_LIMITS_EXP_FLAG_MAX_SIZE };
424424
425+ static umf_result_t ze_memory_provider_free_helper (void * provider , void * ptr ,
426+ size_t bytes ,
427+ int update_stats ) {
428+ if (ptr == NULL ) {
429+ return UMF_RESULT_SUCCESS ;
430+ }
431+
432+ ze_memory_provider_t * ze_provider = (ze_memory_provider_t * )provider ;
433+ umf_result_t ret ;
434+ if (ze_provider -> freePolicyFlags == 0 ) {
435+ ret = ze2umf_result (g_ze_ops .zeMemFree (ze_provider -> context , ptr ));
436+ } else {
437+ ze_memory_free_ext_desc_t desc = {
438+ .stype = ZE_STRUCTURE_TYPE_MEMORY_FREE_EXT_DESC ,
439+ .pNext = NULL ,
440+ .freePolicy = ze_provider -> freePolicyFlags };
441+
442+ ret = ze2umf_result (
443+ g_ze_ops .zeMemFreeExt (ze_provider -> context , & desc , ptr ));
444+ }
445+
446+ if (ret != UMF_RESULT_SUCCESS ) {
447+ return ret ;
448+ }
449+
450+ if (update_stats ) {
451+ provider_ctl_stats_free (ze_provider , bytes );
452+ }
453+
454+ return UMF_RESULT_SUCCESS ;
455+ }
456+
457+ static umf_result_t ze_memory_provider_free (void * provider , void * ptr ,
458+ size_t bytes ) {
459+ return ze_memory_provider_free_helper (provider , ptr , bytes , 1 );
460+ }
461+
425462static umf_result_t ze_memory_provider_alloc_helper (void * provider , size_t size ,
426463 size_t alignment ,
427464 int update_stats ,
@@ -488,10 +525,17 @@ static umf_result_t ze_memory_provider_alloc_helper(void *provider, size_t size,
488525 * resultPtr , size );
489526 if (ze_result != ZE_RESULT_SUCCESS ) {
490527 utils_read_unlock (& ze_provider -> resident_device_rwlock );
491- LOG_DEBUG ("making resident allocation %p of size:%lu on device %p "
492- "failed with %d" ,
493- * resultPtr , size , ze_provider -> resident_device_handles [i ],
494- ze_result );
528+ LOG_ERR ("making resident allocation %p of size:%lu on device %p "
529+ "failed with 0x%x" ,
530+ * resultPtr , size , ze_provider -> resident_device_handles [i ],
531+ ze_result );
532+ umf_result_t free_result =
533+ ze_memory_provider_free (ze_provider , * resultPtr , size );
534+ if (free_result != UMF_RESULT_SUCCESS ) {
535+ LOG_ERR ("failed to free memory with: 0x%x after failed making "
536+ "resident, free fail ignored" ,
537+ free_result );
538+ }
495539 return ze2umf_result (ze_result );
496540 }
497541 LOG_DEBUG ("allocation %p of size:%lu made resident on device %p" ,
@@ -512,43 +556,6 @@ static umf_result_t ze_memory_provider_alloc(void *provider, size_t size,
512556 resultPtr );
513557}
514558
515- static umf_result_t ze_memory_provider_free_helper (void * provider , void * ptr ,
516- size_t bytes ,
517- int update_stats ) {
518- if (ptr == NULL ) {
519- return UMF_RESULT_SUCCESS ;
520- }
521-
522- ze_memory_provider_t * ze_provider = (ze_memory_provider_t * )provider ;
523- umf_result_t ret ;
524- if (ze_provider -> freePolicyFlags == 0 ) {
525- ret = ze2umf_result (g_ze_ops .zeMemFree (ze_provider -> context , ptr ));
526- } else {
527- ze_memory_free_ext_desc_t desc = {
528- .stype = ZE_STRUCTURE_TYPE_MEMORY_FREE_EXT_DESC ,
529- .pNext = NULL ,
530- .freePolicy = ze_provider -> freePolicyFlags };
531-
532- ret = ze2umf_result (
533- g_ze_ops .zeMemFreeExt (ze_provider -> context , & desc , ptr ));
534- }
535-
536- if (ret != UMF_RESULT_SUCCESS ) {
537- return ret ;
538- }
539-
540- if (update_stats ) {
541- provider_ctl_stats_free (ze_provider , bytes );
542- }
543-
544- return UMF_RESULT_SUCCESS ;
545- }
546-
547- static umf_result_t ze_memory_provider_free (void * provider , void * ptr ,
548- size_t bytes ) {
549- return ze_memory_provider_free_helper (provider , ptr , bytes , 1 );
550- }
551-
552559static umf_result_t query_min_page_size (ze_memory_provider_t * ze_provider ,
553560 size_t * min_page_size ) {
554561 assert (min_page_size );
@@ -997,8 +1004,8 @@ static int ze_memory_provider_resident_device_change_helper(uintptr_t key,
9971004
9981005 // TODO: add assertions to UMF and change it to be an assertion
9991006 if (info -> props .base != (void * )key ) {
1000- LOG_ERR ("key:%p is different than base:%p" , (void * )key ,
1001- info -> props .base );
1007+ LOG_FATAL ("key:%p is different than base:%p" , (void * )key ,
1008+ info -> props .base );
10021009 abort ();
10031010 }
10041011
@@ -1060,8 +1067,7 @@ static umf_result_t ze_memory_provider_resident_device_change(void *provider,
10601067 if (ze_provider -> resident_device_count ==
10611068 ze_provider -> resident_device_capacity ) {
10621069 const uint32_t new_capacity =
1063- ze_provider -> resident_device_capacity * 2 +
1064- 1 ; // +1 to work also with old capacity == 0
1070+ ze_provider -> resident_device_capacity + 1 ;
10651071 ze_device_handle_t * new_handles =
10661072 umf_ba_global_alloc (sizeof (ze_device_handle_t ) * new_capacity );
10671073 if (new_handles == NULL ) {
@@ -1087,7 +1093,6 @@ static umf_result_t ze_memory_provider_resident_device_change(void *provider,
10871093 // found
10881094 if (is_adding ) {
10891095 utils_write_unlock (& ze_provider -> resident_device_rwlock );
1090- // impossible for UR, should be an assertion
10911096 LOG_ERR ("trying to add resident device:%p but the device is "
10921097 "already a peer of provider:%p" ,
10931098 ze_device , provider );
@@ -1109,6 +1114,9 @@ static umf_result_t ze_memory_provider_resident_device_change(void *provider,
11091114 .failed_changes = 0 ,
11101115 };
11111116
1117+ // This is "hacky" and it will not work if someone uses pool without tracker
1118+ // or just use provider without pool. It can be solved by keeping track of
1119+ // allocations by the provider like in os_provider.
11121120 umf_result_t result = umfMemoryTrackerIterateAll (
11131121 & ze_memory_provider_resident_device_change_helper , & privData );
11141122 if (result != UMF_RESULT_SUCCESS ) {
0 commit comments