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 */
@@ -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 (& 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 (& n -> child [slice_index (key , n -> shift )],
345+ kn );
365346
366347 utils_mutex_unlock (& c -> mutex );
367348
@@ -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 (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 (& c -> root , NULL );
440422 goto del_leaf ;
441423 }
442424
@@ -466,7 +448,7 @@ 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 (& n -> child [slice_index (key , n -> shift )], NULL );
470452
471453 /* Remove the node if there's only one remaining child. */
472454 int ochild = -1 ;
@@ -482,7 +464,7 @@ void *critnib_remove(struct critnib *c, word key) {
482464
483465 ASSERTne (ochild , -1 );
484466
485- store (n_parent , n -> child [ochild ]);
467+ utils_atomic_store_release_ptr (n_parent , n -> child [ochild ]);
486468 c -> pending_del_nodes [del ] = n ;
487469
488470del_leaf :
@@ -511,22 +493,23 @@ void *critnib_get(struct critnib *c, word key) {
511493 do {
512494 struct critnib_node * n ;
513495
514- load64 (& c -> remove_count , & wrs1 );
515- load (& c -> root , & n );
496+ utils_atomic_load_acquire_u64 (& c -> remove_count , & wrs1 );
497+ utils_atomic_load_acquire_ptr (& c -> root , ( void * * ) & n );
516498
517499 /*
518500 * critbit algorithm: dive into the tree, looking at nothing but
519501 * each node's critical bit^H^H^Hnibble. This means we risk
520502 * going wrong way if our path is missing, but that's ok...
521503 */
522504 while (n && !is_leaf (n )) {
523- load (& n -> child [slice_index (key , n -> shift )], & n );
505+ utils_atomic_load_acquire_ptr (& n -> child [slice_index (key , n -> shift )],
506+ (void * * )& n );
524507 }
525508
526509 /* ... as we check it at the end. */
527510 struct critnib_leaf * k = to_leaf (n );
528511 res = (n && k -> key == key ) ? k -> value : NULL ;
529- load64 (& c -> remove_count , & wrs2 );
512+ utils_atomic_load_acquire_u64 (& c -> remove_count , & wrs2 );
530513 } while (wrs1 + DELETED_LIFE <= wrs2 );
531514
532515 return res ;
@@ -597,7 +580,7 @@ static struct critnib_leaf *find_le(struct critnib_node *__restrict n,
597580 /* recursive call: follow the path */
598581 {
599582 struct critnib_node * m ;
600- load (& n -> child [nib ], & m );
583+ utils_atomic_load_acquire_ptr (& n -> child [nib ], ( void * * ) & m );
601584 struct critnib_leaf * k = find_le (m , key );
602585 if (k ) {
603586 return k ;
@@ -611,7 +594,7 @@ static struct critnib_leaf *find_le(struct critnib_node *__restrict n,
611594 */
612595 for (; nib > 0 ; nib -- ) {
613596 struct critnib_node * m ;
614- load (& n -> child [nib - 1 ], & m );
597+ utils_atomic_load_acquire_ptr (& n -> child [nib - 1 ], ( void * * ) & m );
615598 if (m ) {
616599 n = m ;
617600 if (is_leaf (n )) {
@@ -635,12 +618,12 @@ void *critnib_find_le(struct critnib *c, word key) {
635618 void * res ;
636619
637620 do {
638- load64 (& c -> remove_count , & wrs1 );
621+ utils_atomic_load_acquire_u64 (& c -> remove_count , & wrs1 );
639622 struct critnib_node * n ; /* avoid a subtle TOCTOU */
640- load (& c -> root , & n );
623+ utils_atomic_load_acquire_ptr (& c -> root , ( void * * ) & n );
641624 struct critnib_leaf * k = n ? find_le (n , key ) : NULL ;
642625 res = k ? k -> value : NULL ;
643- load64 (& c -> remove_count , & wrs2 );
626+ utils_atomic_load_acquire_u64 (& c -> remove_count , & wrs2 );
644627 } while (wrs1 + DELETED_LIFE <= wrs2 );
645628
646629 return res ;
@@ -694,7 +677,7 @@ static struct critnib_leaf *find_ge(struct critnib_node *__restrict n,
694677 unsigned nib = slice_index (key , n -> shift );
695678 {
696679 struct critnib_node * m ;
697- load (& n -> child [nib ], & m );
680+ utils_atomic_load_acquire_ptr (& n -> child [nib ], ( void * * ) & m );
698681 struct critnib_leaf * k = find_ge (m , key );
699682 if (k ) {
700683 return k ;
@@ -703,7 +686,7 @@ static struct critnib_leaf *find_ge(struct critnib_node *__restrict n,
703686
704687 for (; nib < NIB ; nib ++ ) {
705688 struct critnib_node * m ;
706- load (& n -> child [nib + 1 ], & m );
689+ utils_atomic_load_acquire_ptr (& n -> child [nib + 1 ], ( void * * ) & m );
707690 if (m ) {
708691 n = m ;
709692 if (is_leaf (n )) {
@@ -741,17 +724,18 @@ int critnib_find(struct critnib *c, uintptr_t key, enum find_dir_t dir,
741724 }
742725
743726 do {
744- load64 (& c -> remove_count , & wrs1 );
727+ utils_atomic_load_acquire_u64 (& c -> remove_count , & wrs1 );
745728 struct critnib_node * n ;
746- load (& c -> root , & n );
729+ utils_atomic_load_acquire_ptr (& c -> root , ( void * * ) & n );
747730
748731 if (dir < 0 ) {
749732 k = find_le (n , key );
750733 } else if (dir > 0 ) {
751734 k = find_ge (n , key );
752735 } else {
753736 while (n && !is_leaf (n )) {
754- load (& n -> child [slice_index (key , n -> shift )], & n );
737+ utils_atomic_load_acquire_ptr (
738+ & n -> child [slice_index (key , n -> shift )], (void * * )& n );
755739 }
756740
757741 struct critnib_leaf * kk = to_leaf (n );
@@ -761,7 +745,7 @@ int critnib_find(struct critnib *c, uintptr_t key, enum find_dir_t dir,
761745 _rkey = k -> key ;
762746 _rvalue = k -> value ;
763747 }
764- load64 (& c -> remove_count , & wrs2 );
748+ utils_atomic_load_acquire_u64 (& c -> remove_count , & wrs2 );
765749 } while (wrs1 + DELETED_LIFE <= wrs2 );
766750
767751 if (k ) {
0 commit comments