1*4882a593SmuzhiyunC MP+polockmbonce+poacquiresilsil 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun(* 4*4882a593Smuzhiyun * Result: Never 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Do spinlocks combined with smp_mb__after_spinlock() provide order 7*4882a593Smuzhiyun * to outside observers using spin_is_locked() to sense the lock-held 8*4882a593Smuzhiyun * state, ordered by acquire? Note that when the first spin_is_locked() 9*4882a593Smuzhiyun * returns false and the second true, we know that the smp_load_acquire() 10*4882a593Smuzhiyun * executed before the lock was acquired (loosely 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 smp_mb__after_spinlock(); 20*4882a593Smuzhiyun WRITE_ONCE(*x, 1); 21*4882a593Smuzhiyun spin_unlock(lo); 22*4882a593Smuzhiyun} 23*4882a593Smuzhiyun 24*4882a593SmuzhiyunP1(spinlock_t *lo, int *x) 25*4882a593Smuzhiyun{ 26*4882a593Smuzhiyun int r1; 27*4882a593Smuzhiyun int r2; 28*4882a593Smuzhiyun int r3; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun r1 = smp_load_acquire(x); 31*4882a593Smuzhiyun r2 = spin_is_locked(lo); 32*4882a593Smuzhiyun r3 = spin_is_locked(lo); 33*4882a593Smuzhiyun} 34*4882a593Smuzhiyun 35*4882a593Smuzhiyunexists (1:r1=1 /\ 1:r2=0 /\ 1:r3=1) 36