xref: /openbmc/linux/Documentation/litmus-tests/locking/RM-fixed.litmus (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1*7e7eb5aeSPaul E. McKenneyC RM-fixed
2*7e7eb5aeSPaul E. McKenney
3*7e7eb5aeSPaul E. McKenney(*
4*7e7eb5aeSPaul E. McKenney * Result: Never
5*7e7eb5aeSPaul E. McKenney *
6*7e7eb5aeSPaul E. McKenney * This litmus test demonstrates that the old "roach motel" approach
7*7e7eb5aeSPaul E. McKenney * to locking, where code can be freely moved into critical sections,
8*7e7eb5aeSPaul E. McKenney * cannot be used in the Linux kernel.
9*7e7eb5aeSPaul E. McKenney *)
10*7e7eb5aeSPaul E. McKenney
11*7e7eb5aeSPaul E. McKenney{
12*7e7eb5aeSPaul E. McKenney	int x;
13*7e7eb5aeSPaul E. McKenney	atomic_t y;
14*7e7eb5aeSPaul E. McKenney}
15*7e7eb5aeSPaul E. McKenney
16*7e7eb5aeSPaul E. McKenneyP0(int *x, atomic_t *y, spinlock_t *lck)
17*7e7eb5aeSPaul E. McKenney{
18*7e7eb5aeSPaul E. McKenney	int r2;
19*7e7eb5aeSPaul E. McKenney
20*7e7eb5aeSPaul E. McKenney	spin_lock(lck);
21*7e7eb5aeSPaul E. McKenney	r2 = atomic_inc_return(y);
22*7e7eb5aeSPaul E. McKenney	WRITE_ONCE(*x, 1);
23*7e7eb5aeSPaul E. McKenney	spin_unlock(lck);
24*7e7eb5aeSPaul E. McKenney}
25*7e7eb5aeSPaul E. McKenney
26*7e7eb5aeSPaul E. McKenneyP1(int *x, atomic_t *y, spinlock_t *lck)
27*7e7eb5aeSPaul E. McKenney{
28*7e7eb5aeSPaul E. McKenney	int r0;
29*7e7eb5aeSPaul E. McKenney	int r1;
30*7e7eb5aeSPaul E. McKenney	int r2;
31*7e7eb5aeSPaul E. McKenney
32*7e7eb5aeSPaul E. McKenney	r0 = READ_ONCE(*x);
33*7e7eb5aeSPaul E. McKenney	r1 = READ_ONCE(*x);
34*7e7eb5aeSPaul E. McKenney	spin_lock(lck);
35*7e7eb5aeSPaul E. McKenney	r2 = atomic_inc_return(y);
36*7e7eb5aeSPaul E. McKenney	spin_unlock(lck);
37*7e7eb5aeSPaul E. McKenney}
38*7e7eb5aeSPaul E. McKenney
39*7e7eb5aeSPaul E. McKenneylocations [x;0:r2;1:r0;1:r1;1:r2]
40*7e7eb5aeSPaul E. McKenneyfilter (1:r0=0 /\ 1:r1=1)
41*7e7eb5aeSPaul E. McKenneyexists (1:r2=1)
42