===================================== 
 | 
        LINUX KERNEL MEMORY CONSISTENCY MODEL 
 | 
        ===================================== 
 | 
  
 | 
============ 
 | 
INTRODUCTION 
 | 
============ 
 | 
  
 | 
This directory contains the memory consistency model (memory model, for 
 | 
short) of the Linux kernel, written in the "cat" language and executable 
 | 
by the externally provided "herd7" simulator, which exhaustively explores 
 | 
the state space of small litmus tests. 
 | 
  
 | 
In addition, the "klitmus7" tool (also externally provided) may be used 
 | 
to convert a litmus test to a Linux kernel module, which in turn allows 
 | 
that litmus test to be exercised within the Linux kernel. 
 | 
  
 | 
  
 | 
============ 
 | 
REQUIREMENTS 
 | 
============ 
 | 
  
 | 
Version 7.49 of the "herd7" and "klitmus7" tools must be downloaded 
 | 
separately: 
 | 
  
 | 
  https://github.com/herd/herdtools7 
 | 
  
 | 
See "herdtools7/INSTALL.md" for installation instructions. 
 | 
  
 | 
  
 | 
================== 
 | 
BASIC USAGE: HERD7 
 | 
================== 
 | 
  
 | 
The memory model is used, in conjunction with "herd7", to exhaustively 
 | 
explore the state space of small litmus tests. 
 | 
  
 | 
For example, to run SB+fencembonceonces.litmus against the memory model: 
 | 
  
 | 
  $ herd7 -conf linux-kernel.cfg litmus-tests/SB+fencembonceonces.litmus 
 | 
  
 | 
Here is the corresponding output: 
 | 
  
 | 
  Test SB+fencembonceonces Allowed 
 | 
  States 3 
 | 
  0:r0=0; 1:r0=1; 
 | 
  0:r0=1; 1:r0=0; 
 | 
  0:r0=1; 1:r0=1; 
 | 
  No 
 | 
  Witnesses 
 | 
  Positive: 0 Negative: 3 
 | 
  Condition exists (0:r0=0 /\ 1:r0=0) 
 | 
  Observation SB+fencembonceonces Never 0 3 
 | 
  Time SB+fencembonceonces 0.01 
 | 
  Hash=d66d99523e2cac6b06e66f4c995ebb48 
 | 
  
 | 
The "Positive: 0 Negative: 3" and the "Never 0 3" each indicate that 
 | 
this litmus test's "exists" clause can not be satisfied. 
 | 
  
 | 
See "herd7 -help" or "herdtools7/doc/" for more information. 
 | 
  
 | 
  
 | 
===================== 
 | 
BASIC USAGE: KLITMUS7 
 | 
===================== 
 | 
  
 | 
The "klitmus7" tool converts a litmus test into a Linux kernel module, 
 | 
which may then be loaded and run. 
 | 
  
 | 
For example, to run SB+fencembonceonces.litmus against hardware: 
 | 
  
 | 
  $ mkdir mymodules 
 | 
  $ klitmus7 -o mymodules litmus-tests/SB+fencembonceonces.litmus 
 | 
  $ cd mymodules ; make 
 | 
  $ sudo sh run.sh 
 | 
  
 | 
The corresponding output includes: 
 | 
  
 | 
  Test SB+fencembonceonces Allowed 
 | 
  Histogram (3 states) 
 | 
  644580  :>0:r0=1; 1:r0=0; 
 | 
  644328  :>0:r0=0; 1:r0=1; 
 | 
  711092  :>0:r0=1; 1:r0=1; 
 | 
  No 
 | 
  Witnesses 
 | 
  Positive: 0, Negative: 2000000 
 | 
  Condition exists (0:r0=0 /\ 1:r0=0) is NOT validated 
 | 
  Hash=d66d99523e2cac6b06e66f4c995ebb48 
 | 
  Observation SB+fencembonceonces Never 0 2000000 
 | 
  Time SB+fencembonceonces 0.16 
 | 
  
 | 
The "Positive: 0 Negative: 2000000" and the "Never 0 2000000" indicate 
 | 
that during two million trials, the state specified in this litmus 
 | 
test's "exists" clause was not reached. 
 | 
  
 | 
And, as with "herd7", please see "klitmus7 -help" or "herdtools7/doc/" 
 | 
for more information. 
 | 
  
 | 
  
 | 
==================== 
 | 
DESCRIPTION OF FILES 
 | 
==================== 
 | 
  
 | 
Documentation/cheatsheet.txt 
 | 
    Quick-reference guide to the Linux-kernel memory model. 
 | 
  
 | 
Documentation/explanation.txt 
 | 
    Describes the memory model in detail. 
 | 
  
 | 
Documentation/recipes.txt 
 | 
    Lists common memory-ordering patterns. 
 | 
  
 | 
Documentation/references.txt 
 | 
    Provides background reading. 
 | 
  
 | 
linux-kernel.bell 
 | 
    Categorizes the relevant instructions, including memory 
 | 
    references, memory barriers, atomic read-modify-write operations, 
 | 
    lock acquisition/release, and RCU operations. 
 | 
  
 | 
    More formally, this file (1) lists the subtypes of the various 
 | 
    event types used by the memory model and (2) performs RCU 
 | 
    read-side critical section nesting analysis. 
 | 
  
 | 
linux-kernel.cat 
 | 
    Specifies what reorderings are forbidden by memory references, 
 | 
    memory barriers, atomic read-modify-write operations, and RCU. 
 | 
  
 | 
    More formally, this file specifies what executions are forbidden 
 | 
    by the memory model.  Allowed executions are those which 
 | 
    satisfy the model's "coherence", "atomic", "happens-before", 
 | 
    "propagation", and "rcu" axioms, which are defined in the file. 
 | 
  
 | 
linux-kernel.cfg 
 | 
    Convenience file that gathers the common-case herd7 command-line 
 | 
    arguments. 
 | 
  
 | 
linux-kernel.def 
 | 
    Maps from C-like syntax to herd7's internal litmus-test 
 | 
    instruction-set architecture. 
 | 
  
 | 
litmus-tests 
 | 
    Directory containing a few representative litmus tests, which 
 | 
    are listed in litmus-tests/README.  A great deal more litmus 
 | 
    tests are available at https://github.com/paulmckrcu/litmus. 
 | 
  
 | 
lock.cat 
 | 
    Provides a front-end analysis of lock acquisition and release, 
 | 
    for example, associating a lock acquisition with the preceding 
 | 
    and following releases and checking for self-deadlock. 
 | 
  
 | 
    More formally, this file defines a performance-enhanced scheme 
 | 
    for generation of the possible reads-from and coherence order 
 | 
    relations on the locking primitives. 
 | 
  
 | 
README 
 | 
    This file. 
 | 
  
 | 
  
 | 
=========== 
 | 
LIMITATIONS 
 | 
=========== 
 | 
  
 | 
The Linux-kernel memory model has the following limitations: 
 | 
  
 | 
1.    Compiler optimizations are not modeled.  Of course, the use 
 | 
    of READ_ONCE() and WRITE_ONCE() limits the compiler's ability 
 | 
    to optimize, but there is Linux-kernel code that uses bare C 
 | 
    memory accesses.  Handling this code is on the to-do list. 
 | 
    For more information, see Documentation/explanation.txt (in 
 | 
    particular, the "THE PROGRAM ORDER RELATION: po AND po-loc" 
 | 
    and "A WARNING" sections). 
 | 
  
 | 
2.    Multiple access sizes for a single variable are not supported, 
 | 
    and neither are misaligned or partially overlapping accesses. 
 | 
  
 | 
3.    Exceptions and interrupts are not modeled.  In some cases, 
 | 
    this limitation can be overcome by modeling the interrupt or 
 | 
    exception with an additional process. 
 | 
  
 | 
4.    I/O such as MMIO or DMA is not supported. 
 | 
  
 | 
5.    Self-modifying code (such as that found in the kernel's 
 | 
    alternatives mechanism, function tracer, Berkeley Packet Filter 
 | 
    JIT compiler, and module loader) is not supported. 
 | 
  
 | 
6.    Complete modeling of all variants of atomic read-modify-write 
 | 
    operations, locking primitives, and RCU is not provided. 
 | 
    For example, call_rcu() and rcu_barrier() are not supported. 
 | 
    However, a substantial amount of support is provided for these 
 | 
    operations, as shown in the linux-kernel.def file. 
 | 
  
 | 
The "herd7" tool has some additional limitations of its own, apart from 
 | 
the memory model: 
 | 
  
 | 
1.    Non-trivial data structures such as arrays or structures are 
 | 
    not supported.    However, pointers are supported, allowing trivial 
 | 
    linked lists to be constructed. 
 | 
  
 | 
2.    Dynamic memory allocation is not supported, although this can 
 | 
    be worked around in some cases by supplying multiple statically 
 | 
    allocated variables. 
 | 
  
 | 
Some of these limitations may be overcome in the future, but others are 
 | 
more likely to be addressed by incorporating the Linux-kernel memory model 
 | 
into other tools. 
 |