Skip to content

Commit e54ca97

Browse files
committed
drm/i915: Remove completed fences after a wait
If we wait upon the full (i.e. all shared fences, or upon an exclusive fence) reservation object successfully, we know that all fences beneath it have been signaled, so long as no new fences were added whilst we slept. If the reservation_object remains the same, as detected by its seqcount, we can then reap all the fences upon completion. Signed-off-by: Chris Wilson <[email protected]> Cc: Joonas Lahtinen <[email protected]> Reviewed-by: Matthew Auld <[email protected]> Link: http://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 6ef98ea commit e54ca97

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

drivers/gpu/drm/i915/i915_gem.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,9 @@ i915_gem_object_wait_reservation(struct reservation_object *resv,
427427
long timeout,
428428
struct intel_rps_client *rps)
429429
{
430+
unsigned int seq = __read_seqcount_begin(&resv->seq);
430431
struct dma_fence *excl;
432+
bool prune_fences = false;
431433

432434
if (flags & I915_WAIT_ALL) {
433435
struct dma_fence **shared;
@@ -452,15 +454,26 @@ i915_gem_object_wait_reservation(struct reservation_object *resv,
452454
for (; i < count; i++)
453455
dma_fence_put(shared[i]);
454456
kfree(shared);
457+
458+
prune_fences = count && timeout >= 0;
455459
} else {
456460
excl = reservation_object_get_excl_rcu(resv);
457461
}
458462

459-
if (excl && timeout >= 0)
463+
if (excl && timeout >= 0) {
460464
timeout = i915_gem_object_wait_fence(excl, flags, timeout, rps);
465+
prune_fences = timeout >= 0;
466+
}
461467

462468
dma_fence_put(excl);
463469

470+
if (prune_fences && !__read_seqcount_retry(&resv->seq, seq)) {
471+
reservation_object_lock(resv, NULL);
472+
if (!__read_seqcount_retry(&resv->seq, seq))
473+
reservation_object_add_excl_fence(resv, NULL);
474+
reservation_object_unlock(resv);
475+
}
476+
464477
return timeout;
465478
}
466479

0 commit comments

Comments
 (0)