On Thu, Sep 13, 2012 at 4:19 PM, Paolo Bonzini <pbonz...@redhat.com> wrote: > Il 13/09/2012 10:14, Avi Kivity ha scritto: >>>>> >>> +static inline void atomic_set(Atomic *v, int i) >>>>> >>> +{ >>>>> >>> + v->counter = i; >>>>> >>> +} >>>>> >>> + >>>>> >>> +static inline int atomic_read(Atomic *v) >>>>> >>> +{ >>>>> >>> + return v->counter; >>>>> >>> +} >>>>> >>> >>>> >> >>>> >> So these two operations don't get mangled by the optimizer. >>>> >> >>> > Browsing linux code and reading lkml, find some similar material. But >>> > they have moved volatile from ->counter to function - atomic_read(). >>> > As to atomic_read(), I think it need to prevent optimizer from >>> > refetching issue, but as to atomic_set(), do we need ? >> I think so, to prevent reordering. > > Agreed. Alternatively, stick a barrier() before and after the > assignment and read. > Yes, the linux just leave this barrier() as caller's choice at the exact point, not right in atomic_set(). And embed barrier() in atomic_set() can easy the caller's job.
Thanks and regards, pingfan > But I don't really see the point in wrapping atomically-accessed > variables in a struct. Are we going to add a variant for long, a > variant for pointers, etc.? > > I already proposed my version of this at > http://github.com/bonzini/qemu/commit/1b439343. > > Paolo