xas_for_each(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… xas_for_each β€” the kernel API manual, but make it make sense

okay bestie, listen, we're doing a manual page today: xas_for_each(9). yes it's a kernel thing. no you're not gonna be scared of it. let's go πŸ¦‹


✨ NAME ✨

xas_for_each β€” iterate over a range of an XArray. that's the whole vibe. it's a loop macro, it walks your XArray, no cap πŸ’–


🌸 SYNOPSIS 🌸

xas_for_each (xas , entry , max );

three things go in, and honestly it's giving "pass the aux" energy πŸŽ€


πŸŽ€ ARGUMENTS πŸŽ€

  • xas β€” the XArray operation state. this is the little guy holding your current position in the array, so treat it with respect fr πŸ’…
  • entry β€” the entry retrieved from the array. every trip around the loop, this gets set to whatever the array hands you ✨
  • max β€” the maximum index to retrieve from the array. it's the ceiling, the limit, the "don't go past this" line 🚧

πŸ‘‘ DESCRIPTION πŸ‘‘

okay so here's the tea β˜•

the loop body runs for each entry present in the xarray between the current xas position and max. one entry, one spin around the loop, every single time. entry gets set to the entry retrieved from the xarray, so you always know what you're working with πŸ’–

and the best part? it is safe to delete entries from the array in the loop body. literally, go off, delete your entries mid-loop, the macro is not gonna snitch on you πŸ™ˆ

⚠️ but bestie β€” you should hold either the RCU lock or the xa_lock while iterating. that's not a suggestion, that's the whole contract πŸ”’
πŸ’€ and if you need to drop the lock? call xas_pause first. do not just let go of the lock mid-loop like it's nothing, that's how you get undefined behaviour energy and nobody wants that 😭

πŸ¦‹ SEE ALSO πŸ¦‹

this is the part where the manpage hits you with the entire friend group 😭✨ all of these are hanging out in the kernel file ./include/linux/xarray.h:

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_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_marked(9), xas_for_each_conflict(9), xas_prev(9), xas_next(9)

like I said. the whole group chat πŸ’€πŸ«Ά


and that's the page, bestie! 🌈 this one came out of ./include/linux and it's dated October 2026 β€” so like, future energy, iconic behaviour, we love a timeless classic πŸ’œβœ¨ go forth and iterate responsibly, mwah πŸŽ€

πŸ“¦ where this page comes from