Commit 71fc448c authored by Chris Wilson's avatar Chris Wilson

drm/i915/selftests: Make evict tolerant of foreign objects

The evict selftests presumed that all objects in use had been allocated
by itself. This is a dubious claim and so instead of asserting complete
control over the object lists, take (temporary) ownership of them
instead.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190118113632.7056-1-chris@chris-wilson.co.uk
parent 293f8c0f
...@@ -31,30 +31,63 @@ ...@@ -31,30 +31,63 @@
static int populate_ggtt(struct drm_i915_private *i915) static int populate_ggtt(struct drm_i915_private *i915)
{ {
struct drm_i915_gem_object *obj; struct drm_i915_gem_object *obj, *on;
unsigned long expected_unbound, expected_bound;
unsigned long unbound, bound, count;
u64 size; u64 size;
int err;
expected_unbound = 0;
list_for_each_entry(obj, &i915->mm.unbound_list, mm.link) {
i915_gem_object_get(obj);
expected_unbound++;
}
expected_bound = 0;
list_for_each_entry(obj, &i915->mm.bound_list, mm.link) {
i915_gem_object_get(obj);
expected_bound++;
}
count = 0;
for (size = 0; for (size = 0;
size + I915_GTT_PAGE_SIZE <= i915->ggtt.vm.total; size + I915_GTT_PAGE_SIZE <= i915->ggtt.vm.total;
size += I915_GTT_PAGE_SIZE) { size += I915_GTT_PAGE_SIZE) {
struct i915_vma *vma; struct i915_vma *vma;
obj = i915_gem_object_create_internal(i915, I915_GTT_PAGE_SIZE); obj = i915_gem_object_create_internal(i915, I915_GTT_PAGE_SIZE);
if (IS_ERR(obj)) if (IS_ERR(obj)) {
return PTR_ERR(obj); err = PTR_ERR(obj);
goto cleanup;
}
vma = i915_gem_object_ggtt_pin(obj, NULL, 0, 0, 0); vma = i915_gem_object_ggtt_pin(obj, NULL, 0, 0, 0);
if (IS_ERR(vma)) if (IS_ERR(vma)) {
return PTR_ERR(vma); err = PTR_ERR(vma);
goto cleanup;
} }
if (!list_empty(&i915->mm.unbound_list)) { count++;
size = 0; }
unbound = 0;
list_for_each_entry(obj, &i915->mm.unbound_list, mm.link) list_for_each_entry(obj, &i915->mm.unbound_list, mm.link)
size++; unbound++;
if (unbound != expected_unbound) {
pr_err("%s: Found %lu objects unbound, expected %lu!\n",
__func__, unbound, expected_unbound);
err = -EINVAL;
goto cleanup;
}
pr_err("Found %lld objects unbound!\n", size); bound = 0;
return -EINVAL; list_for_each_entry(obj, &i915->mm.bound_list, mm.link)
bound++;
if (bound != expected_bound + count) {
pr_err("%s: Found %lu objects bound, expected %lu!\n",
__func__, bound, expected_bound + count);
err = -EINVAL;
goto cleanup;
} }
if (list_empty(&i915->ggtt.vm.inactive_list)) { if (list_empty(&i915->ggtt.vm.inactive_list)) {
...@@ -63,6 +96,15 @@ static int populate_ggtt(struct drm_i915_private *i915) ...@@ -63,6 +96,15 @@ static int populate_ggtt(struct drm_i915_private *i915)
} }
return 0; return 0;
cleanup:
list_for_each_entry_safe(obj, on, &i915->mm.unbound_list, mm.link)
i915_gem_object_put(obj);
list_for_each_entry_safe(obj, on, &i915->mm.bound_list, mm.link)
i915_gem_object_put(obj);
return err;
} }
static void unpin_ggtt(struct drm_i915_private *i915) static void unpin_ggtt(struct drm_i915_private *i915)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment