aboutsummaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/scheduler
diff options
context:
space:
mode:
authorAndrey Grodzovsky2018-07-31 10:48:52 -0400
committerAlex Deucher2018-08-27 11:09:46 -0500
commit07507c01aa70558828216ea81393c1511fb6189d (patch)
tree495bc0dc3d118e85556cf7db6dc4142d227b67af /drivers/gpu/drm/scheduler
parentdf0ca30838eeddbd34d7573cdbfaf88c56ad3e65 (diff)
drm/scheduler: Add job dependency trace.
During debug sessions I encountered a need to trace back a job dependecy a few steps back to the first failing job. This trace helpped me a lot. Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/scheduler')
-rw-r--r--drivers/gpu/drm/scheduler/gpu_scheduler.c8
-rw-r--r--drivers/gpu/drm/scheduler/gpu_scheduler_trace.h24
2 files changed, 30 insertions, 2 deletions
diff --git a/drivers/gpu/drm/scheduler/gpu_scheduler.c b/drivers/gpu/drm/scheduler/gpu_scheduler.c
index 61ea802ce492..08fa5b65acaf 100644
--- a/drivers/gpu/drm/scheduler/gpu_scheduler.c
+++ b/drivers/gpu/drm/scheduler/gpu_scheduler.c
@@ -522,9 +522,13 @@ drm_sched_entity_pop_job(struct drm_sched_entity *entity)
sched_job->sched = sched;
sched_job->s_fence->sched = sched;
- while ((entity->dependency = sched->ops->dependency(sched_job, entity)))
- if (drm_sched_entity_add_dependency_cb(entity))
+ while ((entity->dependency = sched->ops->dependency(sched_job, entity))) {
+ if (drm_sched_entity_add_dependency_cb(entity)) {
+
+ trace_drm_sched_job_wait_dep(sched_job, entity->dependency);
return NULL;
+ }
+ }
/* skip jobs from entity that marked guilty */
if (entity->guilty && atomic_read(entity->guilty))
diff --git a/drivers/gpu/drm/scheduler/gpu_scheduler_trace.h b/drivers/gpu/drm/scheduler/gpu_scheduler_trace.h
index 4998ad950a48..1626f3967130 100644
--- a/drivers/gpu/drm/scheduler/gpu_scheduler_trace.h
+++ b/drivers/gpu/drm/scheduler/gpu_scheduler_trace.h
@@ -74,6 +74,30 @@ TRACE_EVENT(drm_sched_process_job,
TP_printk("fence=%p signaled", __entry->fence)
);
+TRACE_EVENT(drm_sched_job_wait_dep,
+ TP_PROTO(struct drm_sched_job *sched_job, struct dma_fence *fence),
+ TP_ARGS(sched_job, fence),
+ TP_STRUCT__entry(
+ __field(const char *,name)
+ __field(uint64_t, id)
+ __field(struct dma_fence *, fence)
+ __field(uint64_t, ctx)
+ __field(unsigned, seqno)
+ ),
+
+ TP_fast_assign(
+ __entry->name = sched_job->sched->name;
+ __entry->id = sched_job->id;
+ __entry->fence = fence;
+ __entry->ctx = fence->context;
+ __entry->seqno = fence->seqno;
+ ),
+ TP_printk("job ring=%s, id=%llu, depends fence=%p, context=%llu, seq=%u",
+ __entry->name, __entry->id,
+ __entry->fence, __entry->ctx,
+ __entry->seqno)
+);
+
#endif
/* This part must be outside protection */