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: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190118113632.7056-1-chris@chris-wilson.co.uk
This commit is contained in:
parent
293f8c0f2b
commit
71fc448c1a
@ -31,30 +31,63 @@
|
||||
|
||||
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;
|
||||
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;
|
||||
size + I915_GTT_PAGE_SIZE <= i915->ggtt.vm.total;
|
||||
size += I915_GTT_PAGE_SIZE) {
|
||||
struct i915_vma *vma;
|
||||
|
||||
obj = i915_gem_object_create_internal(i915, I915_GTT_PAGE_SIZE);
|
||||
if (IS_ERR(obj))
|
||||
return PTR_ERR(obj);
|
||||
if (IS_ERR(obj)) {
|
||||
err = PTR_ERR(obj);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
vma = i915_gem_object_ggtt_pin(obj, NULL, 0, 0, 0);
|
||||
if (IS_ERR(vma))
|
||||
return PTR_ERR(vma);
|
||||
if (IS_ERR(vma)) {
|
||||
err = PTR_ERR(vma);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
count++;
|
||||
}
|
||||
|
||||
if (!list_empty(&i915->mm.unbound_list)) {
|
||||
size = 0;
|
||||
list_for_each_entry(obj, &i915->mm.unbound_list, mm.link)
|
||||
size++;
|
||||
unbound = 0;
|
||||
list_for_each_entry(obj, &i915->mm.unbound_list, mm.link)
|
||||
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);
|
||||
return -EINVAL;
|
||||
bound = 0;
|
||||
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)) {
|
||||
@ -63,6 +96,15 @@ static int populate_ggtt(struct drm_i915_private *i915)
|
||||
}
|
||||
|
||||
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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user