summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2019-06-20 11:55:46 -0400
committerPaul E. McKenney <paulmck@linux.ibm.com>2019-06-21 19:20:49 -0400
commit15aa25cbf0ccc4bd63ed6f2a8065decb7f5e6f89 (patch)
treee3a2ee56ed0089cb5795217eddf0dc3d503eb76a
parentf9de417121001879d92a86960647adb06b5b81bf (diff)
tools/memory-model: Change definition of rcu-fence
The rcu-fence relation in the Linux Kernel Memory Model is not well named. It doesn't act like any other fence relation, in that it does not relate events before a fence to events after that fence. All it does is relate certain RCU events to one another (those that are ordered by the RCU Guarantee); this induces an actual strong-fence-like relation linking events preceding the first RCU event to those following the second. This patch renames rcu-fence, now called rcu-order. It adds a new definition of rcu-fence, something which should have been present all along because it is used in the rb relation. And it modifies the fence and strong-fence relations by making them incorporate the new rcu-fence. As a result of this change, there is no longer any need to define full-fence in the section for detecting data races. It can simply be replaced by the updated strong-fence relation. This change should have no effect on the operation of the memory model. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Acked-by: Andrea Parri <andrea.parri@amarulasolutions.com> Signed-off-by: Paul E. McKenney <paulmck@linux.ibm.com>
-rw-r--r--tools/memory-model/linux-kernel.cat23
1 files changed, 13 insertions, 10 deletions
diff --git a/tools/memory-model/linux-kernel.cat b/tools/memory-model/linux-kernel.cat
index 8b61218c99fd..ca2f4297b4e6 100644
--- a/tools/memory-model/linux-kernel.cat
+++ b/tools/memory-model/linux-kernel.cat
@@ -122,24 +122,28 @@ let rcu-link = po? ; hb* ; pb* ; prop ; po
122 122
123(* 123(*
124 * Any sequence containing at least as many grace periods as RCU read-side 124 * Any sequence containing at least as many grace periods as RCU read-side
125 * critical sections (joined by rcu-link) acts as a generalized strong fence. 125 * critical sections (joined by rcu-link) induces order like a generalized
126 * inter-CPU strong fence.
126 * Likewise for SRCU grace periods and read-side critical sections, provided 127 * Likewise for SRCU grace periods and read-side critical sections, provided
127 * the synchronize_srcu() and srcu_read_[un]lock() calls refer to the same 128 * the synchronize_srcu() and srcu_read_[un]lock() calls refer to the same
128 * struct srcu_struct location. 129 * struct srcu_struct location.
129 *) 130 *)
130let rec rcu-fence = rcu-gp | srcu-gp | 131let rec rcu-order = rcu-gp | srcu-gp |
131 (rcu-gp ; rcu-link ; rcu-rscsi) | 132 (rcu-gp ; rcu-link ; rcu-rscsi) |
132 ((srcu-gp ; rcu-link ; srcu-rscsi) & loc) | 133 ((srcu-gp ; rcu-link ; srcu-rscsi) & loc) |
133 (rcu-rscsi ; rcu-link ; rcu-gp) | 134 (rcu-rscsi ; rcu-link ; rcu-gp) |
134 ((srcu-rscsi ; rcu-link ; srcu-gp) & loc) | 135 ((srcu-rscsi ; rcu-link ; srcu-gp) & loc) |
135 (rcu-gp ; rcu-link ; rcu-fence ; rcu-link ; rcu-rscsi) | 136 (rcu-gp ; rcu-link ; rcu-order ; rcu-link ; rcu-rscsi) |
136 ((srcu-gp ; rcu-link ; rcu-fence ; rcu-link ; srcu-rscsi) & loc) | 137 ((srcu-gp ; rcu-link ; rcu-order ; rcu-link ; srcu-rscsi) & loc) |
137 (rcu-rscsi ; rcu-link ; rcu-fence ; rcu-link ; rcu-gp) | 138 (rcu-rscsi ; rcu-link ; rcu-order ; rcu-link ; rcu-gp) |
138 ((srcu-rscsi ; rcu-link ; rcu-fence ; rcu-link ; srcu-gp) & loc) | 139 ((srcu-rscsi ; rcu-link ; rcu-order ; rcu-link ; srcu-gp) & loc) |
139 (rcu-fence ; rcu-link ; rcu-fence) 140 (rcu-order ; rcu-link ; rcu-order)
141let rcu-fence = po ; rcu-order ; po?
142let fence = fence | rcu-fence
143let strong-fence = strong-fence | rcu-fence
140 144
141(* rb orders instructions just as pb does *) 145(* rb orders instructions just as pb does *)
142let rb = prop ; po ; rcu-fence ; po? ; hb* ; pb* ; [Marked] 146let rb = prop ; rcu-fence ; hb* ; pb* ; [Marked]
143 147
144irreflexive rb as rcu 148irreflexive rb as rcu
145 149
@@ -163,9 +167,8 @@ flag ~empty mixed-accesses as mixed-accesses
163 167
164(* Executes-before and visibility *) 168(* Executes-before and visibility *)
165let xbstar = (hb | pb | rb)* 169let xbstar = (hb | pb | rb)*
166let full-fence = strong-fence | (po ; rcu-fence ; po?)
167let vis = cumul-fence* ; rfe? ; [Marked] ; 170let vis = cumul-fence* ; rfe? ; [Marked] ;
168 ((full-fence ; [Marked] ; xbstar) | (xbstar & int)) 171 ((strong-fence ; [Marked] ; xbstar) | (xbstar & int))
169 172
170(* Boundaries for lifetimes of plain accesses *) 173(* Boundaries for lifetimes of plain accesses *)
171let w-pre-bounded = [Marked] ; (addr | fence)? 174let w-pre-bounded = [Marked] ; (addr | fence)?