1*4882a593SmuzhiyunC MP+polockonce+poacquiresilsil 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun(* 4*4882a593Smuzhiyun * Result: Sometimes 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Do spinlocks provide order to outside observers using spin_is_locked() 7*4882a593Smuzhiyun * to sense the lock-held state, ordered by acquire? Note that when the 8*4882a593Smuzhiyun * first spin_is_locked() returns false and the second true, we know that 9*4882a593Smuzhiyun * the smp_load_acquire() executed before the lock was acquired (loosely 10*4882a593Smuzhiyun * speaking). 11*4882a593Smuzhiyun *) 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun{ 14*4882a593Smuzhiyun} 15*4882a593Smuzhiyun 16*4882a593SmuzhiyunP0(spinlock_t *lo, int *x) 17*4882a593Smuzhiyun{ 18*4882a593Smuzhiyun spin_lock(lo); 19*4882a593Smuzhiyun WRITE_ONCE(*x, 1); 20*4882a593Smuzhiyun spin_unlock(lo); 21*4882a593Smuzhiyun} 22*4882a593Smuzhiyun 23*4882a593SmuzhiyunP1(spinlock_t *lo, int *x) 24*4882a593Smuzhiyun{ 25*4882a593Smuzhiyun int r1; 26*4882a593Smuzhiyun int r2; 27*4882a593Smuzhiyun int r3; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun r1 = smp_load_acquire(x); 30*4882a593Smuzhiyun r2 = spin_is_locked(lo); 31*4882a593Smuzhiyun r3 = spin_is_locked(lo); 32*4882a593Smuzhiyun} 33*4882a593Smuzhiyun 34*4882a593Smuzhiyunexists (1:r1=1 /\ 1:r2=0 /\ 1:r3=1) 35