xa_alloc_bh(9)
β¨ xa_alloc_bh β¨
okay so this is a page from the Kernel API Manual β section 9, kernel dev stuff β and it's about xa_alloc_bh, which is genuinely one of the most useful little gremlins in the XArray family. bestie, let me walk you through it π
πΈ NAME πΈ
xa_alloc_bh β go find somewhere to stash this entry in the XArray. like, find it a home. a little spot. π
π SYNOPSIS π
int xa_alloc_bh (struct xarray *xa , u32 *id , void *entry , struct
xa_limit limit , gfp_t gfp );
π¦ ARGUMENTS π¦
xaβ the XArray. the main character of this whole situation.idβ a pointer to the ID. this is where your precious index is gonna land.entryβ the new entry. your baby. your payload. π«Άlimitβ the range of IDs you're allowed to allocate from.gfpβ memory allocation flags. the usual GFP lore.
π DESCRIPTION π
so here's the vibe: it finds an empty entry in xa somewhere between limit.min and limit.max, writes that index into the id pointer, and then stores entry at that index. the way that works is lowkey iconic β a concurrent lookup will not see an uninitialised id, so nobody gets a weird half-written value in their face. no cap. β¨
okay but there's a hard requirement here: this must only be operated on an xarray that was initialised with theXA_FLAGS_ALLOCflag set inxa_init_flags. like, that's not a suggestion, that's the rule. if you didn't set it, you're not the main character in this story, you're the problem. π
π₯ CONTEXT π₯
literally any context. it takes and releases the xa_lock while disabling softirqs, so it's got that quiet confidence. it may sleep if the gfp flags permit. π§
π RETURN π
0on success β slay π-ENOMEMif memory could not be allocated π-EBUSYif there are no free entries inlimitβ the range is full, bestie, nothing left to give
β SEE ALSO β
kernel file ./include/linux/xarray.h, and honestly the whole extended family showed up to this party β every single one of them:
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_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)
and that's the page! π this one comes from ./include/linux and it's dated October 2026 β so go forth, allocate an ID, and remember to set XA_FLAGS_ALLOC first or the whole thing's giving chaos. iykyk ππ
π¦ 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