Z6.0+pooncelock+poonceLock+pombonce.litmus 723 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. C Z6.0+pooncelock+poonceLock+pombonce
  2. (*
  3. * Result: Never
  4. *
  5. * This litmus test demonstrates how smp_mb__after_spinlock() may be
  6. * used to ensure that accesses in different critical sections for a
  7. * given lock running on different CPUs are nevertheless seen in order
  8. * by CPUs not holding that lock.
  9. *)
  10. {}
  11. P0(int *x, int *y, spinlock_t *mylock)
  12. {
  13. spin_lock(mylock);
  14. WRITE_ONCE(*x, 1);
  15. WRITE_ONCE(*y, 1);
  16. spin_unlock(mylock);
  17. }
  18. P1(int *y, int *z, spinlock_t *mylock)
  19. {
  20. int r0;
  21. spin_lock(mylock);
  22. smp_mb__after_spinlock();
  23. r0 = READ_ONCE(*y);
  24. WRITE_ONCE(*z, 1);
  25. spin_unlock(mylock);
  26. }
  27. P2(int *x, int *z)
  28. {
  29. int r1;
  30. WRITE_ONCE(*z, 2);
  31. smp_mb();
  32. r1 = READ_ONCE(*x);
  33. }
  34. exists (1:r0=1 /\ z=2 /\ 2:r1=0)