summaryrefslogtreecommitdiffstats
path: root/tools/memory-model
diff options
context:
space:
mode:
authorLuc Maranget <Luc.Maranget@inria.fr>2018-12-27 10:27:12 -0500
committerPaul E. McKenney <paulmck@linux.ibm.com>2019-03-18 13:27:52 -0400
commit9393998e9ee094f99d18783cc85c489e20f0e0e7 (patch)
treeb2d6cea2bd7343fa600a53c6269496d0bea91be1 /tools/memory-model
parent648e717586f2a832687fe44e2e0afb7a6fdea232 (diff)
tools/memory-model: Dynamically check SRCU lock-to-unlock matching
This commit checks that the return value of srcu_read_lock() is passed to the matching srcu_read_unlock(), where "matching" is determined by nesting. This check operates as follows: 1. srcu_read_lock() creates an integer token, which is stored into the generated events. 2. srcu_read_unlock() records its second (token) argument into the generated event. 3. A new herd primitive 'different-values' filters out pairs of events with identical values from the relation passed as its argument. 4. The bell file applies the above primitive to the (srcu) read-side-critical-section relation 'srcu-rscs' and flags non-empty results. BEWARE: Works only with herd version 7.51+6 and onwards. Signed-off-by: Luc Maranget <Luc.Maranget@inria.fr> Signed-off-by: Paul E. McKenney <paulmck@linux.ibm.com> [ paulmck: Apply Andrea Parri's off-list feedback. ] Acked-by: Alan Stern <stern@rowland.harvard.edu>
Diffstat (limited to 'tools/memory-model')
-rw-r--r--tools/memory-model/linux-kernel.bell3
-rw-r--r--tools/memory-model/linux-kernel.cat2
-rw-r--r--tools/memory-model/linux-kernel.def2
3 files changed, 6 insertions, 1 deletions
diff --git a/tools/memory-model/linux-kernel.bell b/tools/memory-model/linux-kernel.bell
index 9c42cd9ddcb4..def9131d3d8e 100644
--- a/tools/memory-model/linux-kernel.bell
+++ b/tools/memory-model/linux-kernel.bell
@@ -73,3 +73,6 @@ flag ~empty Srcu-unlock \ range(srcu-rscs) as unbalanced-srcu-locking
73 73
74(* Check for use of synchronize_srcu() inside an RCU critical section *) 74(* Check for use of synchronize_srcu() inside an RCU critical section *)
75flag ~empty rcu-rscs & (po ; [Sync-srcu] ; po) as invalid-sleep 75flag ~empty rcu-rscs & (po ; [Sync-srcu] ; po) as invalid-sleep
76
77(* Validate SRCU dynamic match *)
78flag ~empty different-values(srcu-rscs) as srcu-bad-nesting
diff --git a/tools/memory-model/linux-kernel.cat b/tools/memory-model/linux-kernel.cat
index 8dcb37835b61..95bf45f1215f 100644
--- a/tools/memory-model/linux-kernel.cat
+++ b/tools/memory-model/linux-kernel.cat
@@ -1,5 +1,7 @@
1// SPDX-License-Identifier: GPL-2.0+ 1// SPDX-License-Identifier: GPL-2.0+
2(* 2(*
3 * Requires herd version 7.51+6 or higher.
4 *
3 * Copyright (C) 2015 Jade Alglave <j.alglave@ucl.ac.uk>, 5 * Copyright (C) 2015 Jade Alglave <j.alglave@ucl.ac.uk>,
4 * Copyright (C) 2016 Luc Maranget <luc.maranget@inria.fr> for Inria 6 * Copyright (C) 2016 Luc Maranget <luc.maranget@inria.fr> for Inria
5 * Copyright (C) 2017 Alan Stern <stern@rowland.harvard.edu>, 7 * Copyright (C) 2017 Alan Stern <stern@rowland.harvard.edu>,
diff --git a/tools/memory-model/linux-kernel.def b/tools/memory-model/linux-kernel.def
index 1d6a120cde14..0c3f0ef486f4 100644
--- a/tools/memory-model/linux-kernel.def
+++ b/tools/memory-model/linux-kernel.def
@@ -49,7 +49,7 @@ synchronize_rcu_expedited() { __fence{sync-rcu}; }
49 49
50// SRCU 50// SRCU
51srcu_read_lock(X) __srcu{srcu-lock}(X) 51srcu_read_lock(X) __srcu{srcu-lock}(X)
52srcu_read_unlock(X,Y) { __srcu{srcu-unlock}(X); } 52srcu_read_unlock(X,Y) { __srcu{srcu-unlock}(X,Y); }
53synchronize_srcu(X) { __srcu{sync-srcu}(X); } 53synchronize_srcu(X) { __srcu{sync-srcu}(X); }
54 54
55// Atomic 55// Atomic