| C RM-fixed |
| |
| (* |
| * Result: Never |
| * |
| * This litmus test demonstrates that the old "roach motel" approach |
| * to locking, where code can be freely moved into critical sections, |
| * cannot be used in the Linux kernel. |
| *) |
| |
| { |
| int lck; |
| int x; |
| int y; |
| } |
| |
| P0(int *x, int *y, int *lck) |
| { |
| int r2; |
| |
| spin_lock(lck); |
| r2 = atomic_inc_return(y); |
| WRITE_ONCE(*x, 1); |
| spin_unlock(lck); |
| } |
| |
| P1(int *x, int *y, int *lck) |
| { |
| int r0; |
| int r1; |
| int r2; |
| |
| r0 = READ_ONCE(*x); |
| r1 = READ_ONCE(*x); |
| spin_lock(lck); |
| r2 = atomic_inc_return(y); |
| spin_unlock(lck); |
| } |
| |
| locations [x;lck;0:r2;1:r0;1:r1;1:r2] |
| filter (y=2 /\ 1:r0=0 /\ 1:r1=1) |
| exists (1:r2=1) |