xa_alloc_bh(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

✨ 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 the XA_FLAGS_ALLOC flag set in xa_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 πŸ‘‘

  • 0 on success β€” slay πŸ’…
  • -ENOMEM if memory could not be allocated 😭
  • -EBUSY if there are no free entries in limit β€” 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