drm/scheduler: Add job dependency trace.
authorAndrey Grodzovsky <andrey.grodzovsky@amd.com>
Tue, 31 Jul 2018 14:48:52 +0000 (10:48 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 27 Aug 2018 16:09:46 +0000 (11:09 -0500)
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>
drivers/gpu/drm/scheduler/gpu_scheduler.c
drivers/gpu/drm/scheduler/gpu_scheduler_trace.h

index 61ea802ce49290a988a10d9f064e308d23bad3ba..08fa5b65acaf4239fbe49b181698e59b9f915a3f 100644 (file)
@@ -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))
index 4998ad950a484d2d0d55309cffdb3858d0940c7a..1626f396713029eb213c9d83d434b08ce1509aa8 100644 (file)
@@ -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 */