xref: /openbmc/linux/tools/memory-model/litmus-tests/MP+fencewmbonceonce+fencermbonceonce.litmus (revision d0034a7a4ac7fae708146ac0059b9c47a1543f0d)
171b7ff5eSAndrea ParriC MP+fencewmbonceonce+fencermbonceonce
271b7ff5eSAndrea Parri
371b7ff5eSAndrea Parri(*
471b7ff5eSAndrea Parri * Result: Never
571b7ff5eSAndrea Parri *
671b7ff5eSAndrea Parri * This litmus test demonstrates that smp_wmb() and smp_rmb() provide
771b7ff5eSAndrea Parri * sufficient ordering for the message-passing pattern.  However, it
871b7ff5eSAndrea Parri * is usually better to use smp_store_release() and smp_load_acquire().
971b7ff5eSAndrea Parri *)
1071b7ff5eSAndrea Parri
11*5c587f9bSAkira Yokosawa{}
1271b7ff5eSAndrea Parri
13b6ff3084SPaul E. McKenneyP0(int *buf, int *flag) // Producer
1471b7ff5eSAndrea Parri{
15acc4bdc5SPaul E. McKenney	WRITE_ONCE(*buf, 1);
1671b7ff5eSAndrea Parri	smp_wmb();
17acc4bdc5SPaul E. McKenney	WRITE_ONCE(*flag, 1);
1871b7ff5eSAndrea Parri}
1971b7ff5eSAndrea Parri
20b6ff3084SPaul E. McKenneyP1(int *buf, int *flag) // Consumer
2171b7ff5eSAndrea Parri{
2271b7ff5eSAndrea Parri	int r0;
2371b7ff5eSAndrea Parri	int r1;
2471b7ff5eSAndrea Parri
25acc4bdc5SPaul E. McKenney	r0 = READ_ONCE(*flag);
2671b7ff5eSAndrea Parri	smp_rmb();
27acc4bdc5SPaul E. McKenney	r1 = READ_ONCE(*buf);
2871b7ff5eSAndrea Parri}
2971b7ff5eSAndrea Parri
30b6ff3084SPaul E. McKenneyexists (1:r0=1 /\ 1:r1=0) (* Bad outcome. *)
31