Commit 71b7ff5e authored by Andrea Parri's avatar Andrea Parri Committed by Ingo Molnar

tools/memory-model: Rename litmus tests to comply to norm7

norm7 produces the 'normalized' name of a litmus test,  when the test
can be generated from a single cycle that passes through each process
exactly once. The commit renames such tests in order to comply to the
naming scheme implemented by this tool.
Signed-off-by: default avatarAndrea Parri <andrea.parri@amarulasolutions.com>
Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Cc: Akira Yokosawa <akiyks@gmail.com>
Cc: Boqun Feng <boqun.feng@gmail.com>
Cc: David Howells <dhowells@redhat.com>
Cc: Jade Alglave <j.alglave@ucl.ac.uk>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Luc Maranget <luc.maranget@inria.fr>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will.deacon@arm.com>
Cc: linux-arch@vger.kernel.org
Cc: parri.andrea@gmail.com
Link: http://lkml.kernel.org/r/20180716180605.16115-14-paulmck@linux.vnet.ibm.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 0fcff171
...@@ -126,7 +126,7 @@ However, it is not necessarily the case that accesses ordered by ...@@ -126,7 +126,7 @@ However, it is not necessarily the case that accesses ordered by
locking will be seen as ordered by CPUs not holding that lock. locking will be seen as ordered by CPUs not holding that lock.
Consider this example: Consider this example:
/* See Z6.0+pooncelock+pooncelock+pombonce.litmus. */ /* See Z6.0+pooncerelease+poacquirerelease+fencembonceonce.litmus. */
void CPU0(void) void CPU0(void)
{ {
spin_lock(&mylock); spin_lock(&mylock);
...@@ -292,7 +292,7 @@ and to use smp_load_acquire() instead of smp_rmb(). However, the older ...@@ -292,7 +292,7 @@ and to use smp_load_acquire() instead of smp_rmb(). However, the older
smp_wmb() and smp_rmb() APIs are still heavily used, so it is important smp_wmb() and smp_rmb() APIs are still heavily used, so it is important
to understand their use cases. The general approach is shown below: to understand their use cases. The general approach is shown below:
/* See MP+wmbonceonce+rmbonceonce.litmus. */ /* See MP+fencewmbonceonce+fencermbonceonce.litmus. */
void CPU0(void) void CPU0(void)
{ {
WRITE_ONCE(x, 1); WRITE_ONCE(x, 1);
...@@ -360,7 +360,7 @@ can be seen in the LB+poonceonces.litmus litmus test. ...@@ -360,7 +360,7 @@ can be seen in the LB+poonceonces.litmus litmus test.
One way of avoiding the counter-intuitive outcome is through the use of a One way of avoiding the counter-intuitive outcome is through the use of a
control dependency paired with a full memory barrier: control dependency paired with a full memory barrier:
/* See LB+ctrlonceonce+mbonceonce.litmus. */ /* See LB+fencembonceonce+ctrlonceonce.litmus. */
void CPU0(void) void CPU0(void)
{ {
r0 = READ_ONCE(x); r0 = READ_ONCE(x);
...@@ -476,7 +476,7 @@ that one CPU first stores to one variable and then loads from a second, ...@@ -476,7 +476,7 @@ that one CPU first stores to one variable and then loads from a second,
while another CPU stores to the second variable and then loads from the while another CPU stores to the second variable and then loads from the
first. Preserving order requires nothing less than full barriers: first. Preserving order requires nothing less than full barriers:
/* See SB+mbonceonces.litmus. */ /* See SB+fencembonceonces.litmus. */
void CPU0(void) void CPU0(void)
{ {
WRITE_ONCE(x, 1); WRITE_ONCE(x, 1);
......
...@@ -35,13 +35,13 @@ BASIC USAGE: HERD7 ...@@ -35,13 +35,13 @@ BASIC USAGE: HERD7
The memory model is used, in conjunction with "herd7", to exhaustively The memory model is used, in conjunction with "herd7", to exhaustively
explore the state space of small litmus tests. explore the state space of small litmus tests.
For example, to run SB+mbonceonces.litmus against the memory model: For example, to run SB+fencembonceonces.litmus against the memory model:
$ herd7 -conf linux-kernel.cfg litmus-tests/SB+mbonceonces.litmus $ herd7 -conf linux-kernel.cfg litmus-tests/SB+fencembonceonces.litmus
Here is the corresponding output: Here is the corresponding output:
Test SB+mbonceonces Allowed Test SB+fencembonceonces Allowed
States 3 States 3
0:r0=0; 1:r0=1; 0:r0=0; 1:r0=1;
0:r0=1; 1:r0=0; 0:r0=1; 1:r0=0;
...@@ -50,8 +50,8 @@ Here is the corresponding output: ...@@ -50,8 +50,8 @@ Here is the corresponding output:
Witnesses Witnesses
Positive: 0 Negative: 3 Positive: 0 Negative: 3
Condition exists (0:r0=0 /\ 1:r0=0) Condition exists (0:r0=0 /\ 1:r0=0)
Observation SB+mbonceonces Never 0 3 Observation SB+fencembonceonces Never 0 3
Time SB+mbonceonces 0.01 Time SB+fencembonceonces 0.01
Hash=d66d99523e2cac6b06e66f4c995ebb48 Hash=d66d99523e2cac6b06e66f4c995ebb48
The "Positive: 0 Negative: 3" and the "Never 0 3" each indicate that The "Positive: 0 Negative: 3" and the "Never 0 3" each indicate that
...@@ -67,16 +67,16 @@ BASIC USAGE: KLITMUS7 ...@@ -67,16 +67,16 @@ BASIC USAGE: KLITMUS7
The "klitmus7" tool converts a litmus test into a Linux kernel module, The "klitmus7" tool converts a litmus test into a Linux kernel module,
which may then be loaded and run. which may then be loaded and run.
For example, to run SB+mbonceonces.litmus against hardware: For example, to run SB+fencembonceonces.litmus against hardware:
$ mkdir mymodules $ mkdir mymodules
$ klitmus7 -o mymodules litmus-tests/SB+mbonceonces.litmus $ klitmus7 -o mymodules litmus-tests/SB+fencembonceonces.litmus
$ cd mymodules ; make $ cd mymodules ; make
$ sudo sh run.sh $ sudo sh run.sh
The corresponding output includes: The corresponding output includes:
Test SB+mbonceonces Allowed Test SB+fencembonceonces Allowed
Histogram (3 states) Histogram (3 states)
644580 :>0:r0=1; 1:r0=0; 644580 :>0:r0=1; 1:r0=0;
644328 :>0:r0=0; 1:r0=1; 644328 :>0:r0=0; 1:r0=1;
...@@ -86,8 +86,8 @@ The corresponding output includes: ...@@ -86,8 +86,8 @@ The corresponding output includes:
Positive: 0, Negative: 2000000 Positive: 0, Negative: 2000000
Condition exists (0:r0=0 /\ 1:r0=0) is NOT validated Condition exists (0:r0=0 /\ 1:r0=0) is NOT validated
Hash=d66d99523e2cac6b06e66f4c995ebb48 Hash=d66d99523e2cac6b06e66f4c995ebb48
Observation SB+mbonceonces Never 0 2000000 Observation SB+fencembonceonces Never 0 2000000
Time SB+mbonceonces 0.16 Time SB+fencembonceonces 0.16
The "Positive: 0 Negative: 2000000" and the "Never 0 2000000" indicate The "Positive: 0 Negative: 2000000" and the "Never 0 2000000" indicate
that during two million trials, the state specified in this litmus that during two million trials, the state specified in this litmus
......
C MP+wmbonceonce+rmbonceonce C MP+fencewmbonceonce+fencermbonceonce
(* (*
* Result: Never * Result: Never
......
...@@ -18,7 +18,7 @@ CoWW+poonceonce.litmus ...@@ -18,7 +18,7 @@ CoWW+poonceonce.litmus
Test of write-write coherence, that is, whether or not two Test of write-write coherence, that is, whether or not two
successive writes to the same variable are ordered. successive writes to the same variable are ordered.
IRIW+mbonceonces+OnceOnce.litmus IRIW+fencembonceonces+OnceOnce.litmus
Test of independent reads from independent writes with smp_mb() Test of independent reads from independent writes with smp_mb()
between each pairs of reads. In other words, is smp_mb() between each pairs of reads. In other words, is smp_mb()
sufficient to cause two different reading processes to agree on sufficient to cause two different reading processes to agree on
...@@ -47,7 +47,7 @@ ISA2+pooncerelease+poacquirerelease+poacquireonce.litmus ...@@ -47,7 +47,7 @@ ISA2+pooncerelease+poacquirerelease+poacquireonce.litmus
Can a release-acquire chain order a prior store against Can a release-acquire chain order a prior store against
a later load? a later load?
LB+ctrlonceonce+mbonceonce.litmus LB+fencembonceonce+ctrlonceonce.litmus
Does a control dependency and an smp_mb() suffice for the Does a control dependency and an smp_mb() suffice for the
load-buffering litmus test, where each process reads from one load-buffering litmus test, where each process reads from one
of two variables then writes to the other? of two variables then writes to the other?
...@@ -88,14 +88,14 @@ MP+porevlocks.litmus ...@@ -88,14 +88,14 @@ MP+porevlocks.litmus
As below, but with the first access of the writer process As below, but with the first access of the writer process
and the second access of reader process protected by a lock. and the second access of reader process protected by a lock.
MP+wmbonceonce+rmbonceonce.litmus MP+fencewmbonceonce+fencermbonceonce.litmus
Does a smp_wmb() (between the stores) and an smp_rmb() (between Does a smp_wmb() (between the stores) and an smp_rmb() (between
the loads) suffice for the message-passing litmus test, where one the loads) suffice for the message-passing litmus test, where one
process writes data and then a flag, and the other process reads process writes data and then a flag, and the other process reads
the flag and then the data. (This is similar to the ISA2 tests, the flag and then the data. (This is similar to the ISA2 tests,
but with two processes instead of three.) but with two processes instead of three.)
R+mbonceonces.litmus R+fencembonceonces.litmus
This is the fully ordered (via smp_mb()) version of one of This is the fully ordered (via smp_mb()) version of one of
the classic counterintuitive litmus tests that illustrates the the classic counterintuitive litmus tests that illustrates the
effects of store propagation delays. effects of store propagation delays.
...@@ -103,7 +103,7 @@ R+mbonceonces.litmus ...@@ -103,7 +103,7 @@ R+mbonceonces.litmus
R+poonceonces.litmus R+poonceonces.litmus
As above, but without the smp_mb() invocations. As above, but without the smp_mb() invocations.
SB+mbonceonces.litmus SB+fencembonceonces.litmus
This is the fully ordered (again, via smp_mb() version of store This is the fully ordered (again, via smp_mb() version of store
buffering, which forms the core of Dekker's mutual-exclusion buffering, which forms the core of Dekker's mutual-exclusion
algorithm. algorithm.
...@@ -123,12 +123,12 @@ SB+rfionceonce-poonceonces.litmus ...@@ -123,12 +123,12 @@ SB+rfionceonce-poonceonces.litmus
S+poonceonces.litmus S+poonceonces.litmus
As below, but without the smp_wmb() and acquire load. As below, but without the smp_wmb() and acquire load.
S+wmbonceonce+poacquireonce.litmus S+fencewmbonceonce+poacquireonce.litmus
Can a smp_wmb(), instead of a release, and an acquire order Can a smp_wmb(), instead of a release, and an acquire order
a prior store against a subsequent store? a prior store against a subsequent store?
WRC+poonceonces+Once.litmus WRC+poonceonces+Once.litmus
WRC+pooncerelease+rmbonceonce+Once.litmus WRC+pooncerelease+fencermbonceonce+Once.litmus
These two are members of an extension of the MP litmus-test These two are members of an extension of the MP litmus-test
class in which the first write is moved to a separate process. class in which the first write is moved to a separate process.
The second is forbidden because smp_store_release() is The second is forbidden because smp_store_release() is
...@@ -143,7 +143,7 @@ Z6.0+pooncelock+poonceLock+pombonce.litmus ...@@ -143,7 +143,7 @@ Z6.0+pooncelock+poonceLock+pombonce.litmus
As above, but with smp_mb__after_spinlock() immediately As above, but with smp_mb__after_spinlock() immediately
following the spin_lock(). following the spin_lock().
Z6.0+pooncerelease+poacquirerelease+mbonceonce.litmus Z6.0+pooncerelease+poacquirerelease+fencembonceonce.litmus
Is the ordering provided by a release-acquire chain sufficient Is the ordering provided by a release-acquire chain sufficient
to make ordering apparent to accesses by a process that does to make ordering apparent to accesses by a process that does
not participate in that release-acquire chain? not participate in that release-acquire chain?
......
C S+wmbonceonce+poacquireonce C S+fencewmbonceonce+poacquireonce
(* (*
* Result: Never * Result: Never
......
C WRC+pooncerelease+rmbonceonce+Once C WRC+pooncerelease+fencermbonceonce+Once
(* (*
* Result: Never * Result: Never
......
C Z6.0+pooncerelease+poacquirerelease+mbonceonce C Z6.0+pooncerelease+poacquirerelease+fencembonceonce
(* (*
* Result: Sometimes * Result: Sometimes
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment