42 lines
		
	
	
		
			644 B
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			644 B
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 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)
 |