diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_execbuffer.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_scheduler.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_scheduler.h | 5 |
4 files changed, 32 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 97629213a1b8..b4a9e4b8e83a 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -3718,6 +3718,10 @@ static int i915_scheduler_info(struct seq_file *m, void *unused) PRINT_VAR(" ExecEarly retry", "u", stats[e].exec_early); PRINT_VAR(" ExecFinal requeue", "u", stats[e].exec_again); PRINT_VAR(" ExecFinal killed", "u", stats[e].exec_dead); + PRINT_VAR(" Fence wait", "u", stats[e].fence_wait); + PRINT_VAR(" Fence wait again", "u", stats[e].fence_again); + PRINT_VAR(" Fence wait ignore", "u", stats[e].fence_ignore); + PRINT_VAR(" Fence supplied", "u", stats[e].fence_got); PRINT_VAR(" Hung flying", "u", stats[e].kill_flying); PRINT_VAR(" Hung queued", "u", stats[e].kill_queued); PRINT_VAR(" File queue wait", "u", stats[e].file_wait); diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index f9756a9710a6..61b1a5f1e855 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c @@ -1512,6 +1512,8 @@ eb_select_ring(struct drm_i915_private *dev_priv, */ static int i915_early_fence_wait(struct intel_engine_cs *ring, int fence_fd) { + struct drm_i915_private *dev_priv = to_i915(ring->dev); + struct i915_scheduler *scheduler = dev_priv->scheduler; struct sync_fence *fence; int ret = 0; @@ -1533,8 +1535,12 @@ static int i915_early_fence_wait(struct intel_engine_cs *ring, int fence_fd) * because the the mutex lock has not yet been acquired and * the wait is interruptible. */ - if (!i915_safe_to_ignore_fence(ring, fence)) + if (i915_safe_to_ignore_fence(ring, fence)) + scheduler->stats[ring->id].fence_ignore++; + else { + scheduler->stats[ring->id].fence_wait++; ret = sync_fence_wait(fence, -1); + } sync_fence_put(fence); return ret; diff --git a/drivers/gpu/drm/i915/i915_scheduler.c b/drivers/gpu/drm/i915/i915_scheduler.c index 4d9d9f4a6373..c74606520ebc 100644 --- a/drivers/gpu/drm/i915/i915_scheduler.c +++ b/drivers/gpu/drm/i915/i915_scheduler.c @@ -394,15 +394,20 @@ static void i915_scheduler_wait_fence_signaled(struct sync_fence *fence, static bool i915_scheduler_async_fence_wait(struct drm_device *dev, struct i915_scheduler_queue_entry *node) { + struct drm_i915_private *dev_priv = to_i915(node->params.engine->dev); + struct i915_scheduler *scheduler = dev_priv->scheduler; struct i915_sync_fence_waiter *fence_waiter; struct sync_fence *fence = node->params.fence_wait; int signaled; bool success = true; - if ((node->flags & I915_QEF_FENCE_WAITING) == 0) + if ((node->flags & I915_QEF_FENCE_WAITING) == 0) { node->flags |= I915_QEF_FENCE_WAITING; - else + scheduler->stats[node->params.engine->id].fence_wait++; + } else { + scheduler->stats[node->params.engine->id].fence_again++; return true; + } if (fence == NULL) return false; @@ -465,8 +470,10 @@ static int i915_scheduler_pop_from_queue_locked(struct intel_engine_cs *engine, else signalled = true; - if (!signalled) + if (!signalled) { signalled = i915_safe_to_ignore_fence(engine, node->params.fence_wait); + scheduler->stats[node->params.engine->id].fence_ignore++; + } has_local = false; has_remote = false; @@ -855,6 +862,9 @@ int i915_scheduler_queue_execbuffer(struct i915_scheduler_queue_entry *qe) int i, e; int incomplete; + if (qe->params.fence_wait) + scheduler->stats[engine->id].fence_got++; + /* Bypass the scheduler and send the buffer immediately? */ if (!i915.enable_scheduler) return i915_scheduler_queue_execbuffer_bypass(qe); @@ -1414,7 +1424,7 @@ static int i915_scheduler_dump_locked(struct intel_engine_cs *engine, deps++; DRM_DEBUG_DRIVER("<%s> %c:%02d> uniq = %d, seqno" - " = %d/%s, deps = %d / %d, %s [pri = " + " = %d/%s, deps = %d / %d, fence = %p/%d, %s [pri = " "%4d]\n", engine->name, i915_scheduler_queue_status_chr(node->status), count, @@ -1422,6 +1432,8 @@ static int i915_scheduler_dump_locked(struct intel_engine_cs *engine, node->params.request->seqno, node->params.engine->name, deps, node->num_deps, + node->params.fence_wait, + node->params.fence_wait ? sync_fence_is_signaled(node->params.fence_wait) : 0, i915_qe_state_str(node), node->priority); diff --git a/drivers/gpu/drm/i915/i915_scheduler.h b/drivers/gpu/drm/i915/i915_scheduler.h index 49545207deda..1c20c1f04df5 100644 --- a/drivers/gpu/drm/i915/i915_scheduler.h +++ b/drivers/gpu/drm/i915/i915_scheduler.h @@ -116,6 +116,11 @@ struct i915_scheduler_stats { uint32_t file_wait; uint32_t file_stall; uint32_t file_lost; + + uint32_t fence_wait; + uint32_t fence_again; + uint32_t fence_ignore; + uint32_t fence_got; }; struct i915_scheduler_stats_nodes { |