The kernel already has test_bit_acquire(). A set_bit_release(), however, was missing so far. It can be expected to be useful for parties that need release ordering, but not the stricter full ordering of the other bit-setting functions.
Add set_bit_release(). Signed-off-by: Philipp Stanner <[email protected]> --- include/asm-generic/bitops/instrumented-atomic.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/include/asm-generic/bitops/instrumented-atomic.h b/include/asm-generic/bitops/instrumented-atomic.h index c010d54275e4..fb2d1472fd4d 100644 --- a/include/asm-generic/bitops/instrumented-atomic.h +++ b/include/asm-generic/bitops/instrumented-atomic.h @@ -72,6 +72,20 @@ static __always_inline bool test_and_set_bit(long nr, volatile unsigned long *ad return arch_test_and_set_bit(nr, addr); } +/** + * set_bit_release - Set a bit with release ordering + * @nr: Bit to set + * @addr: Address to start counting from + * + * This is an atomic ordered operation (implied write memory barrier). + */ +static __always_inline void set_bit_release(long nr, volatile unsigned long *addr) +{ + kcsan_wmb(); + instrument_atomic_write(addr + BIT_WORD(nr), sizeof(long)); + arch_set_bit(nr, addr); +} + /** * test_and_clear_bit - Clear a bit and return its old value * @nr: Bit to clear -- 2.56.0
