rcu_queue: use atomic_set in QLIST_REMOVE_RCU
authorEmilio G. Cota <cota@braap.org>
Sun, 19 Aug 2018 09:13:25 +0000 (05:13 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 23 Aug 2018 16:46:25 +0000 (18:46 +0200)
To avoid undefined behaviour.

Signed-off-by: Emilio G. Cota <cota@braap.org>
Message-Id: <20180819091335.22863-2-cota@braap.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
include/qemu/rcu_queue.h

index 01be77407ba776366f5d23ec827e60a4323fe6ef..dd7b3be043eb5e685fdbee17ca90e27654bd7c9c 100644 (file)
@@ -112,7 +112,7 @@ extern "C" {
        (elm)->field.le_next->field.le_prev =        \
         (elm)->field.le_prev;                       \
     }                                               \
-    *(elm)->field.le_prev =  (elm)->field.le_next;  \
+    atomic_set((elm)->field.le_prev, (elm)->field.le_next); \
 } while (/*CONSTCOND*/0)
 
 /* List traversal must occur within an RCU critical section.  */