Skip to content

Commit ae1f041

Browse files
committed
Add trackerShrinkEntry() and trackerGrowEntry()
Add trackerShrinkEntry() that shrinks (or removes) an entry in the tracker and returns the totalSize of the original entry. Add trackerGrowEntry() that grows (or adds) an entry in the tracker to its original size. Signed-off-by: Lukasz Dorau <[email protected]>
1 parent dd1348c commit ae1f041

File tree

3 files changed

+141
-0
lines changed

3 files changed

+141
-0
lines changed

src/provider/provider_fixed_memory.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "coarse.h"
2222
#include "libumf.h"
2323
#include "memory_pool_internal.h"
24+
#include "provider_tracking.h"
2425
#include "utils_common.h"
2526
#include "utils_concurrency.h"
2627
#include "utils_log.h"
@@ -114,6 +115,15 @@ static umf_result_t fixed_initialize(void *params, void **provider) {
114115
LOG_ERR("cannot get the tracking provider of the pool %p", pool);
115116
return ret;
116117
}
118+
119+
ret = trackerShrinkEntry(trackingProvider, in_params->ptr,
120+
in_params->size, &ptr_orig_size);
121+
if (ret != UMF_RESULT_SUCCESS) {
122+
LOG_ERR(
123+
"cannot shrink the allocation %p in the tracker to size %zu",
124+
in_params->ptr, in_params->size);
125+
return ret;
126+
}
117127
}
118128

119129
fixed_memory_provider_t *fixed_provider =
@@ -173,6 +183,20 @@ static umf_result_t fixed_initialize(void *params, void **provider) {
173183
static void fixed_finalize(void *provider) {
174184
fixed_memory_provider_t *fixed_provider = provider;
175185
coarse_delete(fixed_provider->coarse);
186+
187+
if (fixed_provider->trackingProvider &&
188+
(fixed_provider->ptr_orig_size >= fixed_provider->size)) {
189+
umf_result_t ret = trackerGrowEntry(
190+
fixed_provider->trackingProvider, fixed_provider->base,
191+
fixed_provider->size, fixed_provider->ptr_orig_size);
192+
if (ret != UMF_RESULT_SUCCESS) {
193+
LOG_ERR("cannot grow the allocation %p in the tracker (from size "
194+
"%zu to size %zu)",
195+
fixed_provider->base, fixed_provider->size,
196+
fixed_provider->ptr_orig_size);
197+
}
198+
}
199+
176200
umf_ba_global_free(fixed_provider);
177201
}
178202

src/provider/provider_tracking.c

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,58 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
267267
return ret;
268268
}
269269

270+
// shrink (or remove) an entry in the tracker and return the totalSize of the original entry
271+
umf_result_t trackerShrinkEntry(void *hProvider, void *ptr, size_t shrinkSize,
272+
size_t *totalSize) {
273+
umf_result_t ret = UMF_RESULT_SUCCESS;
274+
umf_tracking_memory_provider_t *provider =
275+
(umf_tracking_memory_provider_t *)hProvider;
276+
277+
int r = utils_mutex_lock(&provider->hTracker->splitMergeMutex);
278+
if (r) {
279+
return UMF_RESULT_ERROR_UNKNOWN;
280+
}
281+
282+
tracker_alloc_info_t *value = (tracker_alloc_info_t *)critnib_get(
283+
provider->hTracker->alloc_segments_map, (uintptr_t)ptr);
284+
if (!value) {
285+
LOG_ERR("region for shrinking is not found in the tracker");
286+
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT;
287+
goto err;
288+
}
289+
if (shrinkSize > value->size) {
290+
LOG_ERR("requested size %zu to shrink exceeds the tracked size %zu",
291+
shrinkSize, value->size);
292+
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT;
293+
goto err;
294+
}
295+
296+
if (shrinkSize < value->size) {
297+
void *highPtr = (void *)(((uintptr_t)ptr) + shrinkSize);
298+
size_t secondSize = value->size - shrinkSize;
299+
ret = umfMemoryTrackerAdd(provider->hTracker, provider->pool, highPtr,
300+
secondSize);
301+
if (ret != UMF_RESULT_SUCCESS) {
302+
LOG_ERR("failed to add the new shrunk region to the tracker, ptr = "
303+
"%p, size = %zu, ret = %d",
304+
highPtr, secondSize, ret);
305+
goto err;
306+
}
307+
}
308+
309+
*totalSize = value->size;
310+
311+
void *erasedValue =
312+
critnib_remove(provider->hTracker->alloc_segments_map, (uintptr_t)ptr);
313+
assert(erasedValue == value);
314+
umf_ba_free(provider->hTracker->alloc_info_allocator, erasedValue);
315+
316+
err:
317+
utils_mutex_unlock(&provider->hTracker->splitMergeMutex);
318+
319+
return ret;
320+
}
321+
270322
static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
271323
void *highPtr, size_t totalSize) {
272324
umf_result_t ret = UMF_RESULT_ERROR_UNKNOWN;
@@ -353,6 +405,65 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
353405
return ret;
354406
}
355407

408+
// grow (or add) an entry in the tracker to its original size
409+
umf_result_t trackerGrowEntry(void *hProvider, void *ptr, size_t growSize,
410+
size_t origSize) {
411+
umf_result_t ret = UMF_RESULT_SUCCESS;
412+
umf_tracking_memory_provider_t *provider =
413+
(umf_tracking_memory_provider_t *)hProvider;
414+
415+
if (growSize > origSize) {
416+
LOG_ERR("Invalid grow size %zu (larger than the original size %zu)",
417+
growSize, origSize);
418+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
419+
}
420+
421+
int r = utils_mutex_lock(&provider->hTracker->splitMergeMutex);
422+
if (r) {
423+
return UMF_RESULT_ERROR_UNKNOWN;
424+
}
425+
426+
void *highPtr = (void *)(((uintptr_t)ptr) + growSize);
427+
tracker_alloc_info_t *highValue = NULL;
428+
429+
if (growSize < origSize) {
430+
highValue = (tracker_alloc_info_t *)critnib_get(
431+
provider->hTracker->alloc_segments_map, (uintptr_t)highPtr);
432+
if (!highValue) {
433+
LOG_ERR("cannot find the tracker entry to grow %p", highPtr);
434+
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT;
435+
goto err;
436+
}
437+
if (growSize + highValue->size != origSize) {
438+
LOG_ERR("Grow size plus the current size does not equal the "
439+
"original size");
440+
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT;
441+
goto err;
442+
}
443+
}
444+
445+
ret =
446+
umfMemoryTrackerAdd(provider->hTracker, provider->pool, ptr, origSize);
447+
if (ret != UMF_RESULT_SUCCESS) {
448+
LOG_ERR("failed to add the new grown region to the tracker, ptr = %p, "
449+
"size = %zu, ret = %d",
450+
ptr, origSize, ret);
451+
goto err;
452+
}
453+
454+
if (growSize < origSize) {
455+
void *erasedhighValue = critnib_remove(
456+
provider->hTracker->alloc_segments_map, (uintptr_t)highPtr);
457+
assert(erasedhighValue == highValue);
458+
umf_ba_free(provider->hTracker->alloc_info_allocator, erasedhighValue);
459+
}
460+
461+
err:
462+
utils_mutex_unlock(&provider->hTracker->splitMergeMutex);
463+
464+
return ret;
465+
}
466+
356467
static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
357468
umf_result_t ret;
358469
umf_result_t ret_remove = UMF_RESULT_ERROR_UNKNOWN;

src/provider/provider_tracking.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ void umfTrackingMemoryProviderGetUpstreamProvider(
5555
umf_memory_provider_handle_t hTrackingProvider,
5656
umf_memory_provider_handle_t *hUpstream);
5757

58+
umf_result_t trackerShrinkEntry(void *hProvider, void *ptr, size_t shrinkSize,
59+
size_t *totalSize);
60+
61+
umf_result_t trackerGrowEntry(void *hProvider, void *ptr, size_t growSize,
62+
size_t origSize);
63+
5864
#ifdef __cplusplus
5965
}
6066
#endif

0 commit comments

Comments
 (0)