summaryrefslogtreecommitdiffstats
path: root/tools/memory-model
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2018-11-15 11:19:58 -0500
committerPaul E. McKenney <paulmck@linux.ibm.com>2019-03-18 13:27:52 -0400
commit284749b0aebbf3ab26ff92198545aea36165f6bf (patch)
tree0ed5262e2703aab997e81b5649bc1f7c78a2871e /tools/memory-model
parent0172d9e322035bf7bb66a7dfdd795c38d71dbba9 (diff)
tools/memory-model: Refactor some RCU relations
In preparation for adding support for SRCU, refactor the definitions of rcu-fence, rcu-rscsi, rcu-link, and rb by moving the po and po? terms from the first two to the second two. An rcu-gp relation is added; it is equivalent to gp with the po and po? terms removed. This is necessary because for SRCU, we will have to use the loc relation to check that the terms at the start and end of each disjunct in the definition of rcu-fence refer to the same srcu_struct location. If these terms are hidden behind po and po?, there's no way to carry out this check. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Paul E. McKenney <paulmck@linux.ibm.com> Tested-by: Andrea Parri <andrea.parri@amarulasolutions.com>
Diffstat (limited to 'tools/memory-model')
-rw-r--r--tools/memory-model/linux-kernel.cat25
1 files changed, 15 insertions, 10 deletions
diff --git a/tools/memory-model/linux-kernel.cat b/tools/memory-model/linux-kernel.cat
index ab9de9c1234b..b8e6197f05af 100644
--- a/tools/memory-model/linux-kernel.cat
+++ b/tools/memory-model/linux-kernel.cat
@@ -91,32 +91,37 @@ acyclic pb as propagation
91(*******) 91(*******)
92 92
93(* 93(*
94 * Effect of read-side critical section proceeds from the rcu_read_lock() 94 * Effects of read-side critical sections proceed from the rcu_read_unlock()
95 * onward on the one hand and from the rcu_read_unlock() backwards on the 95 * backwards on the one hand, and from the rcu_read_lock() forwards on the
96 * other hand. 96 * other hand.
97 *
98 * In the definition of rcu-fence below, the po term at the left-hand side
99 * of each disjunct and the po? term at the right-hand end have been factored
100 * out. They have been moved into the definitions of rcu-link and rb.
97 *) 101 *)
98let rcu-rscsi = po ; rcu-rscs^-1 ; po? 102let rcu-gp = [Sync-rcu] (* Compare with gp *)
103let rcu-rscsi = rcu-rscs^-1
99 104
100(* 105(*
101 * The synchronize_rcu() strong fence is special in that it can order not 106 * The synchronize_rcu() strong fence is special in that it can order not
102 * one but two non-rf relations, but only in conjunction with an RCU 107 * one but two non-rf relations, but only in conjunction with an RCU
103 * read-side critical section. 108 * read-side critical section.
104 *) 109 *)
105let rcu-link = hb* ; pb* ; prop 110let rcu-link = po? ; hb* ; pb* ; prop ; po
106 111
107(* 112(*
108 * Any sequence containing at least as many grace periods as RCU read-side 113 * Any sequence containing at least as many grace periods as RCU read-side
109 * critical sections (joined by rcu-link) acts as a generalized strong fence. 114 * critical sections (joined by rcu-link) acts as a generalized strong fence.
110 *) 115 *)
111let rec rcu-fence = gp | 116let rec rcu-fence = rcu-gp |
112 (gp ; rcu-link ; rcu-rscsi) | 117 (rcu-gp ; rcu-link ; rcu-rscsi) |
113 (rcu-rscsi ; rcu-link ; gp) | 118 (rcu-rscsi ; rcu-link ; rcu-gp) |
114 (gp ; rcu-link ; rcu-fence ; rcu-link ; rcu-rscsi) | 119 (rcu-gp ; rcu-link ; rcu-fence ; rcu-link ; rcu-rscsi) |
115 (rcu-rscsi ; rcu-link ; rcu-fence ; rcu-link ; gp) | 120 (rcu-rscsi ; rcu-link ; rcu-fence ; rcu-link ; rcu-gp) |
116 (rcu-fence ; rcu-link ; rcu-fence) 121 (rcu-fence ; rcu-link ; rcu-fence)
117 122
118(* rb orders instructions just as pb does *) 123(* rb orders instructions just as pb does *)
119let rb = prop ; rcu-fence ; hb* ; pb* 124let rb = prop ; po ; rcu-fence ; po? ; hb* ; pb*
120 125
121irreflexive rb as rcu 126irreflexive rb as rcu
122 127