[Intel-gfx] [PATCH 37/46] drm/i915/selftests: Make evict tolerant of foreign objects
Chris Wilson
chris at chris-wilson.co.uk
Mon Jan 7 11:55:00 UTC 2019
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 at chris-wilson.co.uk>
---
.../gpu/drm/i915/selftests/i915_gem_evict.c | 64 +++++++++++++++----
1 file changed, 53 insertions(+), 11 deletions(-)
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
index eaefba7470f7..55cd2154676b 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
@@ -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.bound_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)
--
2.20.1
More information about the Intel-gfx
mailing list