for_each_vm_bo_in_list(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… 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 β€” the drm_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 β€” the struct drm_gpuvm_bo to 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