tools/memory-model: Add smp_mb__after_srcu_read_unlock()
authorPaul E. McKenney <paulmck@kernel.org>
Sun, 29 Jan 2023 17:41:44 +0000 (09:41 -0800)
committerPaul E. McKenney <paulmck@kernel.org>
Wed, 22 Mar 2023 19:02:21 +0000 (12:02 -0700)
This commit adds support for smp_mb__after_srcu_read_unlock(), which,
when combined with a prior srcu_read_unlock(), implies a full memory
barrier.  No ordering is guaranteed to accesses between the two, and
placing accesses between is bad practice in any case.

Tests may be found at https://github.com/paulmckrcu/litmus in files
matching manual/kernel/C-srcu-mb-*.litmus.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
tools/memory-model/linux-kernel.bell
tools/memory-model/linux-kernel.cat
tools/memory-model/linux-kernel.def

index dc46485..b92fdf7 100644 (file)
@@ -31,7 +31,8 @@ enum Barriers = 'wmb (*smp_wmb*) ||
                'before-atomic (*smp_mb__before_atomic*) ||
                'after-atomic (*smp_mb__after_atomic*) ||
                'after-spinlock (*smp_mb__after_spinlock*) ||
-               'after-unlock-lock (*smp_mb__after_unlock_lock*)
+               'after-unlock-lock (*smp_mb__after_unlock_lock*) ||
+               'after-srcu-read-unlock (*smp_mb__after_srcu_read_unlock*)
 instructions F[Barriers]
 
 (* SRCU *)
index 6e53145..3a4d3b4 100644 (file)
@@ -49,7 +49,8 @@ let mb = ([M] ; fencerel(Mb) ; [M]) |
  * also affected by the fence.
  *)
        ([M] ; po-unlock-lock-po ;
-               [After-unlock-lock] ; po ; [M])
+               [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
 
index ef0f3c1..a6b6fbc 100644 (file)
@@ -24,6 +24,7 @@ smp_mb__before_atomic() { __fence{before-atomic}; }
 smp_mb__after_atomic() { __fence{after-atomic}; }
 smp_mb__after_spinlock() { __fence{after-spinlock}; }
 smp_mb__after_unlock_lock() { __fence{after-unlock-lock}; }
+smp_mb__after_srcu_read_unlock() { __fence{after-srcu-read-unlock}; }
 barrier() { __fence{barrier}; }
 
 // Exchange