1
1
/*
2
2
*
3
- * Copyright (C) 2023-2024 Intel Corporation
3
+ * Copyright (C) 2023-2025 Intel Corporation
4
4
*
5
5
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
6
6
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
@@ -133,24 +133,6 @@ struct critnib {
133
133
struct utils_mutex_t mutex ; /* writes/removes */
134
134
};
135
135
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
-
154
136
/*
155
137
* internal: is_leaf -- check tagged pointer for leafness
156
138
*/
@@ -192,8 +174,8 @@ struct critnib *critnib_new(void) {
192
174
goto err_free_critnib ;
193
175
}
194
176
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 ));
197
179
198
180
return c ;
199
181
err_free_critnib :
@@ -278,7 +260,7 @@ static struct critnib_node *alloc_node(struct critnib *__restrict c) {
278
260
struct critnib_node * n = c -> deleted_node ;
279
261
280
262
c -> deleted_node = n -> child [0 ];
281
- VALGRIND_ANNOTATE_NEW_MEMORY (n , sizeof (* n ));
263
+ utils_annotate_memory_new (n , sizeof (* n ));
282
264
283
265
return n ;
284
266
}
@@ -303,13 +285,13 @@ static void free_leaf(struct critnib *__restrict c,
303
285
*/
304
286
static struct critnib_leaf * alloc_leaf (struct critnib * __restrict c ) {
305
287
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 );
307
289
}
308
290
309
291
struct critnib_leaf * k = c -> deleted_leaf ;
310
292
311
293
c -> deleted_leaf = k -> value ;
312
- VALGRIND_ANNOTATE_NEW_MEMORY (k , sizeof (* k ));
294
+ utils_annotate_memory_new (k , sizeof (* k ));
313
295
314
296
return k ;
315
297
}
@@ -334,7 +316,7 @@ int critnib_insert(struct critnib *c, word key, void *value, int update) {
334
316
return ENOMEM ;
335
317
}
336
318
337
- VALGRIND_HG_DRD_DISABLE_CHECKING (k , sizeof (struct critnib_leaf ));
319
+ utils_annotate_memory_no_check (k , sizeof (struct critnib_leaf ));
338
320
339
321
k -> key = key ;
340
322
k -> value = value ;
@@ -343,10 +325,8 @@ int critnib_insert(struct critnib *c, word key, void *value, int update) {
343
325
344
326
struct critnib_node * n = c -> root ;
345
327
if (!n ) {
346
- store (& c -> root , kn );
347
-
328
+ utils_atomic_store_release_ptr ((void * * )& c -> root , kn );
348
329
utils_mutex_unlock (& c -> mutex );
349
-
350
330
return 0 ;
351
331
}
352
332
@@ -361,7 +341,8 @@ int critnib_insert(struct critnib *c, word key, void *value, int update) {
361
341
362
342
if (!n ) {
363
343
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 );
365
346
366
347
utils_mutex_unlock (& c -> mutex );
367
348
@@ -396,7 +377,7 @@ int critnib_insert(struct critnib *c, word key, void *value, int update) {
396
377
397
378
return ENOMEM ;
398
379
}
399
- VALGRIND_HG_DRD_DISABLE_CHECKING (m , sizeof (struct critnib_node ));
380
+ utils_annotate_memory_no_check (m , sizeof (struct critnib_node ));
400
381
401
382
for (int i = 0 ; i < SLNODES ; i ++ ) {
402
383
m -> child [i ] = NULL ;
@@ -406,7 +387,7 @@ int critnib_insert(struct critnib *c, word key, void *value, int update) {
406
387
m -> child [slice_index (path , sh )] = n ;
407
388
m -> shift = sh ;
408
389
m -> path = key & path_mask (sh );
409
- store ( parent , m );
390
+ utils_atomic_store_release_ptr (( void * * ) parent , m );
410
391
411
392
utils_mutex_unlock (& c -> mutex );
412
393
@@ -427,7 +408,8 @@ void *critnib_remove(struct critnib *c, word key) {
427
408
goto not_found ;
428
409
}
429
410
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 ;
431
413
free_node (c , c -> pending_del_nodes [del ]);
432
414
free_leaf (c , c -> pending_del_leaves [del ]);
433
415
c -> pending_del_nodes [del ] = NULL ;
@@ -436,7 +418,7 @@ void *critnib_remove(struct critnib *c, word key) {
436
418
if (is_leaf (n )) {
437
419
k = to_leaf (n );
438
420
if (k -> key == key ) {
439
- store ( & c -> root , NULL );
421
+ utils_atomic_store_release_ptr (( void * * ) & c -> root , NULL );
440
422
goto del_leaf ;
441
423
}
442
424
@@ -466,7 +448,8 @@ void *critnib_remove(struct critnib *c, word key) {
466
448
goto not_found ;
467
449
}
468
450
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 );
470
453
471
454
/* Remove the node if there's only one remaining child. */
472
455
int ochild = -1 ;
@@ -482,7 +465,7 @@ void *critnib_remove(struct critnib *c, word key) {
482
465
483
466
ASSERTne (ochild , -1 );
484
467
485
- store ( n_parent , n -> child [ochild ]);
468
+ utils_atomic_store_release_ptr (( void * * ) n_parent , n -> child [ochild ]);
486
469
c -> pending_del_nodes [del ] = n ;
487
470
488
471
del_leaf :
@@ -511,22 +494,23 @@ void *critnib_get(struct critnib *c, word key) {
511
494
do {
512
495
struct critnib_node * n ;
513
496
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 );
516
499
517
500
/*
518
501
* critbit algorithm: dive into the tree, looking at nothing but
519
502
* each node's critical bit^H^H^Hnibble. This means we risk
520
503
* going wrong way if our path is missing, but that's ok...
521
504
*/
522
505
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 );
524
508
}
525
509
526
510
/* ... as we check it at the end. */
527
511
struct critnib_leaf * k = to_leaf (n );
528
512
res = (n && k -> key == key ) ? k -> value : NULL ;
529
- load64 (& c -> remove_count , & wrs2 );
513
+ utils_atomic_load_acquire_u64 (& c -> remove_count , & wrs2 );
530
514
} while (wrs1 + DELETED_LIFE <= wrs2 );
531
515
532
516
return res ;
@@ -597,7 +581,7 @@ static struct critnib_leaf *find_le(struct critnib_node *__restrict n,
597
581
/* recursive call: follow the path */
598
582
{
599
583
struct critnib_node * m ;
600
- load ( & n -> child [nib ], & m );
584
+ utils_atomic_load_acquire_ptr (( void * * ) & n -> child [nib ], ( void * * ) & m );
601
585
struct critnib_leaf * k = find_le (m , key );
602
586
if (k ) {
603
587
return k ;
@@ -611,7 +595,7 @@ static struct critnib_leaf *find_le(struct critnib_node *__restrict n,
611
595
*/
612
596
for (; nib > 0 ; nib -- ) {
613
597
struct critnib_node * m ;
614
- load ( & n -> child [nib - 1 ], & m );
598
+ utils_atomic_load_acquire_ptr (( void * * ) & n -> child [nib - 1 ], ( void * * ) & m );
615
599
if (m ) {
616
600
n = m ;
617
601
if (is_leaf (n )) {
@@ -635,12 +619,12 @@ void *critnib_find_le(struct critnib *c, word key) {
635
619
void * res ;
636
620
637
621
do {
638
- load64 (& c -> remove_count , & wrs1 );
622
+ utils_atomic_load_acquire_u64 (& c -> remove_count , & wrs1 );
639
623
struct critnib_node * n ; /* avoid a subtle TOCTOU */
640
- load ( & c -> root , & n );
624
+ utils_atomic_load_acquire_ptr (( void * * ) & c -> root , ( void * * ) & n );
641
625
struct critnib_leaf * k = n ? find_le (n , key ) : NULL ;
642
626
res = k ? k -> value : NULL ;
643
- load64 (& c -> remove_count , & wrs2 );
627
+ utils_atomic_load_acquire_u64 (& c -> remove_count , & wrs2 );
644
628
} while (wrs1 + DELETED_LIFE <= wrs2 );
645
629
646
630
return res ;
@@ -694,7 +678,7 @@ static struct critnib_leaf *find_ge(struct critnib_node *__restrict n,
694
678
unsigned nib = slice_index (key , n -> shift );
695
679
{
696
680
struct critnib_node * m ;
697
- load ( & n -> child [nib ], & m );
681
+ utils_atomic_load_acquire_ptr (( void * * ) & n -> child [nib ], ( void * * ) & m );
698
682
struct critnib_leaf * k = find_ge (m , key );
699
683
if (k ) {
700
684
return k ;
@@ -703,7 +687,7 @@ static struct critnib_leaf *find_ge(struct critnib_node *__restrict n,
703
687
704
688
for (; nib < NIB ; nib ++ ) {
705
689
struct critnib_node * m ;
706
- load ( & n -> child [nib + 1 ], & m );
690
+ utils_atomic_load_acquire_ptr (( void * * ) & n -> child [nib + 1 ], ( void * * ) & m );
707
691
if (m ) {
708
692
n = m ;
709
693
if (is_leaf (n )) {
@@ -741,17 +725,19 @@ int critnib_find(struct critnib *c, uintptr_t key, enum find_dir_t dir,
741
725
}
742
726
743
727
do {
744
- load64 (& c -> remove_count , & wrs1 );
728
+ utils_atomic_load_acquire_u64 (& c -> remove_count , & wrs1 );
745
729
struct critnib_node * n ;
746
- load ( & c -> root , & n );
730
+ utils_atomic_load_acquire_ptr (( void * * ) & c -> root , ( void * * ) & n );
747
731
748
732
if (dir < 0 ) {
749
733
k = find_le (n , key );
750
734
} else if (dir > 0 ) {
751
735
k = find_ge (n , key );
752
736
} else {
753
737
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 );
755
741
}
756
742
757
743
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,
761
747
_rkey = k -> key ;
762
748
_rvalue = k -> value ;
763
749
}
764
- load64 (& c -> remove_count , & wrs2 );
750
+ utils_atomic_load_acquire_u64 (& c -> remove_count , & wrs2 );
765
751
} while (wrs1 + DELETED_LIFE <= wrs2 );
766
752
767
753
if (k ) {
0 commit comments