This document gives an overview of the categories of memory-ordering
operations provided by the Linux-kernel memory model (LKMM).


Categories of Ordering
======================

This section lists LKMM's three top-level categories of memory-ordering
operations in decreasing order of strength:

1.	Barriers (also known as "fences").  A barrier orders some or
	all of the CPU's prior operations against some or all of its
	subsequent operations.

2.	Ordered memory accesses.  These operations order themselves
	against some or all of the CPU's prior accesses or some or all
	of the CPU's subsequent accesses, depending on the subcategory
	of the operation.

3.	Unordered accesses, as the name indicates, have no ordering
	properties except to the extent that they interact with an
	operation in the previous categories.  This being the real world,
	some of these "unordered" operations provide limited ordering
	in some special situations.

Each of the above categories is described in more detail by one of the
following sections.


Barriers
========

Each of the following categories of barriers is described in its own
subsection below:

a.	Full memory barriers.

b.	Read-modify-write (RMW) ordering augmentation barriers.

c.	Write memory barrier.

d.	Read memory barrier.

e.	Compiler barrier.

Note well that many of these primitives generate absolutely no code
in kernels built with CONFIG_SMP=n.  Therefore, if you are writing
a device driver, which must correctly order accesses to a physical
device even in kernels built with CONFIG_SMP=n, please use the
ordering primitives provided for that purpose.  For example, instead of
smp_mb(), use mb().  See the "Linux Kernel Device Drivers" book or the
https://lwn.net/Articles/698014/ article for more information.


Full Memory Barriers
--------------------

The Linux-kernel primitives that provide full ordering include:

o	The smp_mb() full memory barrier.

o	Value-returning RMW atomic operations whose names do not end in
	_acquire, _release, or _relaxed.

o	RCU's grace-period primitives.

First, the smp_mb() full memory barrier orders all of the CPU's prior
accesses against all subsequent accesses from the viewpoint of all CPUs.
In other words, all CPUs will agree that any earlier action taken
by that CPU happened before any later action taken by that same CPU.
For example, consider the following:

	WRITE_ONCE(x, 1);
	smp_mb(); // Order store to x before load from y.
	r1 = READ_ONCE(y);

All CPUs will agree that the store to "x" happened before the load
from "y", as indicated by the comment.  And yes, please comment your
memory-ordering primitives.  It is surprisingly hard to remember their
purpose after even a few months.

Second, some RMW atomic operations provide full ordering.  These
operations include value-returning RMW atomic operations (that is, those
with non-void return types) whose names do not end in _acquire, _release,
or _relaxed.  Examples include atomic_add_return(), atomic_dec_and_test(),
cmpxchg(), and xchg().  Note that conditional RMW atomic operations such
as cmpxchg() are only guaranteed to provide ordering when they succeed.
When RMW atomic operations provide full ordering, they partition the
CPU's accesses into three groups:

1.	All code that executed prior to the RMW atomic operation.

2.	The RMW atomic operation itself.

3.	All code that executed after the RMW atomic operation.

All CPUs will agree that any operation in a given partition happened
before any operation in a higher-numbered partition.

In contrast, non-value-returning RMW atomic operations (that is, those
with void return types) do not guarantee any ordering whatsoever.  Nor do
value-returning RMW atomic operations whose names end in _relaxed.
Examples of the former include atomic_inc() and atomic_dec(),
while examples of the latter include atomic_cmpxchg_relaxed() and
atomic_xchg_relaxed().  Similarly, value-returning non-RMW atomic
operations such as atomic_read() do not guarantee full ordering, and
are covered in the later section on unordered operations.

Value-returning RMW atomic operations whose names end in _acquire or
_release provide limited ordering, and will be described later in this
document.

Finally, RCU's grace-period primitives provide full ordering.  These
primitives include synchronize_rcu(), synchronize_rcu_expedited(),
synchronize_srcu() and so on.  However, these primitives have orders
of magnitude greater overhead than smp_mb(), atomic_xchg(), and so on.
Furthermore, RCU's grace-period primitives can only be invoked in
sleepable contexts.  Therefore, RCU's grace-period primitives are
typically instead used to provide ordering against RCU read-side critical
sections, as documented in their comment headers.  But of course if you
need a synchronize_rcu() to interact with readers, it costs you nothing
to also rely on its additional full-memory-barrier semantics.  Just please
carefully comment this, otherwise your future self will hate you.


RMW Ordering Augmentation Barriers
----------------------------------

As noted in the previous section, non-value-returning RMW operations
such as atomic_inc() and atomic_dec() guarantee no ordering whatsoever.
Nevertheless, a number of popular CPU families, including x86, provide
full ordering for these primitives.  One way to obtain full ordering on
all architectures is to add a call to smp_mb():

	WRITE_ONCE(x, 1);
	atomic_inc(&my_counter);
	smp_mb(); // Inefficient on x86!!!
	r1 = READ_ONCE(y);

This works, but the added smp_mb() adds needless overhead for
x86, on which atomic_inc() provides full ordering all by itself.
The smp_mb__after_atomic() primitive can be used instead:

	WRITE_ONCE(x, 1);
	atomic_inc(&my_counter);
	smp_mb__after_atomic(); // Order store to x before load from y.
	r1 = READ_ONCE(y);

The smp_mb__after_atomic() primitive emits code only on CPUs whose
atomic_inc() implementations do not guarantee full ordering, thus
incurring no unnecessary overhead on x86.  There are a number of
variations on the smp_mb__*() theme:

o	smp_mb__before_atomic(), which provides full ordering prior
	to an unordered RMW atomic operation.

o	smp_mb__after_atomic(), which, as shown above, provides full
	ordering subsequent to an unordered RMW atomic operation.

o	smp_mb__after_spinlock(), which provides full ordering subsequent
	to a successful spinlock acquisition.  Note that spin_lock() is
	always successful but spin_trylock() might not be.

o	smp_mb__after_srcu_read_unlock(), which provides full ordering
	subsequent to an srcu_read_unlock().

It is bad practice to place code between the smp__*() primitive and the
operation whose ordering that it is augmenting.  The reason is that the
ordering of this intervening code will differ from one CPU architecture
to another.


Write Memory Barrier
--------------------

The Linux kernel's write memory barrier is smp_wmb().  If a CPU executes
the following code:

	WRITE_ONCE(x, 1);
	smp_wmb();
	WRITE_ONCE(y, 1);

Then any given CPU will see the write to "x" has having happened before
the write to "y".  However, you are usually better off using a release
store, as described in the "Release Operations" section below.

Note that smp_wmb() might fail to provide ordering for unmarked C-language
stores because profile-driven optimization could determine that the
value being overwritten is almost always equal to the new value.  Such a
compiler might then reasonably decide to transform "x = 1" and "y = 1"
as follows:

	if (x != 1)
		x = 1;
	smp_wmb(); // BUG: does not order the reads!!!
	if (y != 1)
		y = 1;

Therefore, if you need to use smp_wmb() with unmarked C-language writes,
you will need to make sure that none of the compilers used to build
the Linux kernel carry out this sort of transformation, both now and in
the future.


Read Memory Barrier
-------------------

The Linux kernel's read memory barrier is smp_rmb().  If a CPU executes
the following code:

	r0 = READ_ONCE(y);
	smp_rmb();
	r1 = READ_ONCE(x);

Then any given CPU will see the read from "y" as having preceded the read from
"x".  However, you are usually better off using an acquire load, as described
in the "Acquire Operations" section below.

Compiler Barrier
----------------

The Linux kernel's compiler barrier is barrier().  This primitive
prohibits compiler code-motion optimizations that might move memory
references across the point in the code containing the barrier(), but
does not constrain hardware memory ordering.  For example, this can be
used to prevent the compiler from moving code across an infinite loop:

	WRITE_ONCE(x, 1);
	while (dontstop)
		barrier();
	r1 = READ_ONCE(y);

Without the barrier(), the compiler would be within its rights to move the
WRITE_ONCE() to follow the loop.  This code motion could be problematic
in the case where an interrupt handler terminates the loop.  Another way
to handle this is to use READ_ONCE() for the load of "dontstop".

Note that the barriers discussed previously use barrier() or its low-level
equivalent in their implementations.


Ordered Memory Accesses
=======================

The Linux kernel provides a wide variety of ordered memory accesses:

a.	Release operations.

b.	Acquire operations.

c.	RCU read-side ordering.

d.	Control dependencies.

Each of the above categories has its own section below.


Release Operations
------------------

Release operations include smp_store_release(), atomic_set_release(),
rcu_assign_pointer(), and value-returning RMW operations whose names
end in _release.  These operations order their own store against all
of the CPU's prior memory accesses.  Release operations often provide
improved readability and performance compared to explicit barriers.
For example, use of smp_store_release() saves a line compared to the
smp_wmb() example above:

	WRITE_ONCE(x, 1);
	smp_store_release(&y, 1);

More important, smp_store_release() makes it easier to connect up the
different pieces of the concurrent algorithm.  The variable stored to
by the smp_store_release(), in this case "y", will normally be used in
an acquire operation in other parts of the concurrent algorithm.

To see the performance advantages, suppose that the above example reads
from "x" instead of writing to it.  Then an smp_wmb() could not guarantee
ordering, and an smp_mb() would be needed instead:

	r1 = READ_ONCE(x);
	smp_mb();
	WRITE_ONCE(y, 1);

But smp_mb() often incurs much higher overhead than does
smp_store_release(), which still provides the needed ordering of "x"
against "y".  On x86, the version using smp_store_release() might compile
to a simple load instruction followed by a simple store instruction.
In contrast, the smp_mb() compiles to an expensive instruction that
provides the needed ordering.

There is a wide variety of release operations:

o	Store operations, including not only the aforementioned
	smp_store_release(), but also atomic_set_release(), and
	atomic_long_set_release().

o	RCU's rcu_assign_pointer() operation.  This is the same as
	smp_store_release() except that: (1) It takes the pointer to
	be assigned to instead of a pointer to that pointer, (2) It
	is intended to be used in conjunction with rcu_dereference()
	and similar rather than smp_load_acquire(), and (3) It checks
	for an RCU-protected pointer in "sparse" runs.

o	Value-returning RMW operations whose names end in _release,
	such as atomic_fetch_add_release() and cmpxchg_release().
	Note that release ordering is guaranteed only against the
	memory-store portion of the RMW operation, and not against the
	memory-load portion.  Note also that conditional operations such
	as cmpxchg_release() are only guaranteed to provide ordering
	when they succeed.

As mentioned earlier, release operations are often paired with acquire
operations, which are the subject of the next section.


Acquire Operations
------------------

Acquire operations include smp_load_acquire(), atomic_read_acquire(),
and value-returning RMW operations whose names end in _acquire.   These
operations order their own load against all of the CPU's subsequent
memory accesses.  Acquire operations often provide improved performance
and readability compared to explicit barriers.  For example, use of
smp_load_acquire() saves a line compared to the smp_rmb() example above:

	r0 = smp_load_acquire(&y);
	r1 = READ_ONCE(x);

As with smp_store_release(), this also makes it easier to connect
the different pieces of the concurrent algorithm by looking for the
smp_store_release() that stores to "y".  In addition, smp_load_acquire()
improves upon smp_rmb() by ordering against subsequent stores as well
as against subsequent loads.

There are a couple of categories of acquire operations:

o	Load operations, including not only the aforementioned
	smp_load_acquire(), but also atomic_read_acquire(), and
	atomic64_read_acquire().

o	Value-returning RMW operations whose names end in _acquire,
	such as atomic_xchg_acquire() and atomic_cmpxchg_acquire().
	Note that acquire ordering is guaranteed only against the
	memory-load portion of the RMW operation, and not against the
	memory-store portion.  Note also that conditional operations
	such as atomic_cmpxchg_acquire() are only guaranteed to provide
	ordering when they succeed.

Symmetry being what it is, acquire operations are often paired with the
release operations covered earlier.  For example, consider the following
example, where task0() and task1() execute concurrently:

	void task0(void)
	{
		WRITE_ONCE(x, 1);
		smp_store_release(&y, 1);
	}

	void task1(void)
	{
		r0 = smp_load_acquire(&y);
		r1 = READ_ONCE(x);
	}

If "x" and "y" are both initially zero, then either r0's final value
will be zero or r1's final value will be one, thus providing the required
ordering.


RCU Read-Side Ordering
----------------------

This category includes read-side markers such as rcu_read_lock()
and rcu_read_unlock() as well as pointer-traversal primitives such as
rcu_dereference() and srcu_dereference().

Compared to locking primitives and RMW atomic operations, markers
for RCU read-side critical sections incur very low overhead because
they interact only with the corresponding grace-period primitives.
For example, the rcu_read_lock() and rcu_read_unlock() markers interact
with synchronize_rcu(), synchronize_rcu_expedited(), and call_rcu().
The way this works is that if a given call to synchronize_rcu() cannot
prove that it started before a given call to rcu_read_lock(), then
that synchronize_rcu() must block until the matching rcu_read_unlock()
is reached.  For more information, please see the synchronize_rcu()
docbook header comment and the material in Documentation/RCU.

RCU's pointer-traversal primitives, including rcu_dereference() and
srcu_dereference(), order their load (which must be a pointer) against any
of the CPU's subsequent memory accesses whose address has been calculated
from the value loaded.  There is said to be an *address dependency*
from the value returned by the rcu_dereference() or srcu_dereference()
to that subsequent memory access.

A call to rcu_dereference() for a given RCU-protected pointer is
usually paired with a call to rcu_assign_pointer() for that same pointer
in much the same way that a call to smp_load_acquire() is paired with
a call to smp_store_release().  Calls to rcu_dereference() and
rcu_assign_pointer() are often buried in other APIs, for example,
the RCU list API members defined in include/linux/rculist.h.  For more
information, please see the docbook headers in that file, the most
recent LWN article on the RCU API (https://lwn.net/Articles/988638/),
and of course the material in Documentation/RCU.

If the pointer value is manipulated between the rcu_dereference()
that returned it and a later rcu_dereference(), please read
Documentation/RCU/rcu_dereference.rst.  It can also be quite helpful to
review uses in the Linux kernel.


Control Dependencies
--------------------

A control dependency extends from a marked load (READ_ONCE() or stronger)
through an "if" condition to a marked store (WRITE_ONCE() or stronger)
that is executed only by one of the legs of that "if" statement.
Control dependencies are so named because they are mediated by
control-flow instructions such as comparisons and conditional branches.

In short, you can use a control dependency to enforce ordering between
an READ_ONCE() and a WRITE_ONCE() when there is an "if" condition
between them.  The canonical example is as follows:

	q = READ_ONCE(a);
	if (q)
		WRITE_ONCE(b, 1);

In this case, all CPUs would see the read from "a" as happening before
the write to "b".

However, control dependencies are easily destroyed by compiler
optimizations, so any use of control dependencies must take into account
all of the compilers used to build the Linux kernel.  Please see the
"control-dependencies.txt" file for more information.


Unordered Accesses
==================

Each of these two categories of unordered accesses has a section below:

a.	Unordered marked operations.

b.	Unmarked C-language accesses.


Unordered Marked Operations
---------------------------

Unordered operations to different variables are just that, unordered.
However, if a group of CPUs apply these operations to a single variable,
all the CPUs will agree on the operation order.  Of course, the ordering
of unordered marked accesses can also be constrained using the mechanisms
described earlier in this document.

These operations come in three categories:

o	Marked writes, such as WRITE_ONCE() and atomic_set().  These
	primitives require the compiler to emit the corresponding store
	instructions in the expected execution order, thus suppressing
	a number of destructive optimizations.	However, they provide no
	hardware ordering guarantees, and in fact many CPUs will happily
	reorder marked writes with each other or with other unordered
	operations, unless these operations are to the same variable.

o	Marked reads, such as READ_ONCE() and atomic_read().  These
	primitives require the compiler to emit the corresponding load
	instructions in the expected execution order, thus suppressing
	a number of destructive optimizations.	However, they provide no
	hardware ordering guarantees, and in fact many CPUs will happily
	reorder marked reads with each other or with other unordered
	operations, unless these operations are to the same variable.

o	Unordered RMW atomic operations.  These are non-value-returning
	RMW atomic operations whose names do not end in _acquire or
	_release, and also value-returning RMW operations whose names
	end in _relaxed.  Examples include atomic_add(), atomic_or(),
	and atomic64_fetch_xor_relaxed().  These operations do carry
	out the specified RMW operation atomically, for example, five
	concurrent atomic_inc() operations applied to a given variable
	will reliably increase the value of that variable by five.
	However, many CPUs will happily reorder these operations with
	each other or with other unordered operations.

	This category of operations can be efficiently ordered using
	smp_mb__before_atomic() and smp_mb__after_atomic(), as was
	discussed in the "RMW Ordering Augmentation Barriers" section.

In short, these operations can be freely reordered unless they are all
operating on a single variable or unless they are constrained by one of
the operations called out earlier in this document.


Unmarked C-Language Accesses
----------------------------

Unmarked C-language accesses are normal variable accesses to normal
variables, that is, to variables that are not "volatile" and are not
C11 atomic variables.  These operations provide no ordering guarantees,
and further do not guarantee "atomic" access.  For example, the compiler
might (and sometimes does) split a plain C-language store into multiple
smaller stores.  A load from that same variable running on some other
CPU while such a store is executing might see a value that is a mashup
of the old value and the new value.

Unmarked C-language accesses are unordered, and are also subject to
any number of compiler optimizations, many of which can break your
concurrent code.  It is possible to use unmarked C-language accesses for
shared variables that are subject to concurrent access, but great care
is required on an ongoing basis.  The compiler-constraining barrier()
primitive can be helpful, as can the various ordering primitives discussed
in this document.  It nevertheless bears repeating that use of unmarked
C-language accesses requires careful attention to not just your code,
but to all the compilers that might be used to build it.  Such compilers
might replace a series of loads with a single load, and might replace
a series of stores with a single store.  Some compilers will even split
a single store into multiple smaller stores.

But there are some ways of using unmarked C-language accesses for shared
variables without such worries:

o	Guard all accesses to a given variable by a particular lock,
	so that there are never concurrent conflicting accesses to
	that variable.	(There are "conflicting accesses" when
	(1) at least one of the concurrent accesses to a variable is an
	unmarked C-language access and (2) when at least one of those
	accesses is a write, whether marked or not.)

o	As above, but using other synchronization primitives such
	as reader-writer locks or sequence locks.

o	Use locking or other means to ensure that all concurrent accesses
	to a given variable are reads.

o	Restrict use of a given variable to statistics or heuristics
	where the occasional bogus value can be tolerated.

o	Declare the accessed variables as C11 atomics.
	https://lwn.net/Articles/691128/

o	Declare the accessed variables as "volatile".

If you need to live more dangerously, please do take the time to
understand the compilers.  One place to start is these two LWN
articles:

Who's afraid of a big bad optimizing compiler?
	https://lwn.net/Articles/793253
Calibrating your fear of big bad optimizing compilers
	https://lwn.net/Articles/799218

Used properly, unmarked C-language accesses can reduce overhead on
fastpaths.  However, the price is great care and continual attention
to your compiler as new versions come out and as new optimizations
are enabled.
