drm/sched: Trace dependencies for GPU jobs

We can't trace dependencies from drm_sched_job_add_dependency
because when it's called the job's fence is not available yet.

So instead each dependency is traced individually when
drm_sched_entity_push_job is used.

Tracing the dependencies allows tools to analyze the dependencies
between the jobs (previously it was only possible for fences
traced by drm_sched_job_wait_dep).

Signed-off-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Signed-off-by: Philipp Stanner <phasta@kernel.org>
Link: https://lore.kernel.org/r/20250526125505.2360-6-pierre-eric.pelloux-prayer@amd.com
pull/1279/head
Pierre-Eric Pelloux-Prayer 2025-05-26 14:54:47 +02:00 committed by Philipp Stanner
parent 8a98df7006
commit 76d97c870f
2 changed files with 31 additions and 0 deletions

View File

@ -87,6 +87,29 @@ TRACE_EVENT(drm_sched_process_job,
__entry->fence_context, __entry->fence_seqno) __entry->fence_context, __entry->fence_seqno)
); );
TRACE_EVENT(drm_sched_job_add_dep,
TP_PROTO(struct drm_sched_job *sched_job, struct dma_fence *fence),
TP_ARGS(sched_job, fence),
TP_STRUCT__entry(
__field(u64, fence_context)
__field(u64, fence_seqno)
__field(u64, id)
__field(u64, ctx)
__field(u64, seqno)
),
TP_fast_assign(
__entry->fence_context = sched_job->s_fence->finished.context;
__entry->fence_seqno = sched_job->s_fence->finished.seqno;
__entry->id = sched_job->id;
__entry->ctx = fence->context;
__entry->seqno = fence->seqno;
),
TP_printk("fence=%llu:%llu, id=%llu depends on fence=%llu:%llu",
__entry->fence_context, __entry->fence_seqno, __entry->id,
__entry->ctx, __entry->seqno)
);
TRACE_EVENT(drm_sched_job_wait_dep, TRACE_EVENT(drm_sched_job_wait_dep,
TP_PROTO(struct drm_sched_job *sched_job, struct dma_fence *fence), TP_PROTO(struct drm_sched_job *sched_job, struct dma_fence *fence),
TP_ARGS(sched_job, fence), TP_ARGS(sched_job, fence),

View File

@ -586,6 +586,14 @@ void drm_sched_entity_push_job(struct drm_sched_job *sched_job)
ktime_t submit_ts; ktime_t submit_ts;
trace_drm_sched_job(sched_job, entity); trace_drm_sched_job(sched_job, entity);
if (trace_drm_sched_job_add_dep_enabled()) {
struct dma_fence *entry;
unsigned long index;
xa_for_each(&sched_job->dependencies, index, entry)
trace_drm_sched_job_add_dep(sched_job, entry);
}
atomic_inc(entity->rq->sched->score); atomic_inc(entity->rq->sched->score);
WRITE_ONCE(entity->last_user, current->group_leader); WRITE_ONCE(entity->last_user, current->group_leader);