This document contains brief definitions of LKMM-related terms.  Like most
glossaries, it is not intended to be read front to back (except perhaps
as a way of confirming a diagnosis of OCD), but rather to be searched
for specific terms.


Address Dependency:  When the address of a later memory access is computed
	based on the value returned by an earlier load, an "address
	dependency" extends from that load extending to the later access.
	Address dependencies are quite common in RCU read-side critical
	sections:

	 1 rcu_read_lock();
	 2 p = rcu_dereference(gp);
	 3 do_something(p->a);
	 4 rcu_read_unlock();

	In this case, because the address of "p->a" on line 3 is computed
	from the value returned by the rcu_dereference() on line 2, the
	address dependency extends from that rcu_dereference() to that
	"p->a".  In rare cases, optimizing compilers can destroy address
	dependencies.	Please see Documentation/RCU/rcu_dereference.rst
	for more information.

	See also "Control Dependency" and "Data Dependency".

Acquire:  With respect to a lock, acquiring that lock, for example,
	using spin_lock().  With respect to a non-lock shared variable,
	a special operation that includes a load and which orders that
	load before later memory references running on that same CPU.
	An example special acquire operation is smp_load_acquire(),
	but atomic_read_acquire() and atomic_xchg_acquire() also include
	acquire loads.

	When an acquire load returns the value stored by a release store
	to that same variable, (in other words, the acquire load "reads
	from" the release store), then all operations preceding that
	store "happen before" any operations following that load acquire.

	See also "Happens-Before", "Reads-From", "Relaxed", and "Release".

Coherence (co):  When one CPU's store to a given variable overwrites
	either the value from another CPU's store or some later value,
	there is said to be a coherence link from the second CPU to
	the first.

	It is also possible to have a coherence link within a CPU, which
	is a "coherence internal" (coi) link.  The term "coherence
	external" (coe) link is used when it is necessary to exclude
	the coi case.

	See also "From-reads" and "Reads-from".

Control Dependency:  When a later store's execution depends on a test
	of a value computed from a value returned by an earlier load,
	a "control dependency" extends from that load to that store.
	For example:

	 1 if (READ_ONCE(x))
	 2   WRITE_ONCE(y, 1);

	Here, the control dependency extends from the READ_ONCE() on
	line 1 to the WRITE_ONCE() on line 2.	Control dependencies are
	fragile, and can be easily destroyed by optimizing compilers.
	Please see control-dependencies.txt for more information.

	See also "Address Dependency" and "Data Dependency".

Cycle:	Memory-barrier pairing is restricted to a pair of CPUs, as the
	name suggests.	And in a great many cases, a pair of CPUs is all
	that is required.  In other cases, the notion of pairing must be
	extended to additional CPUs, and the result is called a "cycle".
	In a cycle, each CPU's ordering interacts with that of the next:

	 CPU 0                CPU 1                CPU 2
	 WRITE_ONCE(x, 1);    WRITE_ONCE(y, 1);    WRITE_ONCE(z, 1);
	 smp_mb();            smp_mb();            smp_mb();
	 r0 = READ_ONCE(y);   r1 = READ_ONCE(z);   r2 = READ_ONCE(x);

	CPU 0's smp_mb() interacts with that of CPU 1, which interacts
	with that of CPU 2, which in turn interacts with that of CPU 0
	to complete the cycle.	Because of the smp_mb() calls between
	each pair of memory accesses, the outcome where r0, r1, and r2
	are all equal to zero is forbidden by LKMM.

	See also "Pairing".

Data Dependency:  When the data written by a later store is computed based
	on the value returned by an earlier load, a "data dependency"
	extends from that load to that later store.  For example:

	 1 r1 = READ_ONCE(x);
	 2 WRITE_ONCE(y, r1 + 1);

	In this case, the data dependency extends from the READ_ONCE()
	on line 1 to the WRITE_ONCE() on line 2.  Data dependencies are
	fragile and can be easily destroyed by optimizing compilers.
	Because optimizing compilers put a great deal of effort into
	working out what values integer variables might have, this is
	especially true in cases where the dependency is carried through
	an integer.

	See also "Address Dependency" and "Control Dependency".

From-Reads (fr):  When one CPU's store to a given variable happened
	too late to affect the value returned by another CPU's
	load from that same variable, there is said to be a from-reads
	link from the load to the store.

	It is also possible to have a from-reads link within a CPU, which
	is a "from-reads internal" (fri) link.  The term "from-reads
	external" (fre) link is used when it is necessary to exclude
	the fri case.

	See also "Coherence" and "Reads-from".

Fully Ordered:  An operation such as smp_mb() that orders all of
	its CPU's prior accesses with all of that CPU's subsequent
	accesses, or a marked access such as atomic_add_return()
	that orders all of its CPU's prior accesses, itself, and
	all of its CPU's subsequent accesses.

Happens-Before (hb): A relation between two accesses in which LKMM
	guarantees the first access precedes the second.  For more
	detail, please see the "THE HAPPENS-BEFORE RELATION: hb"
	section of explanation.txt.

Marked Access:  An access to a variable that uses an special function or
	macro such as "r1 = READ_ONCE(x)" or "smp_store_release(&a, 1)".

	See also "Unmarked Access".

Pairing: "Memory-barrier pairing" reflects the fact that synchronizing
	data between two CPUs requires that both CPUs their accesses.
	Memory barriers thus tend to come in pairs, one executed by
	one of the CPUs and the other by the other CPU.  Of course,
	pairing also occurs with other types of operations, so that a
	smp_store_release() pairs with an smp_load_acquire() that reads
	the value stored.

	See also "Cycle".

Reads-From (rf):  When one CPU's load returns the value stored by some other
	CPU, there is said to be a reads-from link from the second
	CPU's store to the first CPU's load.  Reads-from links have the
	nice property that time must advance from the store to the load,
	which means that algorithms using reads-from links can use lighter
	weight ordering and synchronization compared to algorithms using
	coherence and from-reads links.

	It is also possible to have a reads-from link within a CPU, which
	is a "reads-from internal" (rfi) link.	The term "reads-from
	external" (rfe) link is used when it is necessary to exclude
	the rfi case.

	See also Coherence" and "From-reads".

Relaxed:  A marked access that does not imply ordering, for example, a
	READ_ONCE(), WRITE_ONCE(), a non-value-returning read-modify-write
	operation, or a value-returning read-modify-write operation whose
	name ends in "_relaxed".

	See also "Acquire" and "Release".

Release:  With respect to a lock, releasing that lock, for example,
	using spin_unlock().  With respect to a non-lock shared variable,
	a special operation that includes a store and which orders that
	store after earlier memory references that ran on that same CPU.
	An example special release store is smp_store_release(), but
	atomic_set_release() and atomic_cmpxchg_release() also include
	release stores.

	See also "Acquire" and "Relaxed".

Unmarked Access:  An access to a variable that uses normal C-language
	syntax, for example, "a = b[2]";

	See also "Marked Access".
