Merge tag 'block-5.11-2021-01-10' of git://git.kernel.dk/linux-block
[linux/fpc-iii.git] / tools / memory-model / litmus-tests / IRIW+fencembonceonces+OnceOnce.litmus
blob87aa900125ab232d14eefe6cb00568dece5e4621
1 C IRIW+fencembonceonces+OnceOnce
3 (*
4  * Result: Never
5  *
6  * Test of independent reads from independent writes with smp_mb()
7  * between each pairs of reads.  In other words, is smp_mb() sufficient to
8  * cause two different reading processes to agree on the order of a pair
9  * of writes, where each write is to a different variable by a different
10  * process?  This litmus test exercises LKMM's "propagation" rule.
11  *)
14         int x;
15         int y;
18 P0(int *x)
20         WRITE_ONCE(*x, 1);
23 P1(int *x, int *y)
25         int r0;
26         int r1;
28         r0 = READ_ONCE(*x);
29         smp_mb();
30         r1 = READ_ONCE(*y);
33 P2(int *y)
35         WRITE_ONCE(*y, 1);
38 P3(int *x, int *y)
40         int r0;
41         int r1;
43         r0 = READ_ONCE(*y);
44         smp_mb();
45         r1 = READ_ONCE(*x);
48 exists (1:r0=1 /\ 1:r1=0 /\ 3:r0=1 /\ 3:r1=0)