On 7 March 2018 at 17:13, Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> 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@xxxxxxxxxxxxxxxxxx> > Cc: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx> > Cc: Matthew Auld <matthew.auld@xxxxxxxxx> > --- > 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@xxxxxxxxx> _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx