Lines Matching refs:vma

41 static bool dying_vma(struct i915_vma *vma)
43 return !kref_read(&vma->obj->base.refcount);
67 static bool grab_vma(struct i915_vma *vma, struct i915_gem_ww_ctx *ww) in grab_vma() argument
73 if (i915_gem_object_get_rcu(vma->obj)) { in grab_vma()
74 if (!i915_gem_object_trylock(vma->obj, ww)) { in grab_vma()
75 i915_gem_object_put(vma->obj); in grab_vma()
80 atomic_and(~I915_VMA_PIN_MASK, &vma->flags); in grab_vma()
86 static void ungrab_vma(struct i915_vma *vma) in ungrab_vma() argument
88 if (dying_vma(vma)) in ungrab_vma()
91 i915_gem_object_unlock(vma->obj); in ungrab_vma()
92 i915_gem_object_put(vma->obj); in ungrab_vma()
98 struct i915_vma *vma, in mark_free() argument
102 if (i915_vma_is_pinned(vma)) in mark_free()
105 if (!grab_vma(vma, ww)) in mark_free()
108 list_add(&vma->evict_link, unwind); in mark_free()
109 return drm_mm_scan_add_block(scan, &vma->node); in mark_free()
112 static bool defer_evict(struct i915_vma *vma) in defer_evict() argument
114 if (i915_vma_is_active(vma)) in defer_evict()
117 if (i915_vma_is_scanout(vma)) in defer_evict()
157 struct i915_vma *vma, *next; in i915_gem_evict_something() local
199 list_for_each_entry_safe(vma, next, &vm->bound_list, vm_link) { in i915_gem_evict_something()
200 if (vma == active) { /* now seen this vma twice */ in i915_gem_evict_something()
222 if (active != ERR_PTR(-EAGAIN) && defer_evict(vma)) { in i915_gem_evict_something()
224 active = vma; in i915_gem_evict_something()
226 list_move_tail(&vma->vm_link, &vm->bound_list); in i915_gem_evict_something()
230 if (mark_free(&scan, ww, vma, flags, &eviction_list)) in i915_gem_evict_something()
235 list_for_each_entry_safe(vma, next, &eviction_list, evict_link) { in i915_gem_evict_something()
236 ret = drm_mm_scan_remove_block(&scan, &vma->node); in i915_gem_evict_something()
238 ungrab_vma(vma); in i915_gem_evict_something()
282 list_for_each_entry_safe(vma, next, &eviction_list, evict_link) { in i915_gem_evict_something()
283 if (drm_mm_scan_remove_block(&scan, &vma->node)) { in i915_gem_evict_something()
284 __i915_vma_pin(vma); in i915_gem_evict_something()
286 list_del(&vma->evict_link); in i915_gem_evict_something()
287 ungrab_vma(vma); in i915_gem_evict_something()
293 list_for_each_entry_safe(vma, next, &eviction_list, evict_link) { in i915_gem_evict_something()
294 __i915_vma_unpin(vma); in i915_gem_evict_something()
296 ret = __i915_vma_unbind(vma); in i915_gem_evict_something()
297 ungrab_vma(vma); in i915_gem_evict_something()
301 vma = container_of(node, struct i915_vma, node); in i915_gem_evict_something()
304 if (vma->node.color != I915_COLOR_UNEVICTABLE && in i915_gem_evict_something()
305 grab_vma(vma, ww)) { in i915_gem_evict_something()
306 ret = __i915_vma_unbind(vma); in i915_gem_evict_something()
307 ungrab_vma(vma); in i915_gem_evict_something()
337 struct i915_vma *vma, *next; in i915_gem_evict_for_node() local
380 vma = container_of(node, typeof(*vma), node); in i915_gem_evict_for_node()
400 if (i915_vma_is_pinned(vma)) { in i915_gem_evict_for_node()
405 if (flags & PIN_NONBLOCK && i915_vma_is_active(vma)) { in i915_gem_evict_for_node()
410 if (!grab_vma(vma, ww)) { in i915_gem_evict_for_node()
424 __i915_vma_pin(vma); in i915_gem_evict_for_node()
425 list_add(&vma->evict_link, &eviction_list); in i915_gem_evict_for_node()
428 list_for_each_entry_safe(vma, next, &eviction_list, evict_link) { in i915_gem_evict_for_node()
429 __i915_vma_unpin(vma); in i915_gem_evict_for_node()
431 ret = __i915_vma_unbind(vma); in i915_gem_evict_for_node()
433 ungrab_vma(vma); in i915_gem_evict_for_node()
478 struct i915_vma *vma, *vn; in i915_gem_evict_vm() local
482 list_for_each_entry(vma, &vm->bound_list, vm_link) { in i915_gem_evict_vm()
483 if (i915_vma_is_pinned(vma)) in i915_gem_evict_vm()
491 if (!i915_gem_object_get_rcu(vma->obj) || in i915_gem_evict_vm()
492 (ww && (dma_resv_locking_ctx(vma->obj->base.resv) == &ww->ctx))) { in i915_gem_evict_vm()
493 __i915_vma_pin(vma); in i915_gem_evict_vm()
494 list_add(&vma->evict_link, &locked_eviction_list); in i915_gem_evict_vm()
498 if (!i915_gem_object_trylock(vma->obj, ww)) { in i915_gem_evict_vm()
500 *busy_bo = vma->obj; /* holds ref */ in i915_gem_evict_vm()
504 i915_gem_object_put(vma->obj); in i915_gem_evict_vm()
508 __i915_vma_pin(vma); in i915_gem_evict_vm()
509 list_add(&vma->evict_link, &eviction_list); in i915_gem_evict_vm()
515 list_for_each_entry_safe(vma, vn, &locked_eviction_list, evict_link) { in i915_gem_evict_vm()
516 __i915_vma_unpin(vma); in i915_gem_evict_vm()
519 ret = __i915_vma_unbind(vma); in i915_gem_evict_vm()
523 if (!dying_vma(vma)) in i915_gem_evict_vm()
524 i915_gem_object_put(vma->obj); in i915_gem_evict_vm()
527 list_for_each_entry_safe(vma, vn, &eviction_list, evict_link) { in i915_gem_evict_vm()
528 __i915_vma_unpin(vma); in i915_gem_evict_vm()
530 ret = __i915_vma_unbind(vma); in i915_gem_evict_vm()
535 i915_gem_object_unlock(vma->obj); in i915_gem_evict_vm()
536 i915_gem_object_put(vma->obj); in i915_gem_evict_vm()