drm/i915: Ignore most failures during evict-vm
Removing all vma from the VM is best effort -- we only remove all those ready to be removed, so forgive and VMA that becomes pinned. While forgiving those that become pinned, also take a second look for any that became unpinned as we waited. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Acked-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20191205113726.413351-1-chris@chris-wilson.co.uk
This commit is contained in:
parent
05975cd9eb
commit
a725d711e8
|
@ -359,9 +359,7 @@ int i915_gem_evict_for_node(struct i915_address_space *vm,
|
||||||
*/
|
*/
|
||||||
int i915_gem_evict_vm(struct i915_address_space *vm)
|
int i915_gem_evict_vm(struct i915_address_space *vm)
|
||||||
{
|
{
|
||||||
struct list_head eviction_list;
|
int ret = 0;
|
||||||
struct i915_vma *vma, *next;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
lockdep_assert_held(&vm->mutex);
|
lockdep_assert_held(&vm->mutex);
|
||||||
trace_i915_gem_evict_vm(vm);
|
trace_i915_gem_evict_vm(vm);
|
||||||
|
@ -377,21 +375,30 @@ int i915_gem_evict_vm(struct i915_address_space *vm)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT_LIST_HEAD(&eviction_list);
|
do {
|
||||||
list_for_each_entry(vma, &vm->bound_list, vm_link) {
|
struct i915_vma *vma, *vn;
|
||||||
if (i915_vma_is_pinned(vma))
|
LIST_HEAD(eviction_list);
|
||||||
continue;
|
|
||||||
|
|
||||||
__i915_vma_pin(vma);
|
list_for_each_entry(vma, &vm->bound_list, vm_link) {
|
||||||
list_add(&vma->evict_link, &eviction_list);
|
if (i915_vma_is_pinned(vma))
|
||||||
}
|
continue;
|
||||||
|
|
||||||
|
__i915_vma_pin(vma);
|
||||||
|
list_add(&vma->evict_link, &eviction_list);
|
||||||
|
}
|
||||||
|
if (list_empty(&eviction_list))
|
||||||
|
break;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
list_for_each_entry_safe(vma, vn, &eviction_list, evict_link) {
|
||||||
|
__i915_vma_unpin(vma);
|
||||||
|
if (ret == 0)
|
||||||
|
ret = __i915_vma_unbind(vma);
|
||||||
|
if (ret != -EINTR) /* "Get me out of here!" */
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
} while (ret == 0);
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
list_for_each_entry_safe(vma, next, &eviction_list, evict_link) {
|
|
||||||
__i915_vma_unpin(vma);
|
|
||||||
if (ret == 0)
|
|
||||||
ret = __i915_vma_unbind(vma);
|
|
||||||
}
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue