From: Peter Zijlstra <peterz@infradead.org>
To: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Cc: Will Deacon <will.deacon@arm.com>,
Vineet Gupta <Vineet.Gupta1@synopsys.com>,
Waiman Long <waiman.long@hpe.com>,
linux-kernel@vger.kernel.org, torvalds@linux-foundation.org,
manfred@colorfullife.com, dave@stgolabs.net,
boqun.feng@gmail.com, tj@kernel.org, pablo@netfilter.org,
kaber@trash.net, davem@davemloft.net, oleg@redhat.com,
netfilter-devel@vger.kernel.org, sasha.levin@oracle.com,
hofrat@osadl.org
Subject: Re: [RFC][PATCH 1/3] locking: Introduce smp_acquire__after_ctrl_dep
Date: Tue, 7 Jun 2016 09:15:08 +0200 [thread overview]
Message-ID: <20160607071508.GL30909@twins.programming.kicks-ass.net> (raw)
In-Reply-To: <20160606172824.GA10383@linux.vnet.ibm.com>
On Mon, Jun 06, 2016 at 10:28:24AM -0700, Paul E. McKenney wrote:
> commit 43672d15aeb69b1a196c06cbc071cbade8d247fd
> Author: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> Date: Mon Jun 6 10:19:42 2016 -0700
>
> documentation: Clarify limited control-dependency scope
>
> Nothing in the control-dependencies section of memory-barriers.txt
> says that control dependencies don't extend beyond the end of the
> if-statement containing the control dependency. Worse yet, in many
> situations, they do extend beyond that if-statement. In particular,
> the compiler cannot destroy the control dependency given proper use of
> READ_ONCE() and WRITE_ONCE(). However, a weakly ordered system having
> a conditional-move instruction provides the control-dependency guarantee
> only to code within the scope of the if-statement itself.
>
> This commit therefore adds words and an example demonstrating this
> limitation of control dependencies.
>
> Reported-by: Will Deacon <will.deacon@arm.com>
> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
>
> diff --git a/Documentation/memory-barriers.txt b/Documentation/memory-barriers.txt
> index 147ae8ec836f..a4d0a99de04d 100644
> --- a/Documentation/memory-barriers.txt
> +++ b/Documentation/memory-barriers.txt
> @@ -806,6 +806,41 @@ out-guess your code. More generally, although READ_ONCE() does force
> the compiler to actually emit code for a given load, it does not force
> the compiler to use the results.
>
> +In addition, control dependencies apply only to the then-clause and
> +else-clause of the if-statement in question. In particular, it does
> +not necessarily apply to code following the if-statement:
> +
> + q = READ_ONCE(a);
> + if (q) {
> + WRITE_ONCE(b, p);
> + } else {
> + WRITE_ONCE(b, r);
> + }
> + WRITE_ONCE(c, 1); /* BUG: No ordering against the read from "a". */
> +
> +It is tempting to argue that there in fact is ordering because the
> +compiler cannot reorder volatile accesses and also cannot reorder
> +the writes to "b" with the condition. Unfortunately for this line
> +of reasoning, the compiler might compile the two writes to "b" as
> +conditional-move instructions, as in this fanciful pseudo-assembly
> +language:
> +
> + ld r1,a
> + ld r2,p
> + ld r3,r
> + cmp r1,$0
> + cmov,ne r4,r2
> + cmov,eq r4,r3
> + st r4,b
> + st $1,c
> +
> +A weakly ordered CPU would have no dependency of any sort between the load
> +from "a" and the store to "c". The control dependencies would extend
> +only to the pair of cmov instructions and the store depending on them.
> +In short, control dependencies apply only to the stores in the then-clause
> +and else-clause of the if-statement in question (including functions
> +invoked by those two clauses), not to code following that if-statement.
> +
> Finally, control dependencies do -not- provide transitivity. This is
> demonstrated by two related examples, with the initial values of
> x and y both being zero:
> @@ -869,6 +904,12 @@ In summary:
> atomic{,64}_read() can help to preserve your control dependency.
> Please see the COMPILER BARRIER section for more information.
>
> + (*) Control dependencies apply only to the then-clause and else-clause
> + of the if-statement containing the control dependency, including
> + any functions that these two clauses call. Control dependencies
> + do -not- apply to code following the if-statement containing the
> + control dependency.
> +
> (*) Control dependencies pair normally with other types of barriers.
>
> (*) Control dependencies do -not- provide transitivity. If you
>
next prev parent reply other threads:[~2016-06-07 7:15 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-24 14:27 [RFC][PATCH 0/3] spin_unlock_wait and assorted borkage Peter Zijlstra
2016-05-24 14:27 ` [RFC][PATCH 1/3] locking: Introduce smp_acquire__after_ctrl_dep Peter Zijlstra
[not found] ` <57451581.6000700@hpe.com>
2016-05-25 4:53 ` Paul E. McKenney
2016-05-25 5:39 ` Boqun Feng
2016-05-25 14:29 ` Paul E. McKenney
2016-05-25 15:20 ` Waiman Long
2016-05-25 15:57 ` Paul E. McKenney
2016-05-25 16:28 ` Peter Zijlstra
2016-05-25 16:54 ` Linus Torvalds
2016-05-25 18:59 ` Paul E. McKenney
2016-06-03 9:18 ` Vineet Gupta
2016-06-03 9:38 ` Peter Zijlstra
2016-06-03 12:08 ` Paul E. McKenney
2016-06-03 12:23 ` Peter Zijlstra
2016-06-03 12:27 ` Peter Zijlstra
2016-06-03 13:33 ` Paul E. McKenney
2016-06-03 13:32 ` Paul E. McKenney
2016-06-03 13:45 ` Will Deacon
2016-06-04 15:29 ` Paul E. McKenney
2016-06-06 17:28 ` Paul E. McKenney
2016-06-07 7:15 ` Peter Zijlstra [this message]
2016-06-07 12:41 ` Hannes Frederic Sowa
2016-06-07 13:06 ` Paul E. McKenney
2016-06-07 14:59 ` Hannes Frederic Sowa
2016-06-07 15:23 ` Paul E. McKenney
2016-06-07 17:48 ` Peter Zijlstra
2016-06-07 18:44 ` Paul E. McKenney
2016-06-07 18:01 ` Will Deacon
2016-06-07 18:44 ` Paul E. McKenney
2016-06-07 18:54 ` Paul E. McKenney
2016-06-07 18:37 ` Hannes Frederic Sowa
2016-05-24 14:27 ` [RFC][PATCH 2/3] locking: Annotate spin_unlock_wait() users Peter Zijlstra
2016-05-24 16:17 ` Linus Torvalds
2016-05-24 16:22 ` Tejun Heo
2016-05-24 16:58 ` Peter Zijlstra
2016-05-25 19:28 ` Tejun Heo
2016-05-24 16:57 ` Peter Zijlstra
2016-05-24 14:27 ` [RFC][PATCH 3/3] locking,netfilter: Fix nf_conntrack_lock() Peter Zijlstra
2016-05-24 14:42 ` Peter Zijlstra
[not found] ` <3e1671fc-be0f-bc95-4fbb-6bfc56e6c15b@colorfullife.com>
2016-05-26 13:54 ` Peter Zijlstra
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=20160607071508.GL30909@twins.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=Vineet.Gupta1@synopsys.com \
--cc=boqun.feng@gmail.com \
--cc=dave@stgolabs.net \
--cc=davem@davemloft.net \
--cc=hofrat@osadl.org \
--cc=kaber@trash.net \
--cc=linux-kernel@vger.kernel.org \
--cc=manfred@colorfullife.com \
--cc=netfilter-devel@vger.kernel.org \
--cc=oleg@redhat.com \
--cc=pablo@netfilter.org \
--cc=paulmck@linux.vnet.ibm.com \
--cc=sasha.levin@oracle.com \
--cc=tj@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=waiman.long@hpe.com \
--cc=will.deacon@arm.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.