drm/i915/selftests: Make evict tolerant of foreign objects
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 18 Jan 2019 11:36:32 +0000 (11:36 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 18 Jan 2019 12:37:56 +0000 (12:37 +0000)
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
drivers/gpu/drm/i915/selftests/i915_gem_evict.c

index 067e5dfa0a244b316597da3e4447d7ac2e9ae117..543d618c152b5cc7cc57ec1304f49f9d3905be67 100644 (file)
 
 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)