diff options
author | John Harrison <John.C.Harrison@Intel.com> | 2014-04-10 10:58:56 +0100 |
---|---|---|
committer | John Harrison <John.C.Harrison@Intel.com> | 2016-05-06 14:13:00 +0100 |
commit | 89f0ed0fbfd4aa1def76ab768a2cf96e94c24654 (patch) | |
tree | 7ae0d34a63cfb5ad4fb2213dc98f621debdd12fc | |
parent | a65ee63e7926a81a921a2bd136f71cc65a15840f (diff) |
drm/i915: Added trace points to scheduler
Added trace points to the scheduler to track all the various events,
node state transitions and other interesting things that occur.
v2: Updated for new request completion tracking implementation.
v3: Updated for changes to node kill code.
v4: Wrapped some long lines to keep the style checker happy.
v6: Updated to newer nightly (lots of ring -> engine renaming).
Dropped 'min_seqno' value from 'i915_scheduler_remove' tracepoint as
it has also been removed from the code.
For: VIZ-1587
Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_execbuffer.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_scheduler.c | 24 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_trace.h | 193 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_lrc.c | 2 |
4 files changed, 219 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index 5da2c3add960..ff518752c0aa 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c @@ -1276,6 +1276,8 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params, i915_gem_execbuffer_move_to_active(vmas, params->request); + trace_i915_gem_ring_queue(engine, params); + qe = container_of(params, typeof(*qe), params); ret = i915_scheduler_queue_execbuffer(qe); if (ret) diff --git a/drivers/gpu/drm/i915/i915_scheduler.c b/drivers/gpu/drm/i915/i915_scheduler.c index 13084fb92378..a3a7a8265e16 100644 --- a/drivers/gpu/drm/i915/i915_scheduler.c +++ b/drivers/gpu/drm/i915/i915_scheduler.c @@ -124,6 +124,8 @@ static void i915_scheduler_node_requeue(struct i915_scheduler *scheduler, node->status = I915_SQS_QUEUED; scheduler->counts[node->params.engine->id].flying--; scheduler->counts[node->params.engine->id].queued++; + trace_i915_scheduler_unfly(node->params.engine, node); + trace_i915_scheduler_node_state_change(node->params.engine, node); } /* @@ -137,12 +139,14 @@ static void i915_scheduler_node_kill(struct i915_scheduler *scheduler, WARN_ON(I915_SQS_IS_COMPLETE(node)); - if (I915_SQS_IS_FLYING(node)) + if (I915_SQS_IS_FLYING(node)) { scheduler->counts[node->params.engine->id].flying--; - else + trace_i915_scheduler_unfly(node->params.engine, node); + } else scheduler->counts[node->params.engine->id].queued--; node->status = I915_SQS_DEAD; + trace_i915_scheduler_node_state_change(node->params.engine, node); } /* Mark a node as in flight on the hardware. */ @@ -166,6 +170,8 @@ static void i915_scheduler_node_fly(struct i915_scheduler_queue_entry *node) node->status = I915_SQS_FLYING; scheduler->counts[engine->id].flying++; + trace_i915_scheduler_fly(engine, node); + trace_i915_scheduler_node_state_change(engine, node); if (!(scheduler->flags[engine->id] & I915_SF_INTERRUPTS_ENABLED)) { bool success = true; @@ -317,6 +323,7 @@ static int i915_scheduler_pop_from_queue_locked(struct intel_engine_cs *engine, best->status = I915_SQS_POPPED; scheduler->counts[engine->id].queued--; + trace_i915_scheduler_node_state_change(engine, best); ret = 0; } else { @@ -335,6 +342,8 @@ static int i915_scheduler_pop_from_queue_locked(struct intel_engine_cs *engine, } } + trace_i915_scheduler_pop_from_queue(engine, best); + *pop_node = best; return ret; } @@ -542,6 +551,8 @@ static int i915_scheduler_queue_execbuffer_bypass(struct i915_scheduler_queue_en struct i915_scheduler *scheduler = dev_priv->scheduler; int ret; + trace_i915_scheduler_queue(qe->params.engine, qe); + intel_ring_reserved_space_cancel(qe->params.request->ringbuf); scheduler->flags[qe->params.engine->id] |= I915_SF_SUBMITTING; @@ -668,6 +679,8 @@ int i915_scheduler_queue_execbuffer(struct i915_scheduler_queue_entry *qe) scheduler->min_flying; scheduler->counts[engine->id].queued++; + trace_i915_scheduler_queue(engine, node); + trace_i915_scheduler_node_state_change(engine, node); spin_unlock_irq(&scheduler->lock); @@ -698,6 +711,8 @@ bool i915_scheduler_notify_request(struct drm_i915_gem_request *req) struct i915_scheduler_queue_entry *node = req->scheduler_qe; unsigned long flags; + trace_i915_scheduler_landing(req); + if (!node) return false; @@ -712,6 +727,7 @@ bool i915_scheduler_notify_request(struct drm_i915_gem_request *req) node->status = I915_SQS_COMPLETE; scheduler->counts[req->engine->id].flying--; + trace_i915_scheduler_node_state_change(req->engine, node); spin_unlock_irqrestore(&scheduler->lock, flags); @@ -872,6 +888,8 @@ static bool i915_scheduler_remove(struct i915_scheduler *scheduler, do_submit = (scheduler->counts[engine->id].queued > 0) && (scheduler->counts[engine->id].flying < scheduler->min_flying); + trace_i915_scheduler_remove(engine, do_submit); + spin_unlock_irq(&scheduler->lock); return do_submit; @@ -907,6 +925,8 @@ static void i915_scheduler_process_work(struct intel_engine_cs *engine) node = list_first_entry(&remove, typeof(*node), link); list_del(&node->link); + trace_i915_scheduler_destroy(engine, node); + /* Free up all the DRM references */ i915_scheduler_clean_node(node); diff --git a/drivers/gpu/drm/i915/i915_trace.h b/drivers/gpu/drm/i915/i915_trace.h index 59a6266b2e53..2edaaf659841 100644 --- a/drivers/gpu/drm/i915/i915_trace.h +++ b/drivers/gpu/drm/i915/i915_trace.h @@ -9,6 +9,7 @@ #include "i915_drv.h" #include "intel_drv.h" #include "intel_ringbuffer.h" +#include "i915_scheduler.h" #undef TRACE_SYSTEM #define TRACE_SYSTEM i915 @@ -815,6 +816,198 @@ TRACE_EVENT(switch_mm, __entry->dev, __entry->ring, __entry->to, __entry->vm) ); +TRACE_EVENT(i915_scheduler_queue, + TP_PROTO(struct intel_engine_cs *engine, + struct i915_scheduler_queue_entry *node), + TP_ARGS(engine, node), + + TP_STRUCT__entry( + __field(u32, engine) + __field(u32, uniq) + __field(u32, seqno) + ), + + TP_fast_assign( + __entry->engine = engine->id; + __entry->uniq = node ? node->params.request->uniq : 0; + __entry->seqno = node ? node->params.request->seqno : 0; + ), + + TP_printk("engine=%d, uniq=%d, seqno=%d", + __entry->engine, __entry->uniq, __entry->seqno) +); + +TRACE_EVENT(i915_scheduler_fly, + TP_PROTO(struct intel_engine_cs *engine, + struct i915_scheduler_queue_entry *node), + TP_ARGS(engine, node), + + TP_STRUCT__entry( + __field(u32, engine) + __field(u32, uniq) + __field(u32, seqno) + ), + + TP_fast_assign( + __entry->engine = engine->id; + __entry->uniq = node ? node->params.request->uniq : 0; + __entry->seqno = node ? node->params.request->seqno : 0; + ), + + TP_printk("engine=%d, uniq=%d, seqno=%d", + __entry->engine, __entry->uniq, __entry->seqno) +); + +TRACE_EVENT(i915_scheduler_unfly, + TP_PROTO(struct intel_engine_cs *engine, + struct i915_scheduler_queue_entry *node), + TP_ARGS(engine, node), + + TP_STRUCT__entry( + __field(u32, engine) + __field(u32, uniq) + __field(u32, seqno) + ), + + TP_fast_assign( + __entry->engine = engine->id; + __entry->uniq = node ? node->params.request->uniq : 0; + __entry->seqno = node ? node->params.request->seqno : 0; + ), + + TP_printk("engine=%d, uniq=%d, seqno=%d", + __entry->engine, __entry->uniq, __entry->seqno) +); + +TRACE_EVENT(i915_scheduler_landing, + TP_PROTO(struct drm_i915_gem_request *req), + TP_ARGS(req), + + TP_STRUCT__entry( + __field(u32, engine) + __field(u32, uniq) + __field(u32, seqno) + __field(u32, status) + ), + + TP_fast_assign( + __entry->engine = req->engine->id; + __entry->uniq = req->uniq; + __entry->seqno = req->seqno; + __entry->status = req->scheduler_qe ? + req->scheduler_qe->status : ~0U; + ), + + TP_printk("engine=%d, uniq=%d, seqno=%d, status=%d", + __entry->engine, __entry->uniq, __entry->seqno, + __entry->status) +); + +TRACE_EVENT(i915_scheduler_remove, + TP_PROTO(struct intel_engine_cs *engine, + bool do_submit), + TP_ARGS(engine, do_submit), + + TP_STRUCT__entry( + __field(u32, engine) + __field(bool, do_submit) + ), + + TP_fast_assign( + __entry->engine = engine->id; + __entry->do_submit = do_submit; + ), + + TP_printk("engine=%d, do_submit=%d", __entry->engine, __entry->do_submit) +); + +TRACE_EVENT(i915_scheduler_destroy, + TP_PROTO(struct intel_engine_cs *engine, + struct i915_scheduler_queue_entry *node), + TP_ARGS(engine, node), + + TP_STRUCT__entry( + __field(u32, engine) + __field(u32, uniq) + __field(u32, seqno) + ), + + TP_fast_assign( + __entry->engine = engine->id; + __entry->uniq = node ? node->params.request->uniq : 0; + __entry->seqno = node ? node->params.request->seqno : 0; + ), + + TP_printk("engine=%d, uniq=%d, seqno=%d", + __entry->engine, __entry->uniq, __entry->seqno) +); + +TRACE_EVENT(i915_scheduler_pop_from_queue, + TP_PROTO(struct intel_engine_cs *engine, + struct i915_scheduler_queue_entry *node), + TP_ARGS(engine, node), + + TP_STRUCT__entry( + __field(u32, engine) + __field(u32, uniq) + __field(u32, seqno) + ), + + TP_fast_assign( + __entry->engine = engine->id; + __entry->uniq = node ? node->params.request->uniq : 0; + __entry->seqno = node ? node->params.request->seqno : 0; + ), + + TP_printk("engine=%d, uniq=%d, seqno=%d", + __entry->engine, __entry->uniq, __entry->seqno) +); + +TRACE_EVENT(i915_scheduler_node_state_change, + TP_PROTO(struct intel_engine_cs *engine, + struct i915_scheduler_queue_entry *node), + TP_ARGS(engine, node), + + TP_STRUCT__entry( + __field(u32, engine) + __field(u32, uniq) + __field(u32, seqno) + __field(u32, status) + ), + + TP_fast_assign( + __entry->engine = engine->id; + __entry->uniq = node ? node->params.request->uniq : 0; + __entry->seqno = node->params.request->seqno; + __entry->status = node->status; + ), + + TP_printk("engine=%d, uniq=%d, seqno=%d, status=%d", + __entry->engine, __entry->uniq, __entry->seqno, + __entry->status) +); + +TRACE_EVENT(i915_gem_ring_queue, + TP_PROTO(struct intel_engine_cs *ring, + struct i915_execbuffer_params *params), + TP_ARGS(ring, params), + + TP_STRUCT__entry( + __field(u32, ring) + __field(u32, uniq) + __field(u32, seqno) + ), + + TP_fast_assign( + __entry->ring = ring->id; + __entry->uniq = params->request->uniq; + __entry->seqno = params->request->seqno; + ), + + TP_printk("ring=%d, uniq=%d, seqno=%d", __entry->ring, + __entry->uniq, __entry->seqno) +); + #endif /* _I915_TRACE_H_ */ /* This part must be outside protection */ diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c index b01571e827ae..252fc24691d6 100644 --- a/drivers/gpu/drm/i915/intel_lrc.c +++ b/drivers/gpu/drm/i915/intel_lrc.c @@ -986,6 +986,8 @@ int intel_execlists_submission(struct i915_execbuffer_params *params, i915_gem_execbuffer_move_to_active(vmas, params->request); + trace_i915_gem_ring_queue(engine, params); + qe = container_of(params, typeof(*qe), params); ret = i915_scheduler_queue_execbuffer(qe); if (ret) |