On 2023-05-24 22:33:36, Peter Zijlstra wrote:
On Wed, May 24, 2023 at 01:16:03PM -0700, Sean Christopherson wrote:
Atomics aren't memory barriers on all architectures, e.g. see the various definitions of smp_mb__after_atomic().
Even if atomic operations did provide barriers, using an atomic would be overkill and a net negative. On strongly ordered architectures like x86, memory barriers are just compiler barriers, whereas atomics may be more expensive.
Not quite, smp_{r,w}mb() and smp_mb__{before,after}_atomic() are compiler barriers on the TSO archs, but smp_mb() very much isn't. TSO still allows stores to be delayed vs later loads (iow it doesn't pretend to hide the store buffer).
Of course, the only accesses outside of mmu_lock are reads, so on x86 that "atomic" access is just a READ_ONCE() load, but that's not the case for all architectures.
This is true on *all* archs. atomic_set() and atomic_read() are no more and no less than WRITE_ONCE() / READ_ONCE().
Anyways, the point is that atomics and memory barriers are different things that serve different purposes.
This is true; esp. on the weakly ordered architectures where atomics do not naturally imply any ordering.
Thanks for the information, everyone.