xa_cmpxchg_irq(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… xa_cmpxchg_irq β€” from the Kernel API Manual, bestie ✨

Okay so picture this: you're deep in the kernel, you've got an XArray, and you need to swap out an entry only if it still holds the value you expect β€” and you need interrupts to stay ✨quiet✨ while you do it. That's this function. Welcome to xa_cmpxchg_irq(9). πŸŽ€


✨ NAME ✨

xa_cmpxchg_irq β€” conditionally replace an entry in the XArray. Like, only if the vibe check on the old value passes. 🫢


🌸 SYNOPSIS 🌸

void * xa_cmpxchg_irq (struct xarray *xa , unsigned long index , void
       *old , void *entry , gfp_t gfp );

πŸ¦‹ ARGUMENTS πŸ¦‹

  • xa β€” the XArray. Your array. Your main character. πŸ‘‘
  • index β€” the index into the array. Where the drama happens.
  • old β€” the old value to test against. If it doesn't match, no swap for you, sorry. πŸ™ˆ
  • entry β€” the new value to place in the array. The glow-up. ✨
  • gfp β€” memory allocation flags. Let the kernel know how it's allowed to behave when it needs memory.

πŸ’– DESCRIPTION πŸ’–

So this is basically xa_cmpxchg, except β€” and this is the whole moment β€” it disables interrupts while holding the array lock. That's it, that's the difference. Two functions, same energy, one of them is interrupt-safe. Slay. πŸ’…


πŸ”₯ CONTEXT πŸ”₯

Process context, bestie. It takes and releases the xa_lock while disabling interrupts. And yes β€” it may sleep if the gfp flags permit, so don't come crying to me when your atomic context gets wrecked. You were warned. 😭


⭐ RETURN ⭐

The old value at this index β€” or xa_err if an error happened. That's the whole return story, no cap.


🌈 SEE ALSO 🌈

Kernel file ./include/linux/xarray.h, plus the entire friend group:

xa_mk_value(9), xa_to_value(9), xa_is_value(9), xa_tag_pointer(9), xa_untag_pointer(9), xa_pointer_tag(9), xa_is_zero(9), xa_is_err(9), xa_err(9), struct xa_limit(9), struct xarray(9), DEFINE_XARRAY_FLAGS(9), DEFINE_XARRAY(9), DEFINE_XARRAY_ALLOC(9), DEFINE_XARRAY_ALLOC1(9), xa_init_flags(9), xa_init(9), xa_empty(9), xa_marked(9), xa_for_each_range(9), xa_for_each_start(9), xa_for_each(9), xa_for_each_marked(9), xa_store_bh(9), xa_store_irq(9), xa_erase_bh(9), xa_erase_irq(9), xa_cmpxchg(9), xa_cmpxchg_bh(9), xa_insert(9), xa_insert_bh(9), xa_insert_irq(9), xa_alloc(9), xa_alloc_bh(9), xa_alloc_irq(9), xa_alloc_cyclic(9), xa_alloc_cyclic_bh(9), xa_alloc_cyclic_irq(9), xa_reserve(9), xa_reserve_bh(9), xa_reserve_irq(9), xa_release(9), xa_is_sibling(9), xa_is_retry(9), xa_is_advanced(9), xa_update_node_t(9), XA_STATE(9), XA_STATE_ORDER(9), xas_error(9), xas_set_err(9), xas_invalid(9), xas_valid(9), xas_is_node(9), xas_reset(9), xas_retry(9), xas_reload(9), xas_set(9), xas_advance(9), xas_set_order(9), xas_set_update(9), xas_next_entry(9), xas_next_marked(9), xas_for_each(9), xas_for_each_marked(9), xas_for_each_conflict(9), xas_prev(9), xas_next(9) β€” literally all of them, I'm not skipping a single one, that would be so rude. 🧚


ngl that reference list is giving "group project where everyone actually showed up". iconic. 🌸

And that's the page!! It lives in ./include/linux, dated October 2026, from the Kernel API Manual β€” xa_cmpxchg_irq(9), out. πŸ’œπŸ“βœ¨

πŸ“¦ where this page comes from