X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=util%2Frcu.c;h=9adc5e4a368ab600d1c53f7076840b51093d9624;hb=82f20e8547ce665e9bb23fdb55374840b846c143;hp=8ba304dc44118b3295151aebdeb496dd015c66b2;hpb=1c9f03b81ce9136cf1bd3c111582b320b507dfec;p=mirror_qemu.git diff --git a/util/rcu.c b/util/rcu.c index 8ba304dc44..9adc5e4a36 100644 --- a/util/rcu.c +++ b/util/rcu.c @@ -26,12 +26,8 @@ * IBM's contributions to this file may be relicensed under LGPLv2 or later. */ +#include "qemu/osdep.h" #include "qemu-common.h" -#include -#include -#include -#include -#include #include "qemu/rcu.h" #include "qemu/atomic.h" #include "qemu/thread.h" @@ -86,14 +82,16 @@ static void wait_for_readers(void) /* Instead of using atomic_mb_set for index->waiting, and * atomic_mb_read for index->ctr, memory barriers are placed * manually since writes to different threads are independent. - * atomic_mb_set has a smp_wmb before... + * qemu_event_reset has acquire semantics, so no memory barrier + * is needed here. */ - smp_wmb(); QLIST_FOREACH(index, ®istry, node) { atomic_set(&index->waiting, true); } - /* ... and a smp_mb after. */ + /* Here, order the stores to index->waiting before the + * loads of index->ctr. + */ smp_mb(); QLIST_FOREACH_SAFE(index, ®istry, node, tmp) { @@ -108,9 +106,6 @@ static void wait_for_readers(void) } } - /* atomic_mb_read has smp_rmb after. */ - smp_rmb(); - if (QLIST_EMPTY(®istry)) { break; }