rcu: simplify memory barriers

Thanks to the acquire semantics of qemu_event_reset and qemu_event_wait,
some memory barriers can be removed.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2016-09-19 11:27:46 +02:00
parent 374293ca6f
commit e11131b025

View File

@ -82,14 +82,16 @@ static void wait_for_readers(void)
/* Instead of using atomic_mb_set for index->waiting, and /* Instead of using atomic_mb_set for index->waiting, and
* atomic_mb_read for index->ctr, memory barriers are placed * atomic_mb_read for index->ctr, memory barriers are placed
* manually since writes to different threads are independent. * 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, &registry, node) { QLIST_FOREACH(index, &registry, node) {
atomic_set(&index->waiting, true); 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(); smp_mb();
QLIST_FOREACH_SAFE(index, &registry, node, tmp) { QLIST_FOREACH_SAFE(index, &registry, node, tmp) {
@ -104,9 +106,6 @@ static void wait_for_readers(void)
} }
} }
/* atomic_mb_read has smp_rmb after. */
smp_rmb();
if (QLIST_EMPTY(&registry)) { if (QLIST_EMPTY(&registry)) {
break; break;
} }