atomic_long_xchg_acquire(9)
π NAME π
atomic_long_xchg_acquire β bestie, it's an atomic exchange, and it comes with acquire ordering π
Okay so real quick, this is a page from the Kernel API Manual, and the star of the show is atomic_long_xchg_acquire. It swaps a long in atomically, and the ordering vibes are acquire. That's the whole personality. Slay.
β¨ SYNOPSIS β¨
long atomic_long_xchg_acquire (atomic_long_t *v , long new );
Like yes, that's literally it. Two arguments, one long coming back at you π«Ά
π ARGUMENTS π
vβ pointer toatomic_long_t. It's giving "where the value lives" energy.newβ thelongvalue to assign. This is the new main character of*v.
π¦ DESCRIPTION π¦
So here's the tea: it atomically updates v to new, and it does it with acquire ordering. Atomic β¨ ordering β¨ both, no cap.
π¨ Real talk though: it's unsafe to use innoinstrcode. If you're in there, useraw_atomic_long_xchg_acquireinstead. Not a suggestion, it's the rule, iykyk π
πΈ RETURN πΈ
It returns the original value of v β i.e. what was chilling in there before you swapped it. The way that it hands you the old value and the new one is already in placeβ¦ iconic behavior honestly π
π SEE ALSO π
Kernel file: ./include/linux/atomic/atomic-instrumented.h β that's where the lore lives π
And now the friend group. Genuinely huge roster, but every single one of them is here because we don't do left-outs in this house π«Ά
The atomic_* girlies:
- reads and sets:
atomic_read(9),atomic_read_acquire(9),atomic_set(9),atomic_set_release(9) - add/sub squad:
atomic_add(9),atomic_add_return(9),atomic_add_return_acquire(9),atomic_add_return_release(9),atomic_add_return_relaxed(9),atomic_fetch_add(9),atomic_fetch_add_acquire(9),atomic_fetch_add_release(9),atomic_fetch_add_relaxed(9),atomic_sub(9),atomic_sub_return(9),atomic_sub_return_acquire(9),atomic_sub_return_release(9),atomic_sub_return_relaxed(9),atomic_fetch_sub(9),atomic_fetch_sub_acquire(9),atomic_fetch_sub_release(9),atomic_fetch_sub_relaxed(9) - inc/dec gang:
atomic_inc(9),atomic_inc_return(9),atomic_inc_return_acquire(9),atomic_inc_return_release(9),atomic_inc_return_relaxed(9),atomic_fetch_inc(9),atomic_fetch_inc_acquire(9),atomic_fetch_inc_release(9),atomic_fetch_inc_relaxed(9),atomic_dec(9),atomic_dec_return(9),atomic_dec_return_acquire(9),atomic_dec_return_release(9),atomic_dec_return_relaxed(9),atomic_fetch_dec(9),atomic_fetch_dec_acquire(9),atomic_fetch_dec_release(9),atomic_fetch_dec_relaxed(9) - bitwise baddies:
atomic_and(9),atomic_fetch_and(9),atomic_fetch_and_acquire(9),atomic_fetch_and_release(9),atomic_fetch_and_relaxed(9),atomic_andnot(9),atomic_fetch_andnot(9),atomic_fetch_andnot_acquire(9),atomic_fetch_andnot_release(9),atomic_fetch_andnot_relaxed(9),atomic_or(9),atomic_fetch_or(9),atomic_fetch_or_acquire(9),atomic_fetch_or_release(9),atomic_fetch_or_relaxed(9),atomic_xor(9),atomic_fetch_xor(9),atomic_fetch_xor_acquire(9),atomic_fetch_xor_release(9),atomic_fetch_xor_relaxed(9) - exchange & compare-exchange crew:
atomic_xchg(9),atomic_xchg_acquire(9),atomic_xchg_release(9),atomic_xchg_relaxed(9),atomic_cmpxchg(9),atomic_cmpxchg_acquire(9),atomic_cmpxchg_release(9),atomic_cmpxchg_relaxed(9),atomic_try_cmpxchg(9),atomic_try_cmpxchg_acquire(9),atomic_try_cmpxchg_release(9),atomic_try_cmpxchg_relaxed(9) - the test / unless helpers:
atomic_sub_and_test(9),atomic_dec_and_test(9),atomic_inc_and_test(9),atomic_add_negative(9),atomic_add_negative_acquire(9),atomic_add_negative_release(9),atomic_add_negative_relaxed(9),atomic_fetch_add_unless(9),atomic_add_unless(9),atomic_inc_not_zero(9),atomic_inc_unless_negative(9),atomic_dec_unless_positive(9),atomic_dec_if_positive(9)
The atomic64_* girlies:
- reads and sets:
atomic64_read(9),atomic64_read_acquire(9),atomic64_set(9),atomic64_set_release(9) - add/sub squad:
atomic64_add(9),atomic64_add_return(9),atomic64_add_return_acquire(9),atomic64_add_return_release(9),atomic64_add_return_relaxed(9),atomic64_fetch_add(9),atomic64_fetch_add_acquire(9),atomic64_fetch_add_release(9),atomic64_fetch_add_relaxed(9),atomic64_sub(9),atomic64_sub_return(9),atomic64_sub_return_acquire(9),atomic64_sub_return_release(9),atomic64_sub_return_relaxed(9),atomic64_fetch_sub(9),atomic64_fetch_sub_acquire(9),atomic64_fetch_sub_release(9),atomic64_fetch_sub_relaxed(9) - inc/dec gang:
atomic64_inc(9),atomic64_inc_return(9),atomic64_inc_return_acquire(9),atomic64_inc_return_release(9),atomic64_inc_return_relaxed(9),atomic64_fetch_inc(9),atomic64_fetch_inc_acquire(9),atomic64_fetch_inc_release(9),atomic64_fetch_inc_relaxed(9),atomic64_dec(9),atomic64_dec_return(9),atomic64_dec_return_acquire(9),atomic64_dec_return_release(9),atomic64_dec_return_relaxed(9),atomic64_fetch_dec(9),atomic64_fetch_dec_acquire(9),atomic64_fetch_dec_release(9),atomic64_fetch_dec_relaxed(9) - bitwise baddies:
atomic64_and(9),atomic64_fetch_and(9),atomic64_fetch_and_acquire(9),atomic64_fetch_and_release(9),atomic64_fetch_and_relaxed(9),atomic64_andnot(9),atomic64_fetch_andnot(9),atomic64_fetch_andnot_acquire(9),atomic64_fetch_andnot_release(9),atomic64_fetch_andnot_relaxed(9),atomic64_or(9),atomic64_fetch_or(9),atomic64_fetch_or_acquire(9),atomic64_fetch_or_release(9),atomic64_fetch_or_relaxed(9),atomic64_xor(9),atomic64_fetch_xor(9),atomic64_fetch_xor_acquire(9),atomic64_fetch_xor_release(9),atomic64_fetch_xor_relaxed(9) - exchange & compare-exchange crew:
atomic64_xchg(9),atomic64_xchg_acquire(9),atomic64_xchg_release(9),atomic64_xchg_relaxed(9),atomic64_cmpxchg(9),atomic64_cmpxchg_acquire(9),atomic64_cmpxchg_release(9),atomic64_cmpxchg_relaxed(9),atomic64_try_cmpxchg(9),atomic64_try_cmpxchg_acquire(9),atomic64_try_cmpxchg_release(9),atomic64_try_cmpxchg_relaxed(9) - the test / unless helpers:
atomic64_sub_and_test(9),atomic64_dec_and_test(9),atomic64_inc_and_test(9),atomic64_add_negative(9),atomic64_add_negative_acquire(9),atomic64_add_negative_release(9),atomic64_add_negative_relaxed(9),atomic64_fetch_add_unless(9),atomic64_add_unless(9),atomic64_inc_not_zero(9),atomic64_inc_unless_negative(9),atomic64_dec_unless_positive(9),atomic64_dec_if_positive(9)
The atomic_long_* girlies (our homegirl's family π₯Ή):
- reads and sets:
atomic_long_read(9),atomic_long_read_acquire(9),atomic_long_set(9),atomic_long_set_release(9) - add/sub squad:
atomic_long_add(9),atomic_long_add_return(9),atomic_long_add_return_acquire(9),atomic_long_add_return_release(9),atomic_long_add_return_relaxed(9),atomic_long_fetch_add(9),atomic_long_fetch_add_acquire(9),atomic_long_fetch_add_release(9),atomic_long_fetch_add_relaxed(9),atomic_long_sub(9),atomic_long_sub_return(9),atomic_long_sub_return_acquire(9),atomic_long_sub_return_release(9),atomic_long_sub_return_relaxed(9),atomic_long_fetch_sub(9),atomic_long_fetch_sub_acquire(9),atomic_long_fetch_sub_release(9),atomic_long_fetch_sub_relaxed(9) - inc/dec gang:
atomic_long_inc(9),atomic_long_inc_return(9),atomic_long_inc_return_acquire(9),atomic_long_inc_return_release(9),atomic_long_inc_return_relaxed(9),atomic_long_fetch_inc(9),atomic_long_fetch_inc_acquire(9),atomic_long_fetch_inc_release(9),atomic_long_fetch_inc_relaxed(9),atomic_long_dec(9),atomic_long_dec_return(9),atomic_long_dec_return_acquire(9),atomic_long_dec_return_release(9),atomic_long_dec_return_relaxed(9),atomic_long_fetch_dec(9),atomic_long_fetch_dec_acquire(9),atomic_long_fetch_dec_release(9),atomic_long_fetch_dec_relaxed(9) - bitwise baddies:
atomic_long_and(9),atomic_long_fetch_and(9),atomic_long_fetch_and_acquire(9),atomic_long_fetch_and_release(9),atomic_long_fetch_and_relaxed(9),atomic_long_andnot(9),atomic_long_fetch_andnot(9),atomic_long_fetch_andnot_acquire(9),atomic_long_fetch_andnot_release(9),atomic_long_fetch_andnot_relaxed(9),atomic_long_or(9),atomic_long_fetch_or(9),atomic_long_fetch_or_acquire(9),atomic_long_fetch_or_release(9),atomic_long_fetch_or_relaxed(9),atomic_long_xor(9),atomic_long_fetch_xor(9),atomic_long_fetch_xor_acquire(9),atomic_long_fetch_xor_release(9),atomic_long_fetch_xor_relaxed(9) - exchange & compare-exchange crew:
atomic_long_xchg(9),atomic_long_xchg_release(9),atomic_long_xchg_relaxed(9),atomic_long_cmpxchg(9),atomic_long_cmpxchg_acquire(9),atomic_long_cmpxchg_release(9),atomic_long_cmpxchg_relaxed(9),atomic_long_try_cmpxchg(9),atomic_long_try_cmpxchg_acquire(9),atomic_long_try_cmpxchg_release(9),atomic_long_try_cmpxchg_relaxed(9) - the test / unless helpers:
atomic_long_sub_and_test(9),atomic_long_dec_and_test(9),atomic_long_inc_and_test(9),atomic_long_add_negative(9),atomic_long_add_negative_acquire(9),atomic_long_add_negative_release(9),atomic_long_add_negative_relaxed(9),atomic_long_fetch_add_unless(9),atomic_long_add_unless(9),atomic_long_inc_not_zero(9),atomic_long_inc_unless_negative(9),atomic_long_dec_unless_positive(9),atomic_long_dec_if_positive(9)
That's the whole page bestie, no notes, go forth and exchange atomically π Source file is ./include/linux/atomic, and this cutie is dated October 2026 β catch you in the next atomic_long_xchg_acquire(9) era π¦β¨
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms