mirror of https://gitee.com/openkylin/linux.git
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: Andrea Parri <andrea.parri@amarulasolutions.com> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Acked-by: Alan 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.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
0fcff1715b
commit
71b7ff5ebc
|
@ -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
|
||||||
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.
|
||||||
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,
|
||||||
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
|
||||||
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:
|
||||||
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
|
||||||
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:
|
||||||
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
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
C IRIW+mbonceonces+OnceOnce
|
C IRIW+fencembonceonces+OnceOnce
|
||||||
|
|
||||||
(*
|
(*
|
||||||
* Result: Never
|
* Result: Never
|
|
@ -1,4 +1,4 @@
|
||||||
C LB+ctrlonceonce+mbonceonce
|
C LB+fencembonceonce+ctrlonceonce
|
||||||
|
|
||||||
(*
|
(*
|
||||||
* Result: Never
|
* Result: Never
|
|
@ -1,4 +1,4 @@
|
||||||
C MP+wmbonceonce+rmbonceonce
|
C MP+fencewmbonceonce+fencermbonceonce
|
||||||
|
|
||||||
(*
|
(*
|
||||||
* Result: Never
|
* Result: Never
|
|
@ -1,4 +1,4 @@
|
||||||
C R+mbonceonces
|
C R+fencembonceonces
|
||||||
|
|
||||||
(*
|
(*
|
||||||
* Result: Never
|
* Result: Never
|
|
@ -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
|
||||||
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
|
||||||
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
|
||||||
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
|
||||||
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
|
||||||
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?
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
C S+wmbonceonce+poacquireonce
|
C S+fencewmbonceonce+poacquireonce
|
||||||
|
|
||||||
(*
|
(*
|
||||||
* Result: Never
|
* Result: Never
|
|
@ -1,4 +1,4 @@
|
||||||
C SB+mbonceonces
|
C SB+fencembonceonces
|
||||||
|
|
||||||
(*
|
(*
|
||||||
* Result: Never
|
* Result: Never
|
|
@ -1,4 +1,4 @@
|
||||||
C WRC+pooncerelease+rmbonceonce+Once
|
C WRC+pooncerelease+fencermbonceonce+Once
|
||||||
|
|
||||||
(*
|
(*
|
||||||
* Result: Never
|
* Result: Never
|
|
@ -1,4 +1,4 @@
|
||||||
C Z6.0+pooncerelease+poacquirerelease+mbonceonce
|
C Z6.0+pooncerelease+poacquirerelease+fencembonceonce
|
||||||
|
|
||||||
(*
|
(*
|
||||||
* Result: Sometimes
|
* Result: Sometimes
|
Loading…
Reference in New Issue