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

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
Loading
Loading
Loading
Loading
+53 −11
Original line number Diff line number Diff line
@@ -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;
		}

	if (!list_empty(&i915->mm.unbound_list)) {
		size = 0;
		count++;
	}

	unbound = 0;
	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);
		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)