Avoiding Locks: Atomic Operations

There are a number of atomic operations defined in include/asm/atomic.h: these are guaranteed to be seen atomically from all CPUs in the system, thus avoiding races. If your shared data consists of a single counter, say, these operations might be simpler than using spinlocks (although for anything non-trivial using spinlocks is clearer).

Note that the atomic operations do in general not act as memory barriers. Instead you can insert a memory barrier before or after atomic_inc() or atomic_dec() by inserting smp_mb__before_atomic_inc(), smp_mb__after_atomic_inc(), smp_mb__before_atomic_dec() or smp_mb__after_atomic_dec() respectively. The advantage of using those macros instead of smp_mb() is, that they are cheaper on some platforms.