From 837351245aaa34674a236926ce50fc9839a52276 Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Fri, 24 Oct 2025 12:43:47 +0200 Subject: [PATCH] BUG/MEDIUM: mt_list: Use atomic operations to prevent compiler optims As a folow-up to f40f5401b9f24becc6fdd2e77d4f4578bbecae7f, explicitely use atomic operations to set the prev and next fields, to make sure the compiler can't assume anything about it, and just does it. This should be backported after f40f5401b9 up to 2.8. --- include/import/mt_list.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/include/import/mt_list.h b/include/import/mt_list.h index 4c1b3e286..23f2911c6 100644 --- a/include/import/mt_list.h +++ b/include/import/mt_list.h @@ -264,8 +264,8 @@ static inline __attribute__((always_inline)) unsigned long mt_list_cpu_relax(uns */ static inline struct mt_list *mt_list_init(struct mt_list *el) { - el->next = el; - el->prev = el; + __atomic_store_n(&el->next, el, __ATOMIC_RELAXED); + __atomic_store_n(&el->prev, el, __ATOMIC_RELAXED); return el; } @@ -491,8 +491,8 @@ static MT_INLINE struct mt_list *mt_list_behead(struct mt_list *lh) break; } - lh->next = lh; - lh->prev = lh; + __atomic_store_n(&lh->next, lh, __ATOMIC_RELAXED); + __atomic_store_n(&lh->prev, lh, __ATOMIC_RELAXED); __atomic_thread_fence(__ATOMIC_RELEASE); n->prev = p; @@ -645,8 +645,8 @@ static MT_INLINE long mt_list_delete(struct mt_list *el) * somebody may be using it already. */ if (el != n) { - el->prev = el; - el->next = el; + __atomic_store_n(&el->prev, el, __ATOMIC_RELAXED); + __atomic_store_n(&el->next, el, __ATOMIC_RELAXED); __atomic_thread_fence(__ATOMIC_RELEASE); } -- 2.47.3