[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC 07/38] seqlock: read sequence number atomically
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [RFC 07/38] seqlock: read sequence number atomically |
Date: |
Mon, 7 Sep 2015 18:13:56 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 |
On 07/09/2015 17:53, Alex Bennée wrote:
>> > With this change we make sure that the compiler will not
>> > optimise the read of the sequence number in any way.
> What was it doing? Using atomic_read to work around a compiler bug seems
> a bit heavy handed if true atomicity isn't needed.
This is really the equivalent of C11 atomic_relaxed, so it isn't heavy
handed. We really should move towards using atomic_read/atomic_set
around smp_rmb/smp_wmb/smp_mb.
Paolo
>> >
>> > Signed-off-by: Emilio G. Cota <address@hidden>
>> > ---
>> > include/qemu/seqlock.h | 6 +++---
>> > 1 file changed, 3 insertions(+), 3 deletions(-)
>> >
>> > diff --git a/include/qemu/seqlock.h b/include/qemu/seqlock.h
>> > index f1256f5..70b01fd 100644
>> > --- a/include/qemu/seqlock.h
>> > +++ b/include/qemu/seqlock.h
>> > @@ -55,18 +55,18 @@ static inline void seqlock_write_unlock(QemuSeqLock
>> > *sl)
>> > static inline unsigned seqlock_read_begin(QemuSeqLock *sl)
>> > {
>> > /* Always fail if a write is in progress. */
>> > - unsigned ret = sl->sequence & ~1;
>> > + unsigned ret = atomic_read(&sl->sequence);
>> >
>> > /* Read sequence before reading other fields. */
>> > smp_rmb();
>> > - return ret;
>> > + return ret & ~1;
>> > }
>> >
>> > static inline int seqlock_read_retry(const QemuSeqLock *sl, unsigned
>> > start)
>> > {
>> > /* Read other fields before reading final sequence. */
>> > smp_rmb();
>> > - return unlikely(sl->sequence != start);
>> > + return unlikely(atomic_read(&sl->sequence) != start);