Ensure memory ordering when updating partition list and the bitmap (#20956)
Stelios Fragkakis committed
Sep 11, 2025 at 19:41 UTC
60f270b3359ebca68e788293d43d957e213a34ee
1 file changed
+3
-3
src/libnetdata/aral/aral.c
+3
-3
@@ -851,7 +851,7 @@ static ALWAYS_INLINE void *aral_get_free_slot___no_lock_required(ARAL *ar, ARAL_
851
aral_page_available_lock(ar, page);
852
853
while(!page->available.list) {
854
- uint32_t bitmap = __atomic_load_n(&page->incoming_partition_bitmap, __ATOMIC_RELAXED);
854
+ uint32_t bitmap = __atomic_load_n(&page->incoming_partition_bitmap, __ATOMIC_ACQUIRE);
855
if (!bitmap)
856
fatal("ARAL: bitmap of incoming free elements cannot be empty at this point");
857
@@ -868,7 +868,7 @@ static ALWAYS_INLINE void *aral_get_free_slot___no_lock_required(ARAL *ar, ARAL_
868
if (aral_page_incoming_trylock(ar, page, partition)) {
869
page->available.list = page->incoming[partition].list;
870
page->incoming[partition].list = NULL;
871
- __atomic_fetch_and(&page->incoming_partition_bitmap, ~(1U << partition), __ATOMIC_RELAXED);
871
+ __atomic_fetch_and(&page->incoming_partition_bitmap, ~(1U << partition), __ATOMIC_RELEASE);
872
aral_page_incoming_unlock(ar, page, partition);
873
break;
874
}
@@ -903,7 +903,7 @@ static inline void aral_add_free_slot___no_lock_required(ARAL *ar, ARAL_PAGE *pa
903
if (aral_page_incoming_trylock(ar, page, partition)) {
904
fr->next = page->incoming[partition].list;
905
page->incoming[partition].list = fr;
906
- __atomic_fetch_or(&page->incoming_partition_bitmap, 1U << partition, __ATOMIC_RELAXED);
906
+ __atomic_fetch_or(&page->incoming_partition_bitmap, 1U << partition, __ATOMIC_RELEASE);
907
aral_page_incoming_unlock(ar, page, partition);
908
return;
909
}