This document provides options for those wishing to keep their
memory-ordering lives simple, as is necessary for those whose domain
is complex.  After all, there are bugs other than memory-ordering bugs,
and the time spent gaining memory-ordering knowledge is not available
for gaining domain knowledge.  Furthermore Linux-kernel memory model
(LKMM) is quite complex, with subtle differences in code often having
dramatic effects on correctness.

The options near the beginning of this list are quite simple.  The idea
is not that kernel hackers don't already know about them, but rather
that they might need the occasional reminder.

Please note that this is a generic guide, and that specific subsystems
will often have special requirements or idioms.  For example, developers
of MMIO-based device drivers will often need to use mb(), rmb(), and
wmb(), and therefore might find smp_mb(), smp_rmb(), and smp_wmb()
to be more natural than smp_load_acquire() and smp_store_release().
On the other hand, those coming in from other environments will likely
be more familiar with these last two.


Single-threaded code
====================

In single-threaded code, there is no reordering, at least assuming
that your toolchain and hardware are working correctly.  In addition,
it is generally a mistake to assume your code will only run in a single
threaded context as the kernel can enter the same code path on multiple
CPUs at the same time.  One important exception is a function that makes
no external data references.

In the general case, you will need to take explicit steps to ensure that
your code really is executed within a single thread that does not access
shared variables.  A simple way to achieve this is to define a global lock
that you acquire at the beginning of your code and release at the end,
taking care to ensure that all references to your code's shared data are
also carried out under that same lock.  Because only one thread can hold
this lock at a given time, your code will be executed single-threaded.
This approach is called "code locking".

Code locking can severely limit both performance and scalability, so it
should be used with caution, and only on code paths that execute rarely.
After all, a huge amount of effort was required to remove the Linux
kernel's old "Big Kernel Lock", so let's please be very careful about
adding new "little kernel locks".

One of the advantages of locking is that, in happy contrast with the
year 1981, almost all kernel developers are very familiar with locking.
The Linux kernel's lockdep (CONFIG_PROVE_LOCKING=y) is very helpful with
the formerly feared deadlock scenarios.

Please use the standard locking primitives provided by the kernel rather
than rolling your own.  For one thing, the standard primitives interact
properly with lockdep.  For another thing, these primitives have been
tuned to deal better with high contention.  And for one final thing, it is
surprisingly hard to correctly code production-quality lock acquisition
and release functions.  After all, even simple non-production-quality
locking functions must carefully prevent both the CPU and the compiler
from moving code in either direction across the locking function.

Despite the scalability limitations of single-threaded code, RCU
takes this approach for much of its grace-period processing and also
for early-boot operation.  The reason RCU is able to scale despite
single-threaded grace-period processing is use of batching, where all
updates that accumulated during one grace period are handled by the
next one.  In other words, slowing down grace-period processing makes
it more efficient.  Nor is RCU unique:  Similar batching optimizations
are used in many I/O operations.


Packaged code
=============

Even if performance and scalability concerns prevent your code from
being completely single-threaded, it is often possible to use library
functions that handle the concurrency nearly or entirely on their own.
This approach delegates any LKMM worries to the library maintainer.

In the kernel, what is the "library"?  Quite a bit.  It includes the
contents of the lib/ directory, much of the include/linux/ directory along
with a lot of other heavily used APIs.  But heavily used examples include
the list macros (for example, include/linux/{,rcu}list.h), workqueues,
smp_call_function(), and the various hash tables and search trees.


Data locking
============

With code locking, we use single-threaded code execution to guarantee
serialized access to the data that the code is accessing.  However,
we can also achieve this by instead associating the lock with specific
instances of the data structures.  This creates a "critical section"
in the code execution that will execute as though it is single threaded.
By placing all the accesses and modifications to a shared data structure
inside a critical section, we ensure that the execution context that
holds the lock has exclusive access to the shared data.

The poster boy for this approach is the hash table, where placing a lock
in each hash bucket allows operations on different buckets to proceed
concurrently.  This works because the buckets do not overlap with each
other, so that an operation on one bucket does not interfere with any
other bucket.

As the number of buckets increases, data locking scales naturally.
In particular, if the amount of data increases with the number of CPUs,
increasing the number of buckets as the number of CPUs increase results
in a naturally scalable data structure.


Per-CPU processing
==================

Partitioning processing and data over CPUs allows each CPU to take
a single-threaded approach while providing excellent performance and
scalability.  Of course, there is no free lunch:  The dark side of this
excellence is substantially increased memory footprint.

In addition, it is sometimes necessary to occasionally update some global
view of this processing and data, in which case something like locking
must be used to protect this global view.  This is the approach taken
by the percpu_counter infrastructure. In many cases, there are already
generic/library variants of commonly used per-cpu constructs available.
Please use them rather than rolling your own.

RCU uses DEFINE_PER_CPU*() declaration to create a number of per-CPU
data sets.  For example, each CPU does private quiescent-state processing
within its instance of the per-CPU rcu_data structure, and then uses data
locking to report quiescent states up the grace-period combining tree.


Packaged primitives: Sequence locking
=====================================

Lockless programming is considered by many to be more difficult than
lock-based programming, but there are a few lockless design patterns that
have been built out into an API.  One of these APIs is sequence locking.
Although this APIs can be used in extremely complex ways, there are simple
and effective ways of using it that avoid the need to pay attention to
memory ordering.

The basic keep-things-simple rule for sequence locking is "do not write
in read-side code".  Yes, you can do writes from within sequence-locking
readers, but it won't be so simple.  For example, such writes will be
lockless and should be idempotent.

For more sophisticated use cases, LKMM can guide you, including use
cases involving combining sequence locking with other synchronization
primitives.  (LKMM does not yet know about sequence locking, so it is
currently necessary to open-code it in your litmus tests.)

Additional information may be found in include/linux/seqlock.h.

Packaged primitives: RCU
========================

Another lockless design pattern that has been baked into an API
is RCU.  The Linux kernel makes sophisticated use of RCU, but the
keep-things-simple rules for RCU are "do not write in read-side code"
and "do not update anything that is visible to and accessed by readers",
and "protect updates with locking".

These rules are illustrated by the functions foo_update_a() and
foo_get_a() shown in Documentation/RCU/whatisRCU.rst.  Additional
RCU usage patterns maybe found in Documentation/RCU and in the
source code.


Packaged primitives: Atomic operations
======================================

Back in the day, the Linux kernel had three types of atomic operations:

1.	Initialization and read-out, such as atomic_set() and atomic_read().

2.	Operations that did not return a value and provided no ordering,
	such as atomic_inc() and atomic_dec().

3.	Operations that returned a value and provided full ordering, such as
	atomic_add_return() and atomic_dec_and_test().  Note that some
	value-returning operations provide full ordering only conditionally.
	For example, cmpxchg() provides ordering only upon success.

More recent kernels have operations that return a value but do not
provide full ordering.  These are flagged with either a _relaxed()
suffix (providing no ordering), or an _acquire() or _release() suffix
(providing limited ordering).

Additional information may be found in these files:

Documentation/atomic_t.txt
Documentation/atomic_bitops.txt
Documentation/core-api/refcount-vs-atomic.rst

Reading code using these primitives is often also quite helpful.


Lockless, fully ordered
=======================

When using locking, there often comes a time when it is necessary
to access some variable or another without holding the data lock
that serializes access to that variable.

If you want to keep things simple, use the initialization and read-out
operations from the previous section only when there are no racing
accesses.  Otherwise, use only fully ordered operations when accessing
or modifying the variable.  This approach guarantees that code prior
to a given access to that variable will be seen by all CPUs has having
happened before any code following any later access to that same variable.

Please note that per-CPU functions are not atomic operations and
hence they do not provide any ordering guarantees at all.

If the lockless accesses are frequently executed reads that are used
only for heuristics, or if they are frequently executed writes that
are used only for statistics, please see the next section.


Lockless statistics and heuristics
==================================

Unordered primitives such as atomic_read(), atomic_set(), READ_ONCE(), and
WRITE_ONCE() can safely be used in some cases.  These primitives provide
no ordering, but they do prevent the compiler from carrying out a number
of destructive optimizations (for which please see the next section).
One example use for these primitives is statistics, such as per-CPU
counters exemplified by the rt_cache_stat structure's routing-cache
statistics counters.  Another example use case is heuristics, such as
the jiffies_till_first_fqs and jiffies_till_next_fqs kernel parameters
controlling how often RCU scans for idle CPUs.

But be careful.  "Unordered" really does mean "unordered".  It is all
too easy to assume ordering, and this assumption must be avoided when
using these primitives.


Don't let the compiler trip you up
==================================

It can be quite tempting to use plain C-language accesses for lockless
loads from and stores to shared variables.  Although this is both
possible and quite common in the Linux kernel, it does require a
surprising amount of analysis, care, and knowledge about the compiler.
Yes, some decades ago it was not unfair to consider a C compiler to be
an assembler with added syntax and better portability, but the advent of
sophisticated optimizing compilers mean that those days are long gone.
Today's optimizing compilers can profoundly rewrite your code during the
translation process, and have long been ready, willing, and able to do so.

Therefore, if you really need to use C-language assignments instead of
READ_ONCE(), WRITE_ONCE(), and so on, you will need to have a very good
understanding of both the C standard and your compiler.  Here are some
introductory references and some tooling to start you on this noble quest:

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/
Concurrency bugs should fear the big bad data-race detector (part 1)
	https://lwn.net/Articles/816850/
Concurrency bugs should fear the big bad data-race detector (part 2)
	https://lwn.net/Articles/816854/


More complex use cases
======================

If the alternatives above do not do what you need, please look at the
recipes-pairs.txt file to peel off the next layer of the memory-ordering
onion.
