From: Paolo Bonzini <pbonzini@redhat.com>
To: "Pranith Kumar" <bobby.prani@gmail.com>,
"Alex Bennée" <alex.bennee@linaro.org>
Cc: mttcg@greensocs.com, peter.maydell@linaro.org,
mark.burton@greensocs.com, a.rigo@virtualopensystems.com,
qemu-devel@nongnu.org, stefanha@redhat.com,
fred.konrad@greensocs.com
Subject: Re: [Qemu-devel] [PATCH v1 3/5] include/qemu/atomic.h: default to __atomic functions
Date: Mon, 4 Apr 2016 10:14:59 +0200 [thread overview]
Message-ID: <57022283.5070400@redhat.com> (raw)
In-Reply-To: <87h9fl12zq.fsf@gmail.com>
On 01/04/2016 22:35, Pranith Kumar wrote:; barrier(); })
> I could not really understand why we need to wrap the fence with
> barrier()'s. There are three parts to my confusion. Let me ask one after the
> other.
>
> On x86, __atomic_thread_fence(__ATOMIC_SEQ_CST) will generate an mfence
> instruction. On ARM, this will generate the dmb instruction. Both these
> serializing instructions also act as compiler barriers. Is there any
> architecture which does not generate such a serializing instruction?
(More on this later).
>> +#define smp_wmb() ({ barrier(); __atomic_thread_fence(__ATOMIC_RELEASE); barrier(); })
>> +#define smp_rmb() ({ barrier(); __atomic_thread_fence(__ATOMIC_ACQUIRE); barrier(); })
>
> Second, why do you need barrier() on both sides? One barrier() seems to be
> sufficient to prevent the compiler from reordering across the macro. Am I
> missing something?
Yes, that's true.
> Finally, I tried looking at the gcc docs but could find nothing regarding
> __atomic_thread_fence() not being considered as a memory barrier. What I did
> find mentions about it being treated as a function call during the main
> optimization stages and not during later stages:
>
> http://www.spinics.net/lists/gcchelp/msg39798.html
>
> AFAIU, in these later stages, even adding a barrier() as we are doing will
> have no effect.
>
> Can you point me to any docs which talk more about this?
The issue is that atomic_thread_fence() only affects other atomic
operations, while smp_rmb() and smp_wmb() affect normal loads and stores
as well.
In the GCC implementation, atomic operations (even relaxed ones) access
memory as if the pointer was volatile. By doing this, GCC can remove
the acquire and release fences altogether on TSO architectures. We
actually observed a case where the compiler subsequently inverted the
order of two writes around a smp_wmb(). It was fixed in commit 3bbf572
("atomics: add explicit compiler fence in __atomic memory barriers",
2015-06-05).
In principle it could do the same on architectures that are sequentially
consistent; even if none exists in practice, keeping the barriers for
smp_mb() is consistent with the other barriers.
Paolo
next prev parent reply other threads:[~2016-04-04 8:15 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-28 10:15 [Qemu-devel] [PATCH v1 0/5] ThreadSanitizer support Alex Bennée
2016-01-28 10:15 ` [Qemu-devel] [PATCH v1 1/5] configure: introduce --extra-libs Alex Bennée
2016-01-28 11:14 ` Paolo Bonzini
2016-01-28 11:38 ` Alex Bennée
2016-01-28 10:15 ` [Qemu-devel] [PATCH v1 2/5] configure: ensure ldflags propagated to config_host Alex Bennée
2016-01-28 11:10 ` Paolo Bonzini
2016-01-28 11:13 ` Paolo Bonzini
2016-01-29 15:26 ` Alex Bennée
2016-01-28 10:15 ` [Qemu-devel] [PATCH v1 3/5] include/qemu/atomic.h: default to __atomic functions Alex Bennée
2016-01-28 11:00 ` Paolo Bonzini
2016-01-29 16:06 ` Alex Bennée
2016-02-04 12:40 ` Paolo Bonzini
2016-02-04 13:00 ` Peter Maydell
2016-04-01 14:30 ` James Hogan
2016-04-01 14:51 ` Peter Maydell
2016-04-01 16:06 ` Alex Bennée
2016-04-01 20:35 ` Pranith Kumar
2016-04-04 8:14 ` Paolo Bonzini [this message]
2016-04-04 16:26 ` Pranith Kumar
2016-04-04 17:03 ` Paolo Bonzini
2016-04-04 20:15 ` Paolo Bonzini
2016-04-05 3:35 ` Pranith Kumar
2016-04-05 12:47 ` Paolo Bonzini
2016-01-28 10:15 ` [Qemu-devel] [PATCH v1 4/5] async.c: various atomic fixes for tsan Alex Bennée
2016-01-28 10:45 ` Paolo Bonzini
2016-01-28 10:15 ` [Qemu-devel] [PATCH v1 5/5] thread-pool: atomic fixes from tsan Alex Bennée
2016-01-28 10:44 ` Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=57022283.5070400@redhat.com \
--to=pbonzini@redhat.com \
--cc=a.rigo@virtualopensystems.com \
--cc=alex.bennee@linaro.org \
--cc=bobby.prani@gmail.com \
--cc=fred.konrad@greensocs.com \
--cc=mark.burton@greensocs.com \
--cc=mttcg@greensocs.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).