Skip to content

Commit 6cf2691

Browse files
committed
tracker props
1 parent 1de8ce0 commit 6cf2691

File tree

9 files changed

+61
-61
lines changed

9 files changed

+61
-61
lines changed

.github/workflows/pr_push.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@ jobs:
2020
Build:
2121
name: Basic builds
2222
uses: ./.github/workflows/reusable_basic.yml
23-
23+
Sanitizers:
24+
uses: ./.github/workflows/reusable_sanitizers.yml

FlameGraph

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Subproject commit 41fee1f99f9276008b7cd112fca19dc3ea84ac32

src/ipc.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ umf_result_t umfGetIPCHandle(const void *ptr, umf_ipc_handle_t *umfIPCHandle,
5858
}
5959

6060
size_t ipcHandleSize = 0;
61-
umf_alloc_info_t allocInfo;
62-
umf_result_t ret = umfMemoryTrackerGetAllocInfo(ptr, &allocInfo, NULL);
61+
umf_alloc_info_t allocInfo = {NULL, 0, NULL, NULL};
62+
umf_result_t ret = umfMemoryTrackerGetAllocInfo(ptr, &allocInfo);
6363
if (ret != UMF_RESULT_SUCCESS) {
6464
LOG_ERR("cannot get alloc info for ptr = %p.", ptr);
6565
return ret;
@@ -79,8 +79,12 @@ umf_result_t umfGetIPCHandle(const void *ptr, umf_ipc_handle_t *umfIPCHandle,
7979

8080
// We cannot use umfPoolGetMemoryProvider function because it returns
8181
// upstream provider but we need tracking one
82+
if (allocInfo.pool == NULL || allocInfo.pool->provider == NULL) {
83+
LOG_ERR("cannot get memory provider from pool");
84+
umf_ba_global_free(ipcData);
85+
return UMF_RESULT_ERROR_UNKNOWN;
86+
}
8287
umf_memory_provider_handle_t provider = allocInfo.pool->provider;
83-
assert(provider);
8488

8589
ret = umfMemoryProviderGetIPCHandle(provider, allocInfo.base,
8690
allocInfo.baseSize,

src/memory_props.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,17 @@ umf_result_t
1919
umfGetMemoryPropertiesHandle(const void *ptr,
2020
umf_memory_properties_handle_t *props_handle) {
2121

22-
// TODO remove?
23-
umf_alloc_info_t allocInfo = {NULL, 0, NULL};
24-
umf_result_t ret = umfMemoryTrackerGetAllocInfo(ptr, &allocInfo, props_handle);
22+
if (props_handle == NULL) {
23+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
24+
}
25+
26+
umf_alloc_info_t allocInfo = {NULL, 0, NULL, NULL};
27+
umf_result_t ret = umfMemoryTrackerGetAllocInfo(ptr, &allocInfo);
2528
if (ret != UMF_RESULT_SUCCESS) {
2629
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
2730
}
2831

32+
*props_handle = allocInfo.props;
2933

3034
return UMF_RESULT_SUCCESS;
3135
}

src/memory_props_internal.h

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,13 @@ extern "C" {
2626
#endif
2727

2828
typedef struct umf_memory_properties_t {
29-
// TODO move to alloc_info_t w/o gpu_props
29+
// TODO alloc_info_t
3030
void *ptr;
3131
umf_memory_pool_handle_t pool;
3232
umf_memory_provider_handle_t provider;
3333
uint64_t id;
3434
void *base;
3535
size_t base_size;
36-
37-
// TODO
38-
bool gpu_properties_initialized;
39-
union {
40-
#if UMF_BUILD_LEVEL_ZERO_PROVIDER
41-
ze_memory_allocation_properties_t ze_properties;
42-
#endif
43-
int unused; // in case of no GPU support
44-
} gpu;
4536
} umf_memory_properties_t;
4637

4738
#ifdef __cplusplus

src/pool/pool_disjoint.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -884,8 +884,8 @@ size_t disjoint_pool_malloc_usable_size(void *pool, const void *ptr) {
884884
critnib_release(disjoint_pool->known_slabs, ref_slab);
885885
}
886886

887-
umf_alloc_info_t allocInfo = {NULL, 0, NULL};
888-
umf_result_t ret = umfMemoryTrackerGetAllocInfo(ptr, &allocInfo, NULL);
887+
umf_alloc_info_t allocInfo = {NULL, 0, NULL, NULL};
888+
umf_result_t ret = umfMemoryTrackerGetAllocInfo(ptr, &allocInfo);
889889
if (ret != UMF_RESULT_SUCCESS) {
890890
return 0;
891891
}
@@ -925,8 +925,8 @@ umf_result_t disjoint_pool_free(void *pool, void *ptr) {
925925
critnib_release(disjoint_pool->known_slabs, ref_slab);
926926
}
927927

928-
umf_alloc_info_t allocInfo = {NULL, 0, NULL};
929-
umf_result_t ret = umfMemoryTrackerGetAllocInfo(ptr, &allocInfo, NULL);
928+
umf_alloc_info_t allocInfo = {NULL, 0, NULL, NULL};
929+
umf_result_t ret = umfMemoryTrackerGetAllocInfo(ptr, &allocInfo);
930930
if (ret != UMF_RESULT_SUCCESS) {
931931
TLS_last_allocation_error = ret;
932932
LOG_ERR("failed to get allocation info from the memory tracker");

src/pool/pool_proxy.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,8 @@ static umf_result_t proxy_free(void *pool, void *ptr) {
9797
struct proxy_memory_pool *hPool = (struct proxy_memory_pool *)pool;
9898

9999
if (ptr) {
100-
umf_alloc_info_t allocInfo = {NULL, 0, NULL};
101-
umf_result_t umf_result =
102-
umfMemoryTrackerGetAllocInfo(ptr, &allocInfo, NULL);
100+
umf_alloc_info_t allocInfo = {NULL, 0, NULL, NULL};
101+
umf_result_t umf_result = umfMemoryTrackerGetAllocInfo(ptr, &allocInfo);
103102
if (umf_result == UMF_RESULT_SUCCESS) {
104103
size = allocInfo.baseSize;
105104
}

src/provider/provider_tracking.c

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,6 @@ struct umf_memory_tracker_t {
4949
typedef struct tracker_alloc_info_t {
5050
umf_memory_properties_t props;
5151

52-
// TODO remove
53-
umf_memory_pool_handle_t pool;
54-
size_t size;
55-
5652
// number of overlapping memory regions in the next level of map falling
5753
// within the current range
5854
size_t n_children;
@@ -119,7 +115,8 @@ static tracker_alloc_info_t *get_most_nested_alloc_segment(
119115
continue;
120116
}
121117

122-
utils_atomic_load_acquire_u64((uint64_t *)&rvalue->size, &rsize);
118+
utils_atomic_load_acquire_u64((uint64_t *)&rvalue->props.base_size,
119+
&rsize);
123120
utils_atomic_load_acquire_size_t(&rvalue->n_children, &n_children);
124121
if (found && ((uintptr_t)ptr < rkey + rsize) && n_children) {
125122
if (level == MAX_LEVELS_OF_ALLOC_SEGMENT_MAP - 1) {
@@ -198,15 +195,14 @@ umfMemoryTrackerAddAtLevel(umf_memory_tracker_handle_t hTracker, int level,
198195
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
199196
}
200197

201-
value->pool = pool;
202-
203198
memset(&value->props, 0, sizeof(umf_memory_properties_t));
204199
umfPoolGetMemoryProvider(pool, &value->props.provider);
205200
value->props.id = utils_atomic_increment_u64(&unique_alloc_id);
206201
value->props.base = (void *)ptr;
207202
value->props.base_size = size;
203+
value->props.pool = pool;
204+
value->props.ptr = (void *)ptr;
208205

209-
value->size = size;
210206
value->n_children = 0;
211207
#if !defined(NDEBUG) && defined(UMF_DEVELOPER_MODE)
212208
value->is_freed = 0;
@@ -299,7 +295,8 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
299295
assert(is_freed != 0xDEADBEEF);
300296
#endif
301297

302-
utils_atomic_load_acquire_u64((uint64_t *)&rvalue->size, &rsize);
298+
utils_atomic_load_acquire_u64((uint64_t *)&rvalue->props.base_size,
299+
&rsize);
303300

304301
if ((uintptr_t)ptr < rkey + rsize) {
305302
if (level == MAX_LEVELS_OF_ALLOC_SEGMENT_MAP - 1) {
@@ -313,8 +310,8 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
313310
"cannot insert to the tracker value (pool=%p, ptr=%p, "
314311
"size=%zu) "
315312
"that exceeds the parent value (pool=%p, ptr=%p, size=%zu)",
316-
(void *)pool, ptr, size, (void *)rvalue->pool, (void *)rkey,
317-
(size_t)rsize);
313+
(void *)pool, ptr, size, (void *)rvalue->props.pool,
314+
(void *)rkey, (size_t)rsize);
318315
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
319316
}
320317
parent_key = rkey;
@@ -376,7 +373,8 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
376373

377374
LOG_DEBUG("memory region removed: tracker=%p, level=%i, pool=%p, ptr=%p, "
378375
"size=%zu",
379-
(void *)hTracker, level, (void *)value->pool, ptr, value->size);
376+
(void *)hTracker, level, (void *)value->props.pool, ptr,
377+
value->props.base_size);
380378

381379
// release the reference to the value got from critnib_remove()
382380
assert(ref_value);
@@ -388,8 +386,9 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
388386
LOG_DEBUG(
389387
"child #%zu removed from memory region: tracker=%p, level=%i, "
390388
"pool=%p, ptr=%p, size=%zu",
391-
n_children, (void *)hTracker, level - 1, (void *)parent_value->pool,
392-
(void *)parent_key, parent_value->size);
389+
n_children, (void *)hTracker, level - 1,
390+
(void *)parent_value->props.pool, (void *)parent_key,
391+
parent_value->props.base_size);
393392

394393
assert(ref_parent_value);
395394
assert(level >= 1);
@@ -472,18 +471,17 @@ umfMemoryTrackerRemoveIpcSegment(umf_memory_tracker_handle_t hTracker,
472471
}
473472

474473
umf_memory_pool_handle_t umfMemoryTrackerGetPool(const void *ptr) {
475-
umf_alloc_info_t allocInfo = {NULL, 0, NULL};
476-
umf_result_t ret = umfMemoryTrackerGetAllocInfo(ptr, &allocInfo, NULL);
474+
umf_alloc_info_t allocInfo = {NULL, 0, NULL, NULL};
475+
umf_result_t ret = umfMemoryTrackerGetAllocInfo(ptr, &allocInfo);
477476
if (ret != UMF_RESULT_SUCCESS) {
478477
return NULL;
479478
}
480479

481480
return allocInfo.pool;
482481
}
483482

484-
umf_result_t
485-
umfMemoryTrackerGetAllocInfo(const void *ptr, umf_alloc_info_t *pAllocInfo,
486-
umf_memory_properties_handle_t *props) {
483+
umf_result_t umfMemoryTrackerGetAllocInfo(const void *ptr,
484+
umf_alloc_info_t *pAllocInfo) {
487485
assert(pAllocInfo);
488486

489487
if (ptr == NULL) {
@@ -539,7 +537,8 @@ umfMemoryTrackerGetAllocInfo(const void *ptr, umf_alloc_info_t *pAllocInfo,
539537
continue;
540538
}
541539

542-
utils_atomic_load_acquire_u64((uint64_t *)&rvalue->size, &rsize);
540+
utils_atomic_load_acquire_u64((uint64_t *)&rvalue->props.base_size,
541+
&rsize);
543542
utils_atomic_load_acquire_size_t(&rvalue->n_children, &n_children);
544543
if (found && (uintptr_t)ptr < rkey + rsize) {
545544
top_most_key = rkey;
@@ -570,13 +569,10 @@ umfMemoryTrackerGetAllocInfo(const void *ptr, umf_alloc_info_t *pAllocInfo,
570569
}
571570

572571
pAllocInfo->base = (void *)top_most_key;
573-
pAllocInfo->baseSize = top_most_value->size;
574-
pAllocInfo->pool = top_most_value->pool;
572+
pAllocInfo->baseSize = top_most_value->props.base_size;
573+
pAllocInfo->pool = top_most_value->props.pool;
574+
pAllocInfo->props = &top_most_value->props;
575575

576-
if (props != NULL) {
577-
*props = &top_most_value->props;
578-
}
579-
580576
assert(ref_top_most_value);
581577
critnib_release(TRACKER->alloc_segments_map[ref_level], ref_top_most_value);
582578

@@ -710,9 +706,9 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
710706
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT;
711707
goto err;
712708
}
713-
if (value->size != totalSize) {
709+
if (value->props.base_size != totalSize) {
714710
LOG_ERR("tracked size=%zu does not match requested size to split: %zu",
715-
value->size, totalSize);
711+
value->props.base_size, totalSize);
716712
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT;
717713
goto err;
718714
}
@@ -750,7 +746,8 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
750746
}
751747

752748
// update the size of the first part
753-
utils_atomic_store_release_u64((uint64_t *)&value->size, firstSize);
749+
utils_atomic_store_release_u64((uint64_t *)&value->props.base_size,
750+
firstSize);
754751
critnib_release(provider->hTracker->alloc_segments_map[level], ref_value);
755752

756753
utils_mutex_unlock(&provider->hTracker->splitMergeMutex);
@@ -823,12 +820,12 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
823820
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT;
824821
goto err_fatal;
825822
}
826-
if (lowValue->pool != highValue->pool) {
823+
if (lowValue->props.pool != highValue->props.pool) {
827824
LOG_FATAL("pool mismatch");
828825
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT;
829826
goto err_fatal;
830827
}
831-
if (lowValue->size + highValue->size != totalSize) {
828+
if (lowValue->props.base_size + highValue->props.base_size != totalSize) {
832829
LOG_FATAL("lowValue->size + highValue->size != totalSize");
833830
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT;
834831
goto err_fatal;
@@ -842,7 +839,8 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
842839
}
843840

844841
// we only need to update the size of the first part
845-
utils_atomic_store_release_u64((uint64_t *)&lowValue->size, totalSize);
842+
utils_atomic_store_release_u64((uint64_t *)&lowValue->props.base_size,
843+
totalSize);
846844

847845
size_t low_children = lowValue->n_children;
848846
size_t high_children = highValue->n_children;
@@ -968,12 +966,13 @@ static void check_if_tracker_is_empty(umf_memory_tracker_handle_t hTracker,
968966

969967
while (1 == critnib_find(hTracker->alloc_segments_map[i], last_key,
970968
FIND_G, &rkey, (void **)&rvalue, &ref_value)) {
971-
if (rvalue && ((rvalue->pool == pool) || pool == NULL)) {
969+
if (rvalue && ((rvalue->props.pool == pool) || pool == NULL)) {
972970
n_items++;
973971
LOG_DEBUG(
974972
"found abandoned allocation in the tracking provider: "
975973
"pool=%p, ptr=%p, size=%zu",
976-
(void *)rvalue->pool, (void *)rkey, (size_t)rvalue->size);
974+
(void *)rvalue->props.pool, (void *)rkey,
975+
(size_t)rvalue->props.base_size);
977976
}
978977

979978
if (ref_value) {

src/provider/provider_tracking.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,12 @@ typedef struct umf_alloc_info_t {
4141
void *base;
4242
size_t baseSize;
4343
umf_memory_pool_handle_t pool;
44+
45+
umf_memory_properties_handle_t props;
4446
} umf_alloc_info_t;
4547

46-
umf_result_t
47-
umfMemoryTrackerGetAllocInfo(const void *ptr, umf_alloc_info_t *pAllocInfo,
48-
umf_memory_properties_handle_t *props_handle);
48+
umf_result_t umfMemoryTrackerGetAllocInfo(const void *ptr,
49+
umf_alloc_info_t *pAllocInfo);
4950

5051
typedef struct umf_ipc_info_t {
5152
void *base;

0 commit comments

Comments
 (0)