1 C cmpxchg-fail-ordered-2 1 C cmpxchg-fail-ordered-2 2 2 3 (* 3 (* 4 * Result: Never 4 * Result: Never 5 * 5 * 6 * Demonstrate use of smp_mb__after_atomic() t 6 * Demonstrate use of smp_mb__after_atomic() to make a failing cmpxchg 7 * operation have acquire ordering. 7 * operation have acquire ordering. 8 *) 8 *) 9 9 10 {} 10 {} 11 11 12 P0(int *x, int *y) 12 P0(int *x, int *y) 13 { 13 { 14 int r1; 14 int r1; 15 15 16 WRITE_ONCE(*x, 1); 16 WRITE_ONCE(*x, 1); 17 r1 = cmpxchg(y, 0, 1); 17 r1 = cmpxchg(y, 0, 1); 18 } 18 } 19 19 20 P1(int *x, int *y) 20 P1(int *x, int *y) 21 { 21 { 22 int r1; 22 int r1; 23 int r2; 23 int r2; 24 24 25 r1 = cmpxchg(y, 0, 1); 25 r1 = cmpxchg(y, 0, 1); 26 smp_mb__after_atomic(); 26 smp_mb__after_atomic(); 27 r2 = READ_ONCE(*x); 27 r2 = READ_ONCE(*x); 28 } 28 } 29 29 30 exists (0:r1=0 /\ 1:r1=1 /\ 1:r2=0) 30 exists (0:r1=0 /\ 1:r1=1 /\ 1:r2=0)
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.