• W
    locking/atomics: Add _{acquire|release|relaxed}() variants of some atomic operations · 654672d4
    Will Deacon 提交于
    Whilst porting the generic qrwlock code over to arm64, it became
    apparent that any portable locking code needs finer-grained control of
    the memory-ordering guarantees provided by our atomic routines.
    
    In particular: xchg, cmpxchg, {add,sub}_return are often used in
    situations where full barrier semantics (currently the only option
    available) are not required. For example, when a reader increments a
    reader count to obtain a lock, checking the old value to see if a writer
    was present, only acquire semantics are strictly needed.
    
    This patch introduces three new ordering semantics for these operations:
    
      - *_relaxed: No ordering guarantees. This is similar to what we have
                   already for the non-return atomics (e.g. atomic_add).
    
      - *_acquire: ACQUIRE semantics, similar to smp_load_acquire.
    
      - *_release: RELEASE semantics, similar to smp_store_release.
    
    In memory-ordering speak, this means that the acquire/release semantics
    are RCpc as opposed to RCsc. Consequently a RELEASE followed by an
    ACQUIRE does not imply a full barrier, as already documented in
    memory-barriers.txt.
    
    Currently, all the new macros are conditionally mapped to the full-mb
    variants, however if the *_relaxed version is provided by the
    architecture, then the acquire/release variants are constructed by
    supplementing the relaxed routine with an explicit barrier.
    Signed-off-by: NWill Deacon <will.deacon@arm.com>
    Signed-off-by: NPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Waiman.Long@hp.com
    Cc: paulmck@linux.vnet.ibm.com
    Link: http://lkml.kernel.org/r/1438880084-18856-2-git-send-email-will.deacon@arm.comSigned-off-by: NIngo Molnar <mingo@kernel.org>
    654672d4
atomic.h 11.9 KB