linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH] Document Linux's memory barriers [try #5]
       [not found]   ` <18351.1142432599@warthog.cambridge.redhat.com>
@ 2006-03-23 18:34     ` David Howells
  2006-03-23 19:28       ` Linus Torvalds
  2006-03-23 22:26       ` Paul E. McKenney
  0 siblings, 2 replies; 3+ messages in thread
From: David Howells @ 2006-03-23 18:34 UTC (permalink / raw)
  To: paulmck, davem; +Cc: akpm, linux-arch, linux-kernel, torvalds, linuxppc64-dev

Paul E. McKenney <paulmck@us.ibm.com> wrote:

> smp_mb__before_atomic_dec() and friends as well?

These seem to be something Sparc64 related; or, at least, Sparc64 seems to do
something weird with them.

What are these meant to achieve anyway? They seems to just be barrier() on a
lot of systems, even SMP ones.

> Some architectures have more expansive definition of data dependency,
> including then- and else-clauses being data-dependent on the if-condition,
> but this is probably too much detail.

Linus calls that a "control dependency" and doesn't seem to think that's a
problem as it's sorted out by branch prediction.  What you said makes me
wonder about conditional instructions (such as conditional move).


Anyway, I've incorporated your comments as well as reworking the document,
which I'll shortly push upstream once again.

David

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Document Linux's memory barriers [try #5]
  2006-03-23 18:34     ` [PATCH] Document Linux's memory barriers [try #5] David Howells
@ 2006-03-23 19:28       ` Linus Torvalds
  2006-03-23 22:26       ` Paul E. McKenney
  1 sibling, 0 replies; 3+ messages in thread
From: Linus Torvalds @ 2006-03-23 19:28 UTC (permalink / raw)
  To: David Howells
  Cc: akpm, linux-arch, linux-kernel, paulmck, davem, linuxppc64-dev



On Thu, 23 Mar 2006, David Howells wrote:
> 
> > Some architectures have more expansive definition of data dependency,
> > including then- and else-clauses being data-dependent on the if-condition,
> > but this is probably too much detail.
> 
> Linus calls that a "control dependency" and doesn't seem to think that's a
> problem as it's sorted out by branch prediction.  What you said makes me
> wonder about conditional instructions (such as conditional move).

I'd put it the other way: a control dependency is not "sorted out" by 
branch prediction, it is effectively _nullified_ by branch prediction.

Basically, control dependencies aren't dependencies at all. There is 
absolutely _zero_ dependency between the following two loads:

	if (load a)
		load b;

because the "load b" can happen before the "load a" because of control 
prediction.

So if you need a read barrier where there is a _control_ dependency in 
between loading a and loading b, you need to make it a full "smp_rmb()". 
It is _not_ sufficient to make this a "read_barrier_depends", because the 
load of b really doesn't depend on the load of a at all.

So data dependencies that result in control dependencies aren't 
dependencies at all. Not even if the address depends on the control 
dependency.

So

	int *address_of_b;

	address_of_b = load(&a);
	smp_read_barrier_depends();
	b = load(address_of_b);

is correct, but

	int *address_of_b = default_address_of_b;

	if (load(&a))
		address_of_b = another_address_of_b;
	smp_read_barrier_depends();
	b = load(address_of_b);

is NOT correct, because there is no data dependency on the load of b, just 
a control dependency that the CPU may short-circuit with prediction, and 
that second case thus needs a real smp_rmb().

And yes, if we ever hit a CPU that does actual data prediction, not just 
control prediction, that will force smp_read_barrier_depends() to be the 
same as smp_rmb() on such an architecture.

		Linus

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Document Linux's memory barriers [try #5]
  2006-03-23 18:34     ` [PATCH] Document Linux's memory barriers [try #5] David Howells
  2006-03-23 19:28       ` Linus Torvalds
@ 2006-03-23 22:26       ` Paul E. McKenney
  1 sibling, 0 replies; 3+ messages in thread
From: Paul E. McKenney @ 2006-03-23 22:26 UTC (permalink / raw)
  To: David Howells
  Cc: akpm, linux-arch, linux-kernel, torvalds, davem, linuxppc64-dev

On Thu, Mar 23, 2006 at 06:34:27PM +0000, David Howells wrote:
> Paul E. McKenney <paulmck@us.ibm.com> wrote:
> 
> > smp_mb__before_atomic_dec() and friends as well?
> 
> These seem to be something Sparc64 related; or, at least, Sparc64 seems to do
> something weird with them.
> 
> What are these meant to achieve anyway? They seems to just be barrier() on a
> lot of systems, even SMP ones.

On architectures such as x86 where atomic_dec() implies an smp_mb(),
they do nothing.  On other architectures, they supply whatever memory
barrier is required.

So, on x86:

	smp_mb();
	atomic_dec(&my_atomic_counter);

would result in -two- atomic instructions, but the smp_mb() would be
absolutely required on CPUs with weaker memory-consistency models.
So your choice is to (1) be inefficient on x86 or (2) be unsafe on
weak-memory-consistency systems.  What we can do instead is:

	smp_mb__before_atomic_dec();
	atomic_dec(&my_atomic_counter);

This allows x86 to generate efficient code -and- allows weak-memory
machines (e.g., Alpha, MIPS, PA-RISC(!), ppc, s390, SPARC64) to generate
safe code.

						Thanx, Paul

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2006-03-23 22:26 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20060316231723.GB1323@us.ibm.com>
     [not found] ` <16835.1141936162@warthog.cambridge.redhat.com>
     [not found]   ` <18351.1142432599@warthog.cambridge.redhat.com>
2006-03-23 18:34     ` [PATCH] Document Linux's memory barriers [try #5] David Howells
2006-03-23 19:28       ` Linus Torvalds
2006-03-23 22:26       ` Paul E. McKenney

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).