FAILED: patch "[PATCH] locking/atomic: Make test_and_*_bit() ordered on failure" failed to apply to 5.10-stable tree
Subsystems (6)
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 415d832497098030241605c52ea83d4e2cfa7879 Mon Sep 17 00:00:00 2001
From: Hector Martin <[email protected]>
Date: Tue, 16 Aug 2022 16:03:11 +0900
Subject: [PATCH] locking/atomic: Make test_and_*_bit() ordered on failure
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).
Documentation/atomic_bitops.txt +1 -1
@@ -59,7 +59,7 @@ Like with atomic_t, the rule of thumb is: - RMW operations that have a return value are fully ordered. - RMW operations that are conditional are unordered on FAILURE, - otherwise the above rules apply. In the case of test_and_{}_bit() operations, + otherwise the above rules apply. In the case of test_and_set_bit_lock(), if the bit in memory is unchanged by the operation then it is deemed to have failed.
include/asm-generic/bitops/atomic.h +0 -6
@@ -39,9 +39,6 @@ arch_test_and_set_bit(unsigned int nr, volatile unsigned long *p)unsigned long mask =BIT_MASK (nr); p +=BIT_WORD (nr); -if (READ_ONCE (*p) & mask) -return 1 ; - old =arch_atomic_long_fetch_or (mask, (atomic_long_t *)p);return !!(old & mask); }
@@ -53,9 +50,6 @@ arch_test_and_clear_bit(unsigned int nr, volatile unsigned long *p)unsigned long mask =BIT_MASK (nr); p +=BIT_WORD (nr); -if (!(READ_ONCE (*p) & mask)) -return 0 ; - old =arch_atomic_long_fetch_andnot (mask, (atomic_long_t *)p);return !!(old & mask); }
Quoted 2 lines · On Sun, Aug 21, 2022 at 6:46 AM <[email protected]> wrote:
The patch below does not apply to the 5.10-stable tree.
I think the reason is that "atomic_long_fetch_xyz()" got renamed to "arch_atomic_long_fetch_or()" by commit cf3ee3c8c29d ("locking/atomic:
add generic arch_*() bitops") in the meantime.
Afaik, the patch should apply by literally just doing
sed 's/arch_atomic_long/atomic_long/'
on the patch before applying it.
That should fix it all the way back to the 4.19 backport.
Linus
Greg KH
maintainerQuoted 8 lines · Linus Torvalds
Quoted 2 lines · On Sun, Aug 21, 2022 at 6:46 AM <[email protected]> wrote:
The patch below does not apply to the 5.10-stable tree.
I think the reason is that "
atomic_long_fetch_xyz()" got renamed to "arch_atomic_long_fetch_or()" by commitcf3ee3c8c29d("locking/atomic:
add generic arch_*() bitops") in the meantime.
Quoted 7 lines
Afaik, the patch should apply by literally just doing
sed 's/arch_atomic_long/atomic_long/'
on the patch before applying it.
That should fix it all the way back to the 4.19 backport.
That worked, thanks!