xa_alloc_irq(9)
β¨ xa_alloc_irq β¨
okay bestie, so this is xa_alloc_irq from the kernel API manual (section 9, the kernel-internals girlies π
) β and she's literally the "find somewhere to put this" function for your XArray. no cap.
π NAME π
xa_alloc_irq β find somewhere to store this entry in the XArray. yes that's it, that's the whole job π
πΈ SYNOPSIS πΈ
int xa_alloc_irq (struct xarray *xa , u32 *id , void *entry , struct
xa_limit limit , gfp_t gfp );
π¦ ARGUMENTS π¦
xaβ the XArray. your girl. the whole point π«Άidβ pointer to ID.entryβ the new entry you're shoving in there.limitβ range of ID to allocate. this is your vibe check on where it's allowed to land.gfpβ memory allocation flags.
π DESCRIPTION π
So here's the tea β: xa_alloc_irq goes looking for an empty entry in xa somewhere between limit.min and limit.max, stores the index it found into the id pointer, and then stores your entry at that index. the ordering is the moment β a concurrent lookup will not see an uninitialised id. iconic behaviour, honestly. β¨
π Important bestie info: this must only be operated on an xarray initialized with flagXA_FLAGS_ALLOCset inxa_init_flags. don't skip that step, i'm begging you π
π CONTEXT π
Process context. it takes and releases the xa_lock while disabling interrupts. may sleep if the gfp flags permit β so like, read the room before you call it from somewhere unhinged π
β RETURN β
0on success π-ENOMEMif memory could not be allocated π-EBUSYif there are no free entries inlimitπ
π§ SEE ALSO π§
kernel file ./include/linux/xarray.h, plus the whole 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_cmpxchg_irq(9), xa_insert(9), xa_insert_bh(9), xa_insert_irq(9), xa_alloc(9), xa_alloc_bh(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)
okay that's the whole page, go touch some XArray entries π¦π
π signed, sealed, delivered:./include/linux, October 2026 β from your fave kernel manual,xa_alloc_irq(9). periodt. π β¨
π¦ 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