drm_gpuvm_for_each_va_range(9)
π drm_gpuvm_for_each_va_range(9) β the Kernel API Manual entry you didn't know you needed π
okay bestie, so this is a page from the Kernel API Manual and it's about a macro-iterator situation β drm_gpuvm_for_each_va_range β and honestly it's giving "loops but make it fancy" β¨ stay with me, we're gonna walk through it together π«Ά
πΈ NAME πΈ
drm_gpuvm_for_each_va_range β literally iterate over a range of &drm_gpuvas, that's the whole vibe π
β¨ SYNOPSIS β¨
drm_gpuvm_for_each_va_range (va__ , gpuvm__ , start__ , end__ );
four little args, no cap π
π ARGUMENTS π
va__β thedrm_gpuvastructure you assign to on each iteration step, like it gets refreshed every loop around the block πgpuvm__β thedrm_gpuvmyou're walking over, your main character πstart__β the starting offset; the first gpuva will overlap this, she doesn't start after it, she overlaps it π«end__β the ending offset; the last gpuva will start before this (but may overlap it, so don't come for her π)
π¦ DESCRIPTION π¦
so this iterator walks over all the drm_gpuvas in the drm_gpuvm that lie between start__ and end__ β and it's implemented similarly to list_for_each, but plot twist: it's using the drm_gpuvm's internal interval tree to accelerate the search for the starting drm_gpuva π iconic behaviour honestly.
β οΈ and because of all that, it isn't safe against removal of elements β do NOT be out here deleting stuff mid-loop, that's not the move π
it assumes that end__ is within (or is the upper limit of) the drm_gpuvm, so like, read the room and pass a valid end__ fr fr.
one more thing bestie: this iterator does not skip over the drm_gpuvm's kernel_alloc_node π it's in the mix, no exceptions, periodt.
π₯ SEE ALSO π₯
Kernel file ./include/drm/drm_gpuvm.h, plus the whole extended friend group β every single one of them, no gatekeeping π
enum drm_gpuva_flags(9)struct drm_gpuva(9)drm_gpuva_invalidate(9)drm_gpuva_invalidated(9)enum drm_gpuvm_flags(9)struct drm_gpuvm(9)drm_gpuvm_get(9)drm_gpuvm_resv_protected(9)drm_gpuvm_immediate_mode(9)drm_gpuvm_resv(9)drm_gpuvm_resv_obj(9)drm_gpuvm_is_extobj(9)drm_gpuvm_for_each_va_range_safe(9)drm_gpuvm_for_each_va(9)drm_gpuvm_for_each_va_safe(9)struct drm_gpuvm_exec(9)drm_gpuvm_exec_unlock(9)drm_gpuvm_exec_resv_add_fence(9)drm_gpuvm_exec_validate(9)struct drm_gpuvm_bo(9)drm_gpuvm_bo_get(9)drm_gpuvm_bo_gem_evict(9)drm_gpuvm_bo_for_each_va(9)drm_gpuvm_bo_for_each_va_safe(9)enum drm_gpuva_op_type(9)struct drm_gpuva_op_map(9)struct drm_gpuva_op_unmap(9)struct drm_gpuva_op_remap(9)struct drm_gpuva_op_prefetch(9)struct drm_gpuva_op(9)struct drm_gpuva_ops(9)drm_gpuva_for_each_op(9)drm_gpuva_for_each_op_safe(9)drm_gpuva_for_each_op_from_reverse(9)drm_gpuva_for_each_op_reverse(9)drm_gpuva_first_op(9)drm_gpuva_last_op(9)drm_gpuva_prev_op(9)drm_gpuva_next_op(9)struct drm_gpuvm_map_req(9)struct drm_gpuvm_ops(9)drm_gpuva_op_remap_to_unmap_range(9)
π sign-off π
this lil masterpiece lives in ./include/drm, dated October 2026, and it's drm_gpuvm_for_each_va_range(9) from the Kernel API Manual β go read the docs bestie, ily, bye ππ§π
π¦ 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