@@ -752,8 +752,10 @@ void *disjoint_pool_aligned_malloc(void *pool, size_t size, size_t alignment) {
752752 }
753753
754754 void * aligned_ptr = (void * )ALIGN_UP_SAFE ((size_t )ptr , alignment );
755- VALGRIND_DO_MEMPOOL_ALLOC (disjoint_pool , aligned_ptr , size );
756- utils_annotate_memory_undefined (aligned_ptr , size );
755+ size_t diff = (ptrdiff_t )aligned_ptr - (ptrdiff_t )ptr ;
756+ size_t real_size = bucket -> size - diff ;
757+ VALGRIND_DO_MEMPOOL_ALLOC (disjoint_pool , aligned_ptr , real_size );
758+ utils_annotate_memory_undefined (aligned_ptr , real_size );
757759
758760 utils_mutex_unlock (& bucket -> bucket_lock );
759761
@@ -767,11 +769,34 @@ void *disjoint_pool_aligned_malloc(void *pool, size_t size, size_t alignment) {
767769}
768770
769771size_t disjoint_pool_malloc_usable_size (void * pool , void * ptr ) {
770- (void )pool ;
771- (void )ptr ;
772+ disjoint_pool_t * disjoint_pool = (disjoint_pool_t * )pool ;
773+ if (ptr == NULL ) {
774+ return 0 ;
775+ }
772776
773- // Not supported
774- return 0 ;
777+ // check if given pointer is allocated inside any Disjoint Pool slab
778+ slab_t * slab =
779+ (slab_t * )critnib_find_le (disjoint_pool -> known_slabs , (uintptr_t )ptr );
780+ if (slab == NULL || ptr >= slab_get_end (slab )) {
781+ // memory comes directly from the provider
782+ umf_alloc_info_t allocInfo = {NULL , 0 , NULL };
783+ umf_result_t ret = umfMemoryTrackerGetAllocInfo (ptr , & allocInfo );
784+ if (ret != UMF_RESULT_SUCCESS ) {
785+ return 0 ;
786+ }
787+
788+ return allocInfo .baseSize ;
789+ }
790+ // Get the unaligned pointer
791+ // NOTE: the base pointer slab->mem_ptr needn't to be aligned to bucket size
792+ size_t chunk_idx =
793+ (((uintptr_t )ptr - (uintptr_t )slab -> mem_ptr ) / slab -> bucket -> size );
794+ void * unaligned_ptr =
795+ (void * )((uintptr_t )slab -> mem_ptr + chunk_idx * slab -> bucket -> size );
796+
797+ ptrdiff_t diff = (ptrdiff_t )ptr - (ptrdiff_t )unaligned_ptr ;
798+
799+ return slab -> bucket -> size - diff ;
775800}
776801
777802umf_result_t disjoint_pool_free (void * pool , void * ptr ) {
0 commit comments