1*1c27b644SPaul E. McKenney// SPDX-License-Identifier: GPL-2.0+ 2*1c27b644SPaul E. McKenney(* 3*1c27b644SPaul E. McKenney * Copyright (C) 2015 Jade Alglave <j.alglave@ucl.ac.uk>, 4*1c27b644SPaul E. McKenney * Copyright (C) 2016 Luc Maranget <luc.maranget@inria.fr> for Inria 5*1c27b644SPaul E. McKenney * Copyright (C) 2017 Alan Stern <stern@rowland.harvard.edu>, 6*1c27b644SPaul E. McKenney * Andrea Parri <parri.andrea@gmail.com> 7*1c27b644SPaul E. McKenney * 8*1c27b644SPaul E. McKenney * An earlier version of this file appears in the companion webpage for 9*1c27b644SPaul E. McKenney * "Frightening small children and disconcerting grown-ups: Concurrency 10*1c27b644SPaul E. McKenney * in the Linux kernel" by Alglave, Maranget, McKenney, Parri, and Stern, 11*1c27b644SPaul E. McKenney * which is to appear in ASPLOS 2018. 12*1c27b644SPaul E. McKenney *) 13*1c27b644SPaul E. McKenney 14*1c27b644SPaul E. McKenney"Linux kernel memory model" 15*1c27b644SPaul E. McKenney 16*1c27b644SPaul E. McKenney(* 17*1c27b644SPaul E. McKenney * File "lock.cat" handles locks and is experimental. 18*1c27b644SPaul E. McKenney * It can be replaced by include "cos.cat" for tests that do not use locks. 19*1c27b644SPaul E. McKenney *) 20*1c27b644SPaul E. McKenney 21*1c27b644SPaul E. McKenneyinclude "lock.cat" 22*1c27b644SPaul E. McKenney 23*1c27b644SPaul E. McKenney(*******************) 24*1c27b644SPaul E. McKenney(* Basic relations *) 25*1c27b644SPaul E. McKenney(*******************) 26*1c27b644SPaul E. McKenney 27*1c27b644SPaul E. McKenney(* Fences *) 28*1c27b644SPaul E. McKenneylet rb-dep = [R] ; fencerel(Rb_dep) ; [R] 29*1c27b644SPaul E. McKenneylet rmb = [R \ Noreturn] ; fencerel(Rmb) ; [R \ Noreturn] 30*1c27b644SPaul E. McKenneylet wmb = [W] ; fencerel(Wmb) ; [W] 31*1c27b644SPaul E. McKenneylet mb = ([M] ; fencerel(Mb) ; [M]) | 32*1c27b644SPaul E. McKenney ([M] ; fencerel(Before_atomic) ; [RMW] ; po? ; [M]) | 33*1c27b644SPaul E. McKenney ([M] ; po? ; [RMW] ; fencerel(After_atomic) ; [M]) | 34*1c27b644SPaul E. McKenney ([M] ; po? ; [LKW] ; fencerel(After_spinlock) ; [M]) 35*1c27b644SPaul E. McKenneylet gp = po ; [Sync-rcu] ; po? 36*1c27b644SPaul E. McKenney 37*1c27b644SPaul E. McKenneylet strong-fence = mb | gp 38*1c27b644SPaul E. McKenney 39*1c27b644SPaul E. McKenney(* Release Acquire *) 40*1c27b644SPaul E. McKenneylet acq-po = [Acquire] ; po ; [M] 41*1c27b644SPaul E. McKenneylet po-rel = [M] ; po ; [Release] 42*1c27b644SPaul E. McKenneylet rfi-rel-acq = [Release] ; rfi ; [Acquire] 43*1c27b644SPaul E. McKenney 44*1c27b644SPaul E. McKenney(**********************************) 45*1c27b644SPaul E. McKenney(* Fundamental coherence ordering *) 46*1c27b644SPaul E. McKenney(**********************************) 47*1c27b644SPaul E. McKenney 48*1c27b644SPaul E. McKenney(* Sequential Consistency Per Variable *) 49*1c27b644SPaul E. McKenneylet com = rf | co | fr 50*1c27b644SPaul E. McKenneyacyclic po-loc | com as coherence 51*1c27b644SPaul E. McKenney 52*1c27b644SPaul E. McKenney(* Atomic Read-Modify-Write *) 53*1c27b644SPaul E. McKenneyempty rmw & (fre ; coe) as atomic 54*1c27b644SPaul E. McKenney 55*1c27b644SPaul E. McKenney(**********************************) 56*1c27b644SPaul E. McKenney(* Instruction execution ordering *) 57*1c27b644SPaul E. McKenney(**********************************) 58*1c27b644SPaul E. McKenney 59*1c27b644SPaul E. McKenney(* Preserved Program Order *) 60*1c27b644SPaul E. McKenneylet dep = addr | data 61*1c27b644SPaul E. McKenneylet rwdep = (dep | ctrl) ; [W] 62*1c27b644SPaul E. McKenneylet overwrite = co | fr 63*1c27b644SPaul E. McKenneylet to-w = rwdep | (overwrite & int) 64*1c27b644SPaul E. McKenneylet rrdep = addr | (dep ; rfi) 65*1c27b644SPaul E. McKenneylet strong-rrdep = rrdep+ & rb-dep 66*1c27b644SPaul E. McKenneylet to-r = strong-rrdep | rfi-rel-acq 67*1c27b644SPaul E. McKenneylet fence = strong-fence | wmb | po-rel | rmb | acq-po 68*1c27b644SPaul E. McKenneylet ppo = rrdep* ; (to-r | to-w | fence) 69*1c27b644SPaul E. McKenney 70*1c27b644SPaul E. McKenney(* Propagation: Ordering from release operations and strong fences. *) 71*1c27b644SPaul E. McKenneylet A-cumul(r) = rfe? ; r 72*1c27b644SPaul E. McKenneylet cumul-fence = A-cumul(strong-fence | po-rel) | wmb 73*1c27b644SPaul E. McKenneylet prop = (overwrite & ext)? ; cumul-fence* ; rfe? 74*1c27b644SPaul E. McKenney 75*1c27b644SPaul E. McKenney(* 76*1c27b644SPaul E. McKenney * Happens Before: Ordering from the passage of time. 77*1c27b644SPaul E. McKenney * No fences needed here for prop because relation confined to one process. 78*1c27b644SPaul E. McKenney *) 79*1c27b644SPaul E. McKenneylet hb = ppo | rfe | ((prop \ id) & int) 80*1c27b644SPaul E. McKenneyacyclic hb as happens-before 81*1c27b644SPaul E. McKenney 82*1c27b644SPaul E. McKenney(****************************************) 83*1c27b644SPaul E. McKenney(* Write and fence propagation ordering *) 84*1c27b644SPaul E. McKenney(****************************************) 85*1c27b644SPaul E. McKenney 86*1c27b644SPaul E. McKenney(* Propagation: Each non-rf link needs a strong fence. *) 87*1c27b644SPaul E. McKenneylet pb = prop ; strong-fence ; hb* 88*1c27b644SPaul E. McKenneyacyclic pb as propagation 89*1c27b644SPaul E. McKenney 90*1c27b644SPaul E. McKenney(*******) 91*1c27b644SPaul E. McKenney(* RCU *) 92*1c27b644SPaul E. McKenney(*******) 93*1c27b644SPaul E. McKenney 94*1c27b644SPaul E. McKenney(* 95*1c27b644SPaul E. McKenney * Effect of read-side critical section proceeds from the rcu_read_lock() 96*1c27b644SPaul E. McKenney * onward on the one hand and from the rcu_read_unlock() backwards on the 97*1c27b644SPaul E. McKenney * other hand. 98*1c27b644SPaul E. McKenney *) 99*1c27b644SPaul E. McKenneylet rscs = po ; crit^-1 ; po? 100*1c27b644SPaul E. McKenney 101*1c27b644SPaul E. McKenney(* 102*1c27b644SPaul E. McKenney * The synchronize_rcu() strong fence is special in that it can order not 103*1c27b644SPaul E. McKenney * one but two non-rf relations, but only in conjunction with an RCU 104*1c27b644SPaul E. McKenney * read-side critical section. 105*1c27b644SPaul E. McKenney *) 106*1c27b644SPaul E. McKenneylet link = hb* ; pb* ; prop 107*1c27b644SPaul E. McKenney 108*1c27b644SPaul E. McKenney(* Chains that affect the RCU grace-period guarantee *) 109*1c27b644SPaul E. McKenneylet gp-link = gp ; link 110*1c27b644SPaul E. McKenneylet rscs-link = rscs ; link 111*1c27b644SPaul E. McKenney 112*1c27b644SPaul E. McKenney(* 113*1c27b644SPaul E. McKenney * A cycle containing at least as many grace periods as RCU read-side 114*1c27b644SPaul E. McKenney * critical sections is forbidden. 115*1c27b644SPaul E. McKenney *) 116*1c27b644SPaul E. McKenneylet rec rcu-path = 117*1c27b644SPaul E. McKenney gp-link | 118*1c27b644SPaul E. McKenney (gp-link ; rscs-link) | 119*1c27b644SPaul E. McKenney (rscs-link ; gp-link) | 120*1c27b644SPaul E. McKenney (rcu-path ; rcu-path) | 121*1c27b644SPaul E. McKenney (gp-link ; rcu-path ; rscs-link) | 122*1c27b644SPaul E. McKenney (rscs-link ; rcu-path ; gp-link) 123*1c27b644SPaul E. McKenney 124*1c27b644SPaul E. McKenneyirreflexive rcu-path as rcu 125