Skip to content

Commit 682f88a

Browse files
committed
Postpone freeing in critnib
Signed-off-by: Lukasz Dorau <lukasz.dorau@intel.com>
1 parent a4ab363 commit 682f88a

File tree

3 files changed

+42
-14
lines changed

3 files changed

+42
-14
lines changed

src/critnib/critnib.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ static void free_leaf(struct critnib *__restrict c,
293293
return;
294294
}
295295

296-
if (c->cb_free_leaf && k) {
296+
if (c->cb_free_leaf && k && k->value) {
297297
c->cb_free_leaf(c->leaf_allocator, (void *)k->value);
298298
}
299299

@@ -375,6 +375,10 @@ int critnib_insert(struct critnib *c, word key, void *value, int update) {
375375
word at = path ^ key;
376376
if (!at) {
377377
ASSERT(is_leaf(n));
378+
if (to_leaf(kn)->value == value) {
379+
// do not free the value
380+
to_leaf(kn)->value = NULL;
381+
}
378382
free_leaf(c, to_leaf(kn));
379383

380384
if (update) {

src/pool/pool_disjoint.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,6 @@ static void destroy_slab(slab_t *slab) {
140140
if (res != UMF_RESULT_SUCCESS) {
141141
LOG_ERR("deallocation of slab data failed!");
142142
}
143-
144-
umf_ba_global_free(slab);
145143
}
146144

147145
static size_t slab_find_first_available_chunk_idx(const slab_t *slab) {
@@ -570,6 +568,18 @@ static void *disjoint_pool_allocate(disjoint_pool_t *pool, size_t size) {
570568
return ptr;
571569
}
572570

571+
/*
572+
* free_slab - callback for freeing the slab.
573+
* It is called by critnib when the slab
574+
* is removed from the critnib.
575+
*/
576+
static void free_slab(void *unused, void *slab) {
577+
(void)unused;
578+
if (slab) {
579+
umf_ba_global_free(slab);
580+
}
581+
}
582+
573583
umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
574584
const void *params, void **ppPool) {
575585
// TODO set defaults when user pass the NULL as params
@@ -597,7 +607,7 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
597607
disjoint_pool->provider = provider;
598608
disjoint_pool->params = *dp_params;
599609

600-
disjoint_pool->known_slabs = critnib_new(NULL, NULL);
610+
disjoint_pool->known_slabs = critnib_new(free_slab, NULL);
601611
if (disjoint_pool->known_slabs == NULL) {
602612
goto err_free_disjoint_pool;
603613
}

src/provider/provider_tracking.c

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -271,8 +271,6 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
271271
parent_value->n_children--;
272272
}
273273

274-
umf_ba_free(hTracker->alloc_info_allocator, value);
275-
276274
return UMF_RESULT_SUCCESS;
277275
}
278276

@@ -339,8 +337,6 @@ umfMemoryTrackerRemoveIpcSegment(umf_memory_tracker_handle_t hTracker,
339337
(void *)hTracker, ptr, v->size, (void *)v->provider,
340338
(void *)v->ipc_cache_value);
341339

342-
umf_ba_free(hTracker->ipc_info_allocator, value);
343-
344340
return UMF_RESULT_SUCCESS;
345341
}
346342

@@ -664,8 +660,6 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
664660
lowLevel, lowPtr, lowValue->n_children, highPtr,
665661
highValue->n_children, totalSize);
666662

667-
umf_ba_free(provider->hTracker->alloc_info_allocator, highValue);
668-
669663
return UMF_RESULT_SUCCESS;
670664

671665
err_fatal:
@@ -715,7 +709,6 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
715709
"size=%zu, ret = %d",
716710
ptr, size, ret);
717711
}
718-
umf_ba_global_free(value);
719712
}
720713

721714
ret = umfMemoryProviderFree(p->hUpstream, ptr, size);
@@ -1116,6 +1109,13 @@ umf_memory_provider_ops_t UMF_TRACKING_MEMORY_PROVIDER_OPS = {
11161109
.ipc.open_ipc_handle = trackingOpenIpcHandle,
11171110
.ipc.close_ipc_handle = trackingCloseIpcHandle};
11181111

1112+
static void free_ipc_cache_value(void *unused, void *ipc_cache_value) {
1113+
(void)unused;
1114+
if (ipc_cache_value) {
1115+
umf_ba_global_free(ipc_cache_value);
1116+
}
1117+
}
1118+
11191119
umf_result_t umfTrackingMemoryProviderCreate(
11201120
umf_memory_provider_handle_t hUpstream, umf_memory_pool_handle_t hPool,
11211121
umf_memory_provider_handle_t *hTrackingProvider) {
@@ -1128,7 +1128,7 @@ umf_result_t umfTrackingMemoryProviderCreate(
11281128
return UMF_RESULT_ERROR_UNKNOWN;
11291129
}
11301130
params.pool = hPool;
1131-
params.ipcCache = critnib_new(NULL, NULL);
1131+
params.ipcCache = critnib_new(free_ipc_cache_value, NULL);
11321132
if (!params.ipcCache) {
11331133
LOG_ERR("failed to create IPC cache");
11341134
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
@@ -1156,6 +1156,18 @@ void umfTrackingMemoryProviderGetUpstreamProvider(
11561156
*hUpstream = p->hUpstream;
11571157
}
11581158

1159+
static void free_leaf(void *leaf_allocator, void *ptr) {
1160+
if (ptr) {
1161+
umf_ba_free(leaf_allocator, ptr);
1162+
}
1163+
}
1164+
1165+
static void free_ipc_segment(void *ipc_info_allocator, void *ptr) {
1166+
if (ptr) {
1167+
umf_ba_free(ipc_info_allocator, ptr);
1168+
}
1169+
}
1170+
11591171
umf_memory_tracker_handle_t umfMemoryTrackerCreate(void) {
11601172
umf_memory_tracker_handle_t handle =
11611173
umf_ba_global_alloc(sizeof(struct umf_memory_tracker_t));
@@ -1180,7 +1192,8 @@ umf_memory_tracker_handle_t umfMemoryTrackerCreate(void) {
11801192

11811193
int i;
11821194
for (i = 0; i < MAX_LEVELS_OF_ALLOC_SEGMENT_MAP; i++) {
1183-
handle->alloc_segments_map[i] = critnib_new(NULL, NULL);
1195+
handle->alloc_segments_map[i] =
1196+
critnib_new(free_leaf, alloc_info_allocator);
11841197
if (!handle->alloc_segments_map[i]) {
11851198
goto err_destroy_alloc_segments_map;
11861199
}
@@ -1192,7 +1205,8 @@ umf_memory_tracker_handle_t umfMemoryTrackerCreate(void) {
11921205
goto err_destroy_alloc_segments_map;
11931206
}
11941207

1195-
handle->ipc_segments_map = critnib_new(NULL, NULL);
1208+
handle->ipc_segments_map =
1209+
critnib_new(free_ipc_segment, handle->ipc_info_allocator);
11961210
if (!handle->ipc_segments_map) {
11971211
goto err_destroy_ipc_info_allocator;
11981212
}

0 commit comments

Comments
 (0)