Skip to content

Commit 7fe2ca1

Browse files
committed
implement valgrind macros used in critnib
1 parent e70abba commit 7fe2ca1

File tree

3 files changed

+59
-58
lines changed

3 files changed

+59
-58
lines changed

src/critnib/critnib.c

Lines changed: 40 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
*
3-
* Copyright (C) 2023-2024 Intel Corporation
3+
* Copyright (C) 2023-2025 Intel Corporation
44
*
55
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
66
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
@@ -133,24 +133,6 @@ struct critnib {
133133
struct utils_mutex_t mutex; /* writes/removes */
134134
};
135135

136-
/*
137-
* atomic load
138-
*/
139-
static void load(void *src, void *dst) {
140-
utils_atomic_load_acquire((word *)src, (word *)dst);
141-
}
142-
143-
static void load64(uint64_t *src, uint64_t *dst) {
144-
utils_atomic_load_acquire(src, dst);
145-
}
146-
147-
/*
148-
* atomic store
149-
*/
150-
static void store(void *dst, void *src) {
151-
utils_atomic_store_release((word *)dst, (word)src);
152-
}
153-
154136
/*
155137
* internal: is_leaf -- check tagged pointer for leafness
156138
*/
@@ -180,7 +162,7 @@ static inline unsigned slice_index(word key, sh_t shift) {
180162
* critnib_new -- allocates a new critnib structure
181163
*/
182164
struct critnib *critnib_new(void) {
183-
struct critnib *c = umf_ba_global_alloc(sizeof(struct critnib));
165+
struct critnib *c = umf_ba_global_aligned_alloc(sizeof(struct critnib), 8);
184166
if (!c) {
185167
return NULL;
186168
}
@@ -192,8 +174,8 @@ struct critnib *critnib_new(void) {
192174
goto err_free_critnib;
193175
}
194176

195-
VALGRIND_HG_DRD_DISABLE_CHECKING(&c->root, sizeof(c->root));
196-
VALGRIND_HG_DRD_DISABLE_CHECKING(&c->remove_count, sizeof(c->remove_count));
177+
utils_annotate_memory_no_check(&c->root, sizeof(c->root));
178+
utils_annotate_memory_no_check(&c->remove_count, sizeof(c->remove_count));
197179

198180
return c;
199181
err_free_critnib:
@@ -272,13 +254,13 @@ static void free_node(struct critnib *__restrict c,
272254
*/
273255
static struct critnib_node *alloc_node(struct critnib *__restrict c) {
274256
if (!c->deleted_node) {
275-
return umf_ba_global_alloc(sizeof(struct critnib_node));
257+
return umf_ba_global_aligned_alloc(sizeof(struct critnib_node), 8);
276258
}
277259

278260
struct critnib_node *n = c->deleted_node;
279261

280262
c->deleted_node = n->child[0];
281-
VALGRIND_ANNOTATE_NEW_MEMORY(n, sizeof(*n));
263+
utils_annotate_memory_new(n, sizeof(*n));
282264

283265
return n;
284266
}
@@ -303,13 +285,13 @@ static void free_leaf(struct critnib *__restrict c,
303285
*/
304286
static struct critnib_leaf *alloc_leaf(struct critnib *__restrict c) {
305287
if (!c->deleted_leaf) {
306-
return umf_ba_global_alloc(sizeof(struct critnib_leaf));
288+
return umf_ba_global_aligned_alloc(sizeof(struct critnib_leaf), 8);
307289
}
308290

309291
struct critnib_leaf *k = c->deleted_leaf;
310292

311293
c->deleted_leaf = k->value;
312-
VALGRIND_ANNOTATE_NEW_MEMORY(k, sizeof(*k));
294+
utils_annotate_memory_new(k, sizeof(*k));
313295

314296
return k;
315297
}
@@ -334,7 +316,7 @@ int critnib_insert(struct critnib *c, word key, void *value, int update) {
334316
return ENOMEM;
335317
}
336318

337-
VALGRIND_HG_DRD_DISABLE_CHECKING(k, sizeof(struct critnib_leaf));
319+
utils_annotate_memory_no_check(k, sizeof(struct critnib_leaf));
338320

339321
k->key = key;
340322
k->value = value;
@@ -343,10 +325,8 @@ int critnib_insert(struct critnib *c, word key, void *value, int update) {
343325

344326
struct critnib_node *n = c->root;
345327
if (!n) {
346-
store(&c->root, kn);
347-
328+
utils_atomic_store_release_ptr((void **)&c->root, kn);
348329
utils_mutex_unlock(&c->mutex);
349-
350330
return 0;
351331
}
352332

@@ -361,7 +341,8 @@ int critnib_insert(struct critnib *c, word key, void *value, int update) {
361341

362342
if (!n) {
363343
n = prev;
364-
store(&n->child[slice_index(key, n->shift)], kn);
344+
utils_atomic_store_release_ptr(
345+
(void **)&n->child[slice_index(key, n->shift)], kn);
365346

366347
utils_mutex_unlock(&c->mutex);
367348

@@ -396,7 +377,7 @@ int critnib_insert(struct critnib *c, word key, void *value, int update) {
396377

397378
return ENOMEM;
398379
}
399-
VALGRIND_HG_DRD_DISABLE_CHECKING(m, sizeof(struct critnib_node));
380+
utils_annotate_memory_no_check(m, sizeof(struct critnib_node));
400381

401382
for (int i = 0; i < SLNODES; i++) {
402383
m->child[i] = NULL;
@@ -406,7 +387,7 @@ int critnib_insert(struct critnib *c, word key, void *value, int update) {
406387
m->child[slice_index(path, sh)] = n;
407388
m->shift = sh;
408389
m->path = key & path_mask(sh);
409-
store(parent, m);
390+
utils_atomic_store_release_ptr((void **)parent, m);
410391

411392
utils_mutex_unlock(&c->mutex);
412393

@@ -427,7 +408,8 @@ void *critnib_remove(struct critnib *c, word key) {
427408
goto not_found;
428409
}
429410

430-
word del = (utils_atomic_increment(&c->remove_count) - 1) % DELETED_LIFE;
411+
word del =
412+
(utils_atomic_increment_u64(&c->remove_count) - 1) % DELETED_LIFE;
431413
free_node(c, c->pending_del_nodes[del]);
432414
free_leaf(c, c->pending_del_leaves[del]);
433415
c->pending_del_nodes[del] = NULL;
@@ -436,7 +418,7 @@ void *critnib_remove(struct critnib *c, word key) {
436418
if (is_leaf(n)) {
437419
k = to_leaf(n);
438420
if (k->key == key) {
439-
store(&c->root, NULL);
421+
utils_atomic_store_release_ptr((void **)&c->root, NULL);
440422
goto del_leaf;
441423
}
442424

@@ -466,7 +448,8 @@ void *critnib_remove(struct critnib *c, word key) {
466448
goto not_found;
467449
}
468450

469-
store(&n->child[slice_index(key, n->shift)], NULL);
451+
utils_atomic_store_release_ptr(
452+
(void **)&n->child[slice_index(key, n->shift)], NULL);
470453

471454
/* Remove the node if there's only one remaining child. */
472455
int ochild = -1;
@@ -482,7 +465,7 @@ void *critnib_remove(struct critnib *c, word key) {
482465

483466
ASSERTne(ochild, -1);
484467

485-
store(n_parent, n->child[ochild]);
468+
utils_atomic_store_release_ptr((void **)n_parent, n->child[ochild]);
486469
c->pending_del_nodes[del] = n;
487470

488471
del_leaf:
@@ -511,22 +494,23 @@ void *critnib_get(struct critnib *c, word key) {
511494
do {
512495
struct critnib_node *n;
513496

514-
load64(&c->remove_count, &wrs1);
515-
load(&c->root, &n);
497+
utils_atomic_load_acquire_u64(&c->remove_count, &wrs1);
498+
utils_atomic_load_acquire_ptr((void **)&c->root, (void **)&n);
516499

517500
/*
518501
* critbit algorithm: dive into the tree, looking at nothing but
519502
* each node's critical bit^H^H^Hnibble. This means we risk
520503
* going wrong way if our path is missing, but that's ok...
521504
*/
522505
while (n && !is_leaf(n)) {
523-
load(&n->child[slice_index(key, n->shift)], &n);
506+
utils_atomic_load_acquire_ptr(
507+
(void **)&n->child[slice_index(key, n->shift)], (void **)&n);
524508
}
525509

526510
/* ... as we check it at the end. */
527511
struct critnib_leaf *k = to_leaf(n);
528512
res = (n && k->key == key) ? k->value : NULL;
529-
load64(&c->remove_count, &wrs2);
513+
utils_atomic_load_acquire_u64(&c->remove_count, &wrs2);
530514
} while (wrs1 + DELETED_LIFE <= wrs2);
531515

532516
return res;
@@ -597,7 +581,7 @@ static struct critnib_leaf *find_le(struct critnib_node *__restrict n,
597581
/* recursive call: follow the path */
598582
{
599583
struct critnib_node *m;
600-
load(&n->child[nib], &m);
584+
utils_atomic_load_acquire_ptr((void **)&n->child[nib], (void **)&m);
601585
struct critnib_leaf *k = find_le(m, key);
602586
if (k) {
603587
return k;
@@ -611,7 +595,7 @@ static struct critnib_leaf *find_le(struct critnib_node *__restrict n,
611595
*/
612596
for (; nib > 0; nib--) {
613597
struct critnib_node *m;
614-
load(&n->child[nib - 1], &m);
598+
utils_atomic_load_acquire_ptr((void **)&n->child[nib - 1], (void **)&m);
615599
if (m) {
616600
n = m;
617601
if (is_leaf(n)) {
@@ -635,12 +619,12 @@ void *critnib_find_le(struct critnib *c, word key) {
635619
void *res;
636620

637621
do {
638-
load64(&c->remove_count, &wrs1);
622+
utils_atomic_load_acquire_u64(&c->remove_count, &wrs1);
639623
struct critnib_node *n; /* avoid a subtle TOCTOU */
640-
load(&c->root, &n);
624+
utils_atomic_load_acquire_ptr((void **)&c->root, (void **)&n);
641625
struct critnib_leaf *k = n ? find_le(n, key) : NULL;
642626
res = k ? k->value : NULL;
643-
load64(&c->remove_count, &wrs2);
627+
utils_atomic_load_acquire_u64(&c->remove_count, &wrs2);
644628
} while (wrs1 + DELETED_LIFE <= wrs2);
645629

646630
return res;
@@ -672,8 +656,8 @@ static struct critnib_leaf *find_successor(struct critnib_node *__restrict n) {
672656
/*
673657
* internal: find_ge -- recursively search >= in a subtree
674658
*/
675-
static struct critnib_leaf *find_ge(struct critnib_node *__restrict n,
676-
word key) {
659+
static struct critnib_leaf *
660+
find_ge(struct critnib_node *__restrict n, word key) {
677661
if (!n) {
678662
return NULL;
679663
}
@@ -694,7 +678,7 @@ static struct critnib_leaf *find_ge(struct critnib_node *__restrict n,
694678
unsigned nib = slice_index(key, n->shift);
695679
{
696680
struct critnib_node *m;
697-
load(&n->child[nib], &m);
681+
utils_atomic_load_acquire_ptr((void **)&n->child[nib], (void **)&m);
698682
struct critnib_leaf *k = find_ge(m, key);
699683
if (k) {
700684
return k;
@@ -703,7 +687,7 @@ static struct critnib_leaf *find_ge(struct critnib_node *__restrict n,
703687

704688
for (; nib < NIB; nib++) {
705689
struct critnib_node *m;
706-
load(&n->child[nib + 1], &m);
690+
utils_atomic_load_acquire_ptr((void **)&n->child[nib + 1], (void **)&m);
707691
if (m) {
708692
n = m;
709693
if (is_leaf(n)) {
@@ -741,17 +725,19 @@ int critnib_find(struct critnib *c, uintptr_t key, enum find_dir_t dir,
741725
}
742726

743727
do {
744-
load64(&c->remove_count, &wrs1);
728+
utils_atomic_load_acquire_u64(&c->remove_count, &wrs1);
745729
struct critnib_node *n;
746-
load(&c->root, &n);
730+
utils_atomic_load_acquire_ptr((void **)&c->root, (void **)&n);
747731

748732
if (dir < 0) {
749733
k = find_le(n, key);
750734
} else if (dir > 0) {
751735
k = find_ge(n, key);
752736
} else {
753737
while (n && !is_leaf(n)) {
754-
load(&n->child[slice_index(key, n->shift)], &n);
738+
utils_atomic_load_acquire_ptr(
739+
(void **)&n->child[slice_index(key, n->shift)],
740+
(void **)&n);
755741
}
756742

757743
struct critnib_leaf *kk = to_leaf(n);
@@ -761,7 +747,7 @@ int critnib_find(struct critnib *c, uintptr_t key, enum find_dir_t dir,
761747
_rkey = k->key;
762748
_rvalue = k->value;
763749
}
764-
load64(&c->remove_count, &wrs2);
750+
utils_atomic_load_acquire_u64(&c->remove_count, &wrs2);
765751
} while (wrs1 + DELETED_LIFE <= wrs2);
766752

767753
if (k) {

src/utils/utils_common.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,6 @@ typedef enum umf_purge_advise_t {
5353
#define ASSERT_IS_ALIGNED(value, align) \
5454
DO_WHILE_EXPRS(assert(IS_ALIGNED(value, align)))
5555

56-
#define VALGRIND_ANNOTATE_NEW_MEMORY(p, s) DO_WHILE_EMPTY
57-
#define VALGRIND_HG_DRD_DISABLE_CHECKING(p, s) DO_WHILE_EMPTY
58-
5956
#ifdef _WIN32 /* Windows */
6057

6158
#define __TLS __declspec(thread)

src/utils/utils_sanitizers.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
*
3-
* Copyright (C) 2024 Intel Corporation
3+
* Copyright (C) 2024-2025 Intel Corporation
44
*
55
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
66
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
@@ -168,6 +168,24 @@ static inline void utils_annotate_memory_inaccessible(void *ptr, size_t size) {
168168
#endif
169169
}
170170

171+
static inline void utils_annotate_memory_new(void *ptr, size_t size) {
172+
#ifdef UMF_VG_DRD_ENABLED
173+
ANNOTATE_NEW_MEMORY(ptr, size);
174+
#else
175+
(void)ptr;
176+
(void)size;
177+
#endif
178+
}
179+
180+
static inline void utils_annotate_memory_no_check(void *ptr, size_t size) {
181+
#ifdef UMF_VG_HELGRIND_ENABLED
182+
VALGRIND_HG_DISABLE_CHECKING(ptr, size);
183+
#else
184+
(void)ptr;
185+
(void)size;
186+
#endif
187+
}
188+
171189
#ifdef __cplusplus
172190
}
173191
#endif

0 commit comments

Comments
 (0)