[PATCH 17/19] drm/i915: Extend global sync_seqno optimisation to cover all requests
Chris Wilson
chris at chris-wilson.co.uk
Tue Sep 13 16:44:08 UTC 2016
We can use the last submitted seqno to improve our caching of the most
recent sync point between timelines.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
drivers/gpu/drm/i915/i915_gem_request.c | 22 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_gem_request.c b/drivers/gpu/drm/i915/i915_gem_request.c
index 2dc231e58593..90d95bdda43a 100644
--- a/drivers/gpu/drm/i915/i915_gem_request.c
+++ b/drivers/gpu/drm/i915/i915_gem_request.c
@@ -476,6 +476,7 @@ static int
i915_gem_request_await_request(struct drm_i915_gem_request *to,
struct drm_i915_gem_request *from)
{
+ u32 seqno;
int ret;
GEM_BUG_ON(to == from);
@@ -489,18 +490,21 @@ i915_gem_request_await_request(struct drm_i915_gem_request *to,
return ret < 0 ? ret : 0;
}
+ seqno = from->global_seqno;
+ if (seqno == 0)
+ seqno = from->engine->timeline->last_submitted_seqno;
+ if (seqno - 1 < to->timeline->sync_seqno[from->engine->id])
+ return 0;
+
+ trace_i915_gem_ring_sync_to(to, from);
+
if (from->global_seqno == 0) {
ret = i915_sw_fence_await_dma_fence(&to->submit,
&from->fence, 0,
GFP_KERNEL);
- return ret < 0 ? ret : 0;
- }
-
- if (from->global_seqno <= to->timeline->sync_seqno[from->engine->id])
- return 0;
-
- trace_i915_gem_ring_sync_to(to, from);
- if (!i915.semaphores) {
+ if (ret < 0)
+ return ret;
+ } else if (!i915.semaphores) {
if (!i915_spin_request(from, TASK_INTERRUPTIBLE, 2)) {
ret = i915_sw_fence_await_dma_fence(&to->submit,
&from->fence, 0,
@@ -514,7 +518,7 @@ i915_gem_request_await_request(struct drm_i915_gem_request *to,
return ret;
}
- to->timeline->sync_seqno[from->engine->id] = from->global_seqno;
+ to->timeline->sync_seqno[from->engine->id] = seqno;
return 0;
}
--
2.9.3
More information about the Intel-gfx-trybot
mailing list