[Intel-gfx] [PATCH v2] drm/i915: Only prune fences after wait-for-all
Matthew Auld
matthew.william.auld at gmail.com
Thu Mar 8 17:48:48 UTC 2018
On 7 March 2018 at 17:13, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> Currently, we only allow ourselves to prune the fences so long as
> all the waits completed (i.e. all the fences we checked were signaled),
> and that the reservation snapshot did not change across the wait.
> However, if we only waited for a subset of the reservation object, i.e.
> just waiting for the last writer to complete as opposed to all readers
> as well, then we would erroneously conclude we could prune the fences as
> indeed although all of our waits were successful, they did not represent
> the totality of the reservation object.
>
> v2: We only need to check the shared fences due to construction (i.e.
> all of the shared fences will be later than the exclusive fence, if
> any).
>
> Fixes: e54ca9774777 ("drm/i915: Remove completed fences after a wait")
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> Cc: Matthew Auld <matthew.auld at intel.com>
> ---
> drivers/gpu/drm/i915/i915_gem.c | 16 ++++++++++++----
> 1 file changed, 12 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index a5bd07338b46..9b48b5101357 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -433,20 +433,28 @@ i915_gem_object_wait_reservation(struct reservation_object *resv,
> dma_fence_put(shared[i]);
> kfree(shared);
>
> + /*
> + * If both shared fences and an exclusive fence exist,
> + * then by construction the shared fences must be later
> + * than the exclusive fence. If we successfully wait for
> + * all the shared fences, we know that the exclusive fence
> + * must all be signaled. If all the shared fences are
> + * signaled, we can prune the array and recover the
> + * floating references on the fences/requests.
> + */
> prune_fences = count && timeout >= 0;
> } else {
> excl = reservation_object_get_excl_rcu(resv);
> }
>
> - if (excl && timeout >= 0) {
> + if (excl && timeout >= 0)
> timeout = i915_gem_object_wait_fence(excl, flags, timeout,
> rps_client);
> - prune_fences = timeout >= 0;
> - }
>
> dma_fence_put(excl);
>
> - /* Oportunistically prune the fences iff we know they have *all* been
> + /*
> + * Oportunistically prune the fences iff we know they have *all* been
Opportunistically
Reviewed-by: Matthew Auld <matthew.auld at intel.com>
More information about the Intel-gfx
mailing list