for_each_vm_bo_in_list(9)
π for_each_vm_bo_in_list(9) β fresh from the Kernel API Manual, bestie β¨
okay so this is the group-chat recap of for_each_vm_bo_in_list(9), and yes itβs giving internal-only main character energy π«Ά
πΈ NAME πΈ
for_each_vm_bo_in_list β internal vm_bo list iterator. Thatβs the whole vibe, no cap.
π¦ SYNOPSIS π¦
for_each_vm_bo_in_list (__gpuvm , __list_name , __local_list , __vm_bo );
π ARGUMENTS π
__gpuvmβ thedrm_gpuvm, aka the main character of this little function hangout π__list_nameβ the name of the list weβre iterating on β¨__local_listβ a pointer to the local list used to store already iterated items π__vm_boβ thestruct drm_gpuvm_boto assign in each iteration step π¦
π DESCRIPTION π
So this helper is here to provide lockless list iteration β¨ Lockless as in, the iterator releases the lock immediately after picking the first element from the list, hence list insertion and deletion can happen concurrently. Literally multitasking, sheβs so brave π
bestie, it is not allowed to re-assign the vm_bo pointer from inside this loop. Do not do it. That is not the vibe. π
Typical use:
struct drm_gpuvm_bo *vm_bo;
LIST_HEAD(my_local_list);
ret = 0;
for_each_vm_bo_in_list(gpuvm, <list_name>, my_local_list, vm_bo) {
ret = do_something_with_vm_bo(..., vm_bo);
if (ret)
break;
}
// Drop ref in case we break out of the loop.
drm_gpuvm_bo_put(vm_bo);
restore_vm_bo_list(gpuvm, <list_name>, my_local_list);
Only used for internal list iterations, not meant to be exposed to the outside world π Itβs giving private-story-close-friends only, iykyk π
π SEE ALSO π
Kernel file ./drivers/gpu/drm/drm_gpuvm.c, Overview(9), Split and Merge(9), Madvise Logic - Splitting and Traversal(9), Locking(9), Examples(9), get_next_vm_bo_from_list(9), restore_vm_bo_list(9), drm_gpuvm_bo_is_zombie(9), drm_gpuvm_bo_list_add(9), drm_gpuvm_bo_list_del_init(9), drm_gpuvm_bo_list_del(9), drm_gpuvm_range_valid(9), drm_gpuvm_resv_object_alloc(9), drm_gpuvm_init(9), drm_gpuvm_put(9), drm_gpuvm_prepare_vm(9), drm_gpuvm_prepare_objects(9), drm_gpuvm_prepare_range(9), drm_gpuvm_exec_lock(9), drm_gpuvm_exec_lock_array(9), drm_gpuvm_exec_lock_range(9), drm_gpuvm_validate(9), drm_gpuvm_resv_add_fence(9), drm_gpuvm_bo_create(9), drm_gpuvm_bo_put(9), drm_gpuvm_bo_put_deferred(9), drm_gpuvm_bo_deferred_cleanup(9), drm_gpuvm_bo_find(9), drm_gpuvm_bo_obtain_locked(9), drm_gpuvm_bo_obtain_prealloc(9), drm_gpuvm_bo_extobj_add(9), drm_gpuvm_bo_evict(9), drm_gpuva_insert(9), drm_gpuva_remove(9), drm_gpuva_link(9), drm_gpuva_unlink(9), drm_gpuva_unlink_defer(9), drm_gpuva_find_first(9), drm_gpuva_find(9), drm_gpuvm_interval_empty(9), drm_gpuva_map(9), drm_gpuva_remap(9), drm_gpuva_unmap(9), drm_gpuvm_sm_map(9), drm_gpuvm_sm_unmap(9), drm_gpuvm_sm_map_exec_lock(9), drm_gpuvm_sm_unmap_exec_lock(9), drm_gpuvm_sm_map_ops_create(9), drm_gpuvm_madvise_ops_create(9), drm_gpuvm_sm_unmap_ops_create(9), drm_gpuvm_prefetch_ops_create(9), drm_gpuvm_bo_unmap_ops_create(9), drm_gpuva_ops_free(9) π
Big kiss and a sparkle: this page lives under ./drivers/gpu/drm, itβs stamped October 2026, and it will forever be for_each_vm_bo_in_list(9) ππ«Άπ
π¦ 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