Skip to content

Commit 84b24db

Browse files
committed
opt critnib
1 parent c2a8f00 commit 84b24db

File tree

4 files changed

+55
-22
lines changed

4 files changed

+55
-22
lines changed

src/critnib/critnib.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,7 +1009,7 @@ static struct critnib_leaf *find_ge(struct critnib_node *__restrict n,
10091009
* critnib_find() returns 0 if ref is NULL
10101010
*/
10111011
int critnib_find(struct critnib *c, uintptr_t key, enum find_dir_t dir,
1012-
uintptr_t *rkey, void **rvalue, void **ref) {
1012+
uintptr_t *rkey, void **rvalue, void **ref, bool weak) {
10131013
uint64_t wrs1, wrs2;
10141014
struct critnib_leaf *k;
10151015
uintptr_t _rkey = (uintptr_t)0x0;
@@ -1067,7 +1067,8 @@ int critnib_find(struct critnib *c, uintptr_t key, enum find_dir_t dir,
10671067
} while (wrs1 + DELETED_LIFE <= wrs2);
10681068

10691069
if (k) {
1070-
if (c->cb_free_leaf) {
1070+
1071+
if (weak == false && c->cb_free_leaf) {
10711072
if (increment_ref_count(k)) {
10721073
return 0;
10731074
}

src/critnib/critnib.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ void *critnib_remove(critnib *c, uintptr_t key, void **ref);
5151
void *critnib_get(critnib *c, uintptr_t key, void **ref);
5252
void *critnib_find_le(critnib *c, uintptr_t key, void **ref);
5353
int critnib_find(critnib *c, uintptr_t key, enum find_dir_t dir,
54-
uintptr_t *rkey, void **rvalue, void **ref);
54+
uintptr_t *rkey, void **rvalue, void **ref, bool weak);
5555
int critnib_release(struct critnib *c, void *ref);
5656

5757
#ifdef __cplusplus

src/provider/provider_file_memory.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ static umf_result_t file_finalize(void *provider) {
313313
void *rvalue = NULL;
314314
umf_result_t ret = UMF_RESULT_SUCCESS;
315315
while (1 == critnib_find(file_provider->mmaps, key, FIND_G, &rkey, &rvalue,
316-
NULL)) {
316+
NULL, false /* weak */)) {
317317
utils_munmap((void *)rkey, (size_t)rvalue);
318318
critnib_remove(file_provider->mmaps, rkey, NULL);
319319
key = rkey;

src/provider/provider_tracking.c

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@ static tracker_alloc_info_t *get_most_nested_alloc_segment(
8484

8585
do {
8686
assert(level < MAX_LEVELS_OF_ALLOC_SEGMENT_MAP);
87-
found =
88-
critnib_find(hTracker->alloc_segments_map[level], (uintptr_t)ptr,
89-
FIND_LE, (void *)&rkey, (void **)&rvalue, &ref_value);
87+
found = critnib_find(hTracker->alloc_segments_map[level],
88+
(uintptr_t)ptr, FIND_LE, (void *)&rkey,
89+
(void **)&rvalue, &ref_value, false /* weak */);
9090
if (!found) {
9191
assert(ref_value == NULL);
9292
break;
@@ -270,9 +270,9 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
270270
// in the critnib maps that contains the given 'ptr' pointer.
271271
do {
272272
assert(level < MAX_LEVELS_OF_ALLOC_SEGMENT_MAP);
273-
found =
274-
critnib_find(hTracker->alloc_segments_map[level], (uintptr_t)ptr,
275-
FIND_LE, (void *)&rkey, (void **)&rvalue, &ref_value);
273+
found = critnib_find(hTracker->alloc_segments_map[level],
274+
(uintptr_t)ptr, FIND_LE, (void *)&rkey,
275+
(void **)&rvalue, &ref_value, false /* weak */);
276276
if (!found) {
277277
assert(ref_value == NULL);
278278
break;
@@ -501,7 +501,11 @@ umf_result_t umfMemoryTrackerGetAllocInfo(const void *ptr,
501501
return UMF_RESULT_ERROR_NOT_SUPPORTED;
502502
}
503503

504+
#define CCC 0
505+
506+
#if CCC
504507
tracker_alloc_info_t *top_most_value = NULL;
508+
#endif
505509
tracker_alloc_info_t *rvalue = NULL;
506510
//uintptr_t top_most_key = 0;
507511
uintptr_t rkey = 0;
@@ -511,19 +515,24 @@ umf_result_t umfMemoryTrackerGetAllocInfo(const void *ptr,
511515
int found = 0;
512516

513517
void *ref_value = NULL;
518+
519+
#if CCC
514520
void *ref_top_most_value = NULL;
515521
int ref_level = 0;
516522

517523
do {
518524
assert(level < MAX_LEVELS_OF_ALLOC_SEGMENT_MAP);
519-
found =
520-
critnib_find(TRACKER->alloc_segments_map[level], (uintptr_t)ptr,
521-
FIND_LE, (void *)&rkey, (void **)&rvalue, &ref_value);
525+
#endif
526+
527+
found = critnib_find(TRACKER->alloc_segments_map[level], (uintptr_t)ptr,
528+
FIND_LE, (void *)&rkey, (void **)&rvalue,
529+
&ref_value, true /* weak */);
522530
if (!found) {
523531
assert(ref_value == NULL);
524-
break;
532+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
525533
}
526534

535+
#if CCC
527536
if (!rvalue) {
528537
if (ref_value) {
529538
critnib_release(TRACKER->alloc_segments_map[level], ref_value);
@@ -539,10 +548,13 @@ umf_result_t umfMemoryTrackerGetAllocInfo(const void *ptr,
539548
ref_level = 0;
540549
continue;
541550
}
551+
#endif
542552

543553
utils_atomic_load_acquire_u64((uint64_t *)&rvalue->props.base_size,
544554
&rsize);
545555
utils_atomic_load_acquire_size_t(&rvalue->n_children, &n_children);
556+
557+
#if CCC
546558
if (found && (uintptr_t)ptr < rkey + rsize) {
547559
//top_most_key = rkey;
548560
top_most_value = rvalue;
@@ -560,7 +572,19 @@ umf_result_t umfMemoryTrackerGetAllocInfo(const void *ptr,
560572
level++;
561573
}
562574
} while (found && (uintptr_t)ptr < rkey + rsize && n_children);
575+
#else
576+
if ((uintptr_t)ptr < rkey + rsize) {
577+
*info = rvalue;
578+
return UMF_RESULT_SUCCESS;
579+
} else {
580+
*info = NULL;
581+
LOG_DEBUG("pointer %p not found in the tracker, TRACKER=%p", ptr,
582+
(void *)TRACKER);
583+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
584+
}
585+
#endif
563586

587+
#if CCC
564588
if (!top_most_value) {
565589
if (ref_value) {
566590
critnib_release(TRACKER->alloc_segments_map[level], ref_value);
@@ -570,13 +594,16 @@ umf_result_t umfMemoryTrackerGetAllocInfo(const void *ptr,
570594
(void *)TRACKER);
571595
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
572596
}
597+
#endif
573598

599+
#if CCC
574600
*info = top_most_value;
575601

576602
assert(ref_top_most_value);
577603
critnib_release(TRACKER->alloc_segments_map[ref_level], ref_top_most_value);
578604

579605
return UMF_RESULT_SUCCESS;
606+
#endif
580607
}
581608

582609
umf_result_t umfMemoryTrackerGetIpcInfo(const void *ptr,
@@ -601,15 +628,18 @@ umf_result_t umfMemoryTrackerGetIpcInfo(const void *ptr,
601628
tracker_ipc_info_t *rvalue = NULL;
602629
void *ref_value = NULL;
603630
int found = critnib_find(TRACKER->ipc_segments_map, (uintptr_t)ptr, FIND_LE,
604-
(void *)&rkey, (void **)&rvalue, &ref_value);
631+
(void *)&rkey, (void **)&rvalue, &ref_value,
632+
true /* weak */);
605633

606634
if (!found || (found && (rvalue == NULL)) ||
607635
((uintptr_t)ptr >= rkey + rvalue->size)) {
608636
LOG_DEBUG("pointer %p not found in the tracker, TRACKER=%p", ptr,
609637
(void *)TRACKER);
638+
/*
610639
if (ref_value) {
611640
critnib_release(TRACKER->ipc_segments_map, ref_value);
612641
}
642+
*/
613643
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
614644
}
615645

@@ -619,9 +649,11 @@ umf_result_t umfMemoryTrackerGetIpcInfo(const void *ptr,
619649

620650
pIpcInfo->props = &rvalue->props;
621651

652+
/*
622653
if (ref_value) {
623654
critnib_release(TRACKER->ipc_segments_map, ref_value);
624655
}
656+
*/
625657

626658
return UMF_RESULT_SUCCESS;
627659
}
@@ -754,19 +786,19 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
754786

755787
utils_mutex_unlock(&provider->hTracker->splitMergeMutex);
756788

757-
LOG_DEBUG(
758-
"split memory region (level=%i): ptr=%p, totalSize=%zu, firstSize=%zu",
759-
level, ptr, totalSize, firstSize);
789+
LOG_DEBUG("split memory region (level=%i): ptr=%p, totalSize=%zu, "
790+
"firstSize=%zu",
791+
level, ptr, totalSize, firstSize);
760792

761793
return UMF_RESULT_SUCCESS;
762794

763795
err:
764796
utils_mutex_unlock(&provider->hTracker->splitMergeMutex);
765797

766798
err_lock:
767-
LOG_ERR(
768-
"failed to split memory region: ptr=%p, totalSize=%zu, firstSize=%zu",
769-
ptr, totalSize, firstSize);
799+
LOG_ERR("failed to split memory region: ptr=%p, totalSize=%zu, "
800+
"firstSize=%zu",
801+
ptr, totalSize, firstSize);
770802

771803
return ret;
772804
}
@@ -967,7 +999,7 @@ static void check_if_tracker_is_empty(umf_memory_tracker_handle_t hTracker,
967999
void *ref_value = NULL;
9681000

9691001
while (1 == critnib_find(hTracker->alloc_segments_map[i], last_key,
970-
FIND_G, &rkey, (void **)&rvalue, &ref_value)) {
1002+
FIND_G, &rkey, (void **)&rvalue, &ref_value, false /* weak */)) {
9711003
if (rvalue && ((rvalue->props.pool == pool) || pool == NULL)) {
9721004
n_items++;
9731005
LOG_DEBUG(

0 commit comments

Comments
 (0)