xa_cmpxchg_irq(9)
π 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
- 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