xa_alloc(9)
β¨ xa_alloc(9) β Kernel API Manual π
okay so bestie, this is the XArray allocation moment where the kernel goes βfind me an empty little spot for this entryβ and the spot selection is literally the whole plot. π
πΈ NAME πΈ
xa_alloc - Find somewhere to store this entry in the XArray.
π¦ SYNOPSIS π¦
int xa_alloc (struct xarray *xa , u32 *id , void *entry , struct
xa_limit limit , gfp_t gfp );
π ARGUMENTS π
xaβ XArray. the whole data structure bestie, no cap πidβ Pointer to ID. this is where the chosen index gets written β¨entryβ New entry. the thing you're storing π«Άlimitβ Range of ID to allocate. the allowed ID zone πgfpβ Memory allocation flags. the βcan I nap while doing this?β flags π΄
π DESCRIPTION π
Okay so here's the tea: xa_alloc finds an empty entry in xa between limit.min and limit.max, stores the index into the id pointer, then stores the entry at that index. A concurrent lookup will not see an uninitialised id. periodt. π
Must only be operated on an xarray initialized with flag XA_FLAGS_ALLOC set in xa_init_flags. no cap, that's mandatory β this is not a casual suggestion, bestie π¨
π¦ CONTEXT π¦
Any context. Takes and releases the xa_lock. May sleep if the gfp flags permit. so yes, it can catch a nap β but only if the flags say it's allowed ππ€
β RETURN β
0 on success, -ENOMEM if memory could not be allocated or -EBUSY if there are no free entries in limit. That's the whole vibe check. π
π SEE ALSO π
Kernel file ./include/linux/xarray.h plus this entire iconic little squad:
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_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).
Signed off from ./include/linux, October 2026 β this is xa_alloc(9), bestie. π«Άπ
π¦ 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