Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 51a575d9 authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Retire an active batch pool object rather than allocate new



Since obj->active_count is only updated upon retirement, if we see an
active object in the batch pool, double check that is still active
before deciding to allocate a new object.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/20170316132006.7976-3-chris@chris-wilson.co.uk


Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
parent 92a0256e
Loading
Loading
Loading
Loading
+17 −20
Original line number Diff line number Diff line
@@ -96,8 +96,7 @@ struct drm_i915_gem_object *
i915_gem_batch_pool_get(struct i915_gem_batch_pool *pool,
			size_t size)
{
	struct drm_i915_gem_object *obj = NULL;
	struct drm_i915_gem_object *tmp;
	struct drm_i915_gem_object *obj;
	struct list_head *list;
	int n, ret;

@@ -112,31 +111,29 @@ i915_gem_batch_pool_get(struct i915_gem_batch_pool *pool,
		n = ARRAY_SIZE(pool->cache_list) - 1;
	list = &pool->cache_list[n];

	list_for_each_entry(tmp, list, batch_pool_link) {
	list_for_each_entry(obj, list, batch_pool_link) {
		/* The batches are strictly LRU ordered */
		if (i915_gem_object_is_active(tmp))
		if (i915_gem_object_is_active(obj)) {
			if (!reservation_object_test_signaled_rcu(obj->resv,
								  true))
				break;

		GEM_BUG_ON(!reservation_object_test_signaled_rcu(tmp->resv,
								 true));
			i915_gem_retire_requests(pool->engine->i915);
			GEM_BUG_ON(i915_gem_object_is_active(obj));
		}

		if (tmp->base.size >= size) {
			/* Clear the set of shared fences early */
			reservation_object_lock(tmp->resv, NULL);
			reservation_object_add_excl_fence(tmp->resv, NULL);
			reservation_object_unlock(tmp->resv);
		GEM_BUG_ON(!reservation_object_test_signaled_rcu(obj->resv,
								 true));

			obj = tmp;
			break;
		}
		if (obj->base.size >= size)
			goto found;
	}

	if (obj == NULL) {
	obj = i915_gem_object_create_internal(pool->engine->i915, size);
	if (IS_ERR(obj))
		return obj;
	}

found:
	ret = i915_gem_object_pin_pages(obj);
	if (ret)
		return ERR_PTR(ret);