tools/memory-model/linux-kernel.cat

Source file repositories/reference/linux-study-clean/tools/memory-model/linux-kernel.cat

File Facts

System
Linux kernel
Corpus path
tools/memory-model/linux-kernel.cat
Extension
.cat
Size
8391 bytes
Lines
227
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: tools
Status
atlas-only

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

// SPDX-License-Identifier: GPL-2.0+
(*
 * Copyright (C) 2015 Jade Alglave <j.alglave@ucl.ac.uk>,
 * Copyright (C) 2016 Luc Maranget <luc.maranget@inria.fr> for Inria
 * Copyright (C) 2017 Alan Stern <stern@rowland.harvard.edu>,
 *                    Andrea Parri <parri.andrea@gmail.com>
 *
 * An earlier version of this file appeared in the companion webpage for
 * "Frightening small children and disconcerting grown-ups: Concurrency
 * in the Linux kernel" by Alglave, Maranget, McKenney, Parri, and Stern,
 * which appeared in ASPLOS 2018.
 *)

"Linux-kernel memory consistency model"

(*
 * File "lock.cat" handles locks and is experimental.
 * It can be replaced by include "cos.cat" for tests that do not use locks.
 *)

include "lock.cat"

(*******************)
(* Basic relations *)
(*******************)

(* Release Acquire *)
let acq-po = [Acquire] ; po ; [M]
let po-rel = [M] ; po ; [Release]
let po-unlock-lock-po = po ; [UL] ; (po|rf) ; [LKR] ; po

(* Fences *)
let R4rmb = R \ Noreturn	(* Reads for which rmb works *)
let rmb = [R4rmb] ; fencerel(Rmb) ; [R4rmb]
let wmb = [W] ; fencerel(Wmb) ; [W]
let mb = ([M] ; fencerel(Mb) ; [M]) |
	(*
	 * full-barrier RMWs (successful cmpxchg(), xchg(), etc.) act as
	 * though there were enclosed by smp_mb().
	 * The effect of these virtual smp_mb() is formalized by adding
	 * Mb tags to the read and write of the operation, and providing
	 * the same ordering as though there were additional po edges
	 * between the Mb tag and the read resp. write.
	 *)
	([M] ; po ; [Mb & R]) |
	([Mb & W] ; po ; [M]) |
	([M] ; fencerel(Before-atomic) ; [RMW] ; po? ; [M]) |
	([M] ; po? ; [RMW] ; fencerel(After-atomic) ; [M]) |
	([M] ; po? ; [LKW] ; fencerel(After-spinlock) ; [M]) |
(*
 * Note: The po-unlock-lock-po relation only passes the lock to the direct
 * successor, perhaps giving the impression that the ordering of the
 * smp_mb__after_unlock_lock() fence only affects a single lock handover.
 * However, in a longer sequence of lock handovers, the implicit
 * A-cumulative release fences of lock-release ensure that any stores that
 * propagate to one of the involved CPUs before it hands over the lock to
 * the next CPU will also propagate to the final CPU handing over the lock
 * to the CPU that executes the fence.  Therefore, all those stores are
 * also affected by the fence.
 *)
	([M] ; po-unlock-lock-po ;
		[After-unlock-lock] ; po ; [M]) |
	([M] ; po? ; [Srcu-unlock] ; fencerel(After-srcu-read-unlock) ; [M])
let gp = po ; [Sync-rcu | Sync-srcu] ; po?
let strong-fence = mb | gp

let nonrw-fence = strong-fence | po-rel | acq-po
let fence = nonrw-fence | wmb | rmb
let barrier = fencerel(Barrier | Rmb | Wmb | Mb | Sync-rcu | Sync-srcu |
		Before-atomic | After-atomic | Acquire | Release |

Annotation

Implementation Notes