]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Documentation/litmus-tests/atomic: Add a test for smp_mb__after_atomic()
authorBoqun Feng <boqun.feng@gmail.com>
Thu, 26 Mar 2020 02:40:22 +0000 (10:40 +0800)
committerPaul E. McKenney <paulmck@kernel.org>
Mon, 29 Jun 2020 19:05:18 +0000 (12:05 -0700)
We already use a litmus test in atomic_t.txt to describe atomic RMW +
smp_mb__after_atomic() is stronger than acquire (both the read and the
write parts are ordered). So make it a litmus test in atomic-tests
directory, so that people can access the litmus easily.

Additionally, change the processor numbers "P1, P2" to "P0, P1" in
atomic_t.txt for the consistency with the processor numbers in the
litmus test, which herd can handle.

Acked-by: Alan Stern <stern@rowland.harvard.edu>
Acked-by: Andrea Parri <parri.andrea@gmail.com>
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
Reviewed-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Documentation/atomic_t.txt
Documentation/litmus-tests/atomic/Atomic-RMW+mb__after_atomic-is-stronger-than-acquire.litmus [new file with mode: 0644]
Documentation/litmus-tests/atomic/README

index 67d1d99f85894907703b53f84dffdfc62d1e25bc..0f1fdedf36bbbcaebd7d2af13a33c83456b4ec59 100644 (file)
@@ -233,19 +233,19 @@ as well. Similarly, something like:
 is an ACQUIRE pattern (though very much not typical), but again the barrier is
 strictly stronger than ACQUIRE. As illustrated:
 
-  C strong-acquire
+  C Atomic-RMW+mb__after_atomic-is-stronger-than-acquire
 
   {
   }
 
-  P1(int *x, atomic_t *y)
+  P0(int *x, atomic_t *y)
   {
     r0 = READ_ONCE(*x);
     smp_rmb();
     r1 = atomic_read(y);
   }
 
-  P2(int *x, atomic_t *y)
+  P1(int *x, atomic_t *y)
   {
     atomic_inc(y);
     smp_mb__after_atomic();
@@ -253,14 +253,14 @@ strictly stronger than ACQUIRE. As illustrated:
   }
 
   exists
-  (r0=1 /\ r1=0)
+  (0:r0=1 /\ 0:r1=0)
 
 This should not happen; but a hypothetical atomic_inc_acquire() --
 (void)atomic_fetch_inc_acquire() for instance -- would allow the outcome,
 because it would not order the W part of the RMW against the following
 WRITE_ONCE.  Thus:
 
-  P1                   P2
+  P0                   P1
 
                        t = LL.acq *y (0)
                        t++;
diff --git a/Documentation/litmus-tests/atomic/Atomic-RMW+mb__after_atomic-is-stronger-than-acquire.litmus b/Documentation/litmus-tests/atomic/Atomic-RMW+mb__after_atomic-is-stronger-than-acquire.litmus
new file mode 100644 (file)
index 0000000..9a8e31a
--- /dev/null
@@ -0,0 +1,32 @@
+C Atomic-RMW+mb__after_atomic-is-stronger-than-acquire
+
+(*
+ * Result: Never
+ *
+ * Test that an atomic RMW followed by a smp_mb__after_atomic() is
+ * stronger than a normal acquire: both the read and write parts of
+ * the RMW are ordered before the subsequential memory accesses.
+ *)
+
+{
+}
+
+P0(int *x, atomic_t *y)
+{
+       int r0;
+       int r1;
+
+       r0 = READ_ONCE(*x);
+       smp_rmb();
+       r1 = atomic_read(y);
+}
+
+P1(int *x, atomic_t *y)
+{
+       atomic_inc(y);
+       smp_mb__after_atomic();
+       WRITE_ONCE(*x, 1);
+}
+
+exists
+(0:r0=1 /\ 0:r1=0)
index a1b72410b5394ad089a6506fa58ce27632548547..714cf93816ea7e7784095756e88c724db3d96160 100644 (file)
@@ -7,5 +7,10 @@ tools/memory-model/README.
 LITMUS TESTS
 ============
 
+Atomic-RMW+mb__after_atomic-is-stronger-than-acquire
+       Test that an atomic RMW followed by a smp_mb__after_atomic() is
+       stronger than a normal acquire: both the read and write parts of
+       the RMW are ordered before the subsequential memory accesses.
+
 Atomic-RMW-ops-are-atomic-WRT-atomic_set.litmus
        Test that atomic_set() cannot break the atomicity of atomic RMWs.