|  | C RM-broken | 
|  |  | 
|  | (* | 
|  | * Result: DEADLOCK | 
|  | * | 
|  | * 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 x; | 
|  | atomic_t y; | 
|  | } | 
|  |  | 
|  | P0(int *x, atomic_t *y, spinlock_t *lck) | 
|  | { | 
|  | int r2; | 
|  |  | 
|  | spin_lock(lck); | 
|  | r2 = atomic_inc_return(y); | 
|  | WRITE_ONCE(*x, 1); | 
|  | spin_unlock(lck); | 
|  | } | 
|  |  | 
|  | P1(int *x, atomic_t *y, spinlock_t *lck) | 
|  | { | 
|  | int r0; | 
|  | int r1; | 
|  | int r2; | 
|  |  | 
|  | spin_lock(lck); | 
|  | r0 = READ_ONCE(*x); | 
|  | r1 = READ_ONCE(*x); | 
|  | r2 = atomic_inc_return(y); | 
|  | spin_unlock(lck); | 
|  | } | 
|  |  | 
|  | locations [x;0:r2;1:r0;1:r1;1:r2] | 
|  | filter (1:r0=0 /\ 1:r1=1) | 
|  | exists (1:r2=1) |