[Intel-gfx] [PATCH 16/27] drm/i915: Reinstate reservation_object zapping for batch_pool objects

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Fri Apr 28 12:20:59 UTC 2017


On 19/04/2017 10:41, Chris Wilson wrote:
> I removed the zapping of the reservation_object->fence array of shared
> fences prematurely. We don't yet have the code to zap that array when
> retiring the object, and so currently it remains possible to continually
> grow the shared array trapping requests when reusing the batch_pool
> object across many timelines.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at linux.intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> Cc: Mika Kuoppala <mika.kuoppala at intel.com>
> Cc: Matthew Auld <matthew.auld at intel.com>
> ---
>  drivers/gpu/drm/i915/i915_gem_batch_pool.c | 18 ++++++++++++++++--
>  1 file changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_batch_pool.c b/drivers/gpu/drm/i915/i915_gem_batch_pool.c
> index 41aa598c4f3b..414e46e2f072 100644
> --- a/drivers/gpu/drm/i915/i915_gem_batch_pool.c
> +++ b/drivers/gpu/drm/i915/i915_gem_batch_pool.c
> @@ -114,12 +114,26 @@ i915_gem_batch_pool_get(struct i915_gem_batch_pool *pool,
>  	list_for_each_entry(obj, list, batch_pool_link) {
>  		/* The batches are strictly LRU ordered */
>  		if (i915_gem_object_is_active(obj)) {
> -			if (!reservation_object_test_signaled_rcu(obj->resv,
> -								  true))
> +			struct reservation_object *resv = obj->resv;
> +
> +			if (!reservation_object_test_signaled_rcu(resv, true))
>  				break;
>
>  			i915_gem_retire_requests(pool->engine->i915);
>  			GEM_BUG_ON(i915_gem_object_is_active(obj));
> +
> +			/* The object is now idle, clear the array of shared
> +			 * fences before we add a new request. Although, we
> +			 * remain on the same engine, we may be on a different
> +			 * timeline and so may continually grow the array,
> +			 * trapping a reference to all the old fences, rather
> +			 * than replace the existing fence.
> +			 */
> +			if (rcu_access_pointer(resv->fence)) {
> +				reservation_object_lock(resv, NULL);
> +				reservation_object_add_excl_fence(resv, NULL);
> +				reservation_object_unlock(resv);
> +			}
>  		}
>
>  		GEM_BUG_ON(!reservation_object_test_signaled_rcu(obj->resv,
>

Not too familiar with the reservation object stuff but having read some 
kerneldoc it looks correct to me.

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>

Regards,

Tvrtko


More information about the Intel-gfx mailing list