• Will Deacon's avatar
    arm64: spinlock: fix spin_unlock_wait for LSE atomics · 3a5facd0
    Will Deacon authored
    Commit d86b8da0 ("arm64: spinlock: serialise spin_unlock_wait against
    concurrent lockers") fixed spin_unlock_wait for LL/SC-based atomics under
    the premise that the LSE atomics (in particular, the LDADDA instruction)
    are indivisible.
    
    Unfortunately, these instructions are only indivisible when used with the
    -AL (full ordering) suffix and, consequently, the same issue can
    theoretically be observed with LSE atomics, where a later (in program
    order) load can be speculated before the write portion of the atomic
    operation.
    
    This patch fixes the issue by performing a CAS of the lock once we've
    established that it's unlocked, in much the same way as the LL/SC code.
    
    Fixes: d86b8da0 ("arm64: spinlock: serialise spin_unlock_wait against concurrent lockers")
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    3a5facd0
spinlock.h 7.48 KB