• Hector Martin's avatar
    locking/atomic: Make test_and_*_bit() ordered on failure · 415d8324
    Hector Martin authored
    These operations are documented as always ordered in
    include/asm-generic/bitops/instrumented-atomic.h, and producer-consumer
    type use cases where one side needs to ensure a flag is left pending
    after some shared data was updated rely on this ordering, even in the
    failure case.
    
    This is the case with the workqueue code, which currently suffers from a
    reproducible ordering violation on Apple M1 platforms (which are
    notoriously out-of-order) that ends up causing the TTY layer to fail to
    deliver data to userspace properly under the right conditions.  This
    change fixes that bug.
    
    Change the documentation to restrict the "no order on failure" story to
    the _lock() variant (for which it makes sense), and remove the
    early-exit from the generic implementation, which is what causes the
    missing barrier semantics in that case.  Without this, the remaining
    atomic op is fully ordered (including on ARM64 LSE, as of recent
    versions of the architecture spec).
    Suggested-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Cc: stable@vger.kernel.org
    Fixes: e986a0d6 ("locking/atomics, asm-generic/bitops/atomic.h: Rewrite using atomic_*() APIs")
    Fixes: 61e02392 ("locking/atomic/bitops: Document and clarify ordering semantics for failed test_and_{}_bit()")
    Signed-off-by: default avatarHector Martin <marcan@marcan.st>
    Acked-by: default avatarWill Deacon <will@kernel.org>
    Reviewed-by: default avatarArnd Bergmann <arnd@arndb.de>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    415d8324
atomic_bitops.txt 1.53 KB