On Tue, May 17, 2016 at 20:13:24 +0300, Sergey Fedorov wrote: > On 14/05/16 06:34, Emilio G. Cota wrote: (snip) > > +static inline void qemu_spin_lock(QemuSpin *spin) > > +{ > > + while (atomic_test_and_set_acquire(&spin->value)) { > > From gcc-4.8 info page, node "__atomic Builtins", description of > __atomic_test_and_set(): > > It should be only used for operands of type 'bool' or 'char'.
Yes I'm aware of that. The way I interpret it is that if you're storing something other than something ~= bool, you might be in trouble, since it might get cleared. We use 'int' but effectively store here a bool, so we're safe. As to why we're using int, see http://thread.gmane.org/gmane.comp.emulators.qemu/405812/focus=405965 > > + while (atomic_read(&spin->value)) { > > + cpu_relax(); > > + } > > + } > Looks like relaxed atomic access can be a subject to various > optimisations according to > https://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync#Relaxed. The important thing here is that the read actually happens on every iteration; this is achieved with atomic_read(). Barriers etc. do not matter here because once we exit the loop, the try to acquire the lock -- and if we succeed, we then emit the right barrier. > > +static inline bool qemu_spin_locked(QemuSpin *spin) > > +{ > > + return atomic_read_acquire(&spin->value); > > Why not just atomic_read()? I think atomic_read() is better, yes. I'll change it. I went with the fence because I wanted to have at least a caller of atomic_read_acquire :P I also hesitated between calling it _locked or _is_locked; I used _locked for consistency with qemu_mutex_iothread_locked, although I think _is_locked is a bit clearer: qemu_spin_locked(foo) is a little too similar to qemu_spin_lock(foo). Thanks, Emilio