diff options
| author | Chunming Zhou <David1.Zhou@amd.com> | 2015-11-11 01:56:00 -0500 |
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2015-11-16 11:05:57 -0500 |
| commit | 7034decf6a5b1ff778d83ff9d7ce1f0b404804e4 (patch) | |
| tree | 10a2cfe01d31baf7eb308edd267161016affbd3a /drivers | |
| parent | 5f2e816b2957fdde3c7d51d55db6751a980f4bea (diff) | |
drm/amdgpu: add command submission workflow tracepoint
OGL needs these tracepoints to investigate performance issue.
Change-Id: I5e58187d061253f7d665dfce8e4e163ba91d3e2b
Signed-off-by: Chunming Zhou <David1.Zhou@amd.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | 51 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/scheduler/gpu_sched_trace.h | 24 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | 1 |
5 files changed, 76 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index bf32096b8eb7..2ae73d5232dd 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
| @@ -888,7 +888,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
| 888 | ttm_eu_fence_buffer_objects(&parser.ticket, | 888 | ttm_eu_fence_buffer_objects(&parser.ticket, |
| 889 | &parser.validated, | 889 | &parser.validated, |
| 890 | &job->base.s_fence->base); | 890 | &job->base.s_fence->base); |
| 891 | 891 | trace_amdgpu_cs_ioctl(job); | |
| 892 | mutex_unlock(&job->job_lock); | 892 | mutex_unlock(&job->job_lock); |
| 893 | amdgpu_cs_parser_fini_late(&parser); | 893 | amdgpu_cs_parser_fini_late(&parser); |
| 894 | mutex_unlock(&vm->mutex); | 894 | mutex_unlock(&vm->mutex); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c index dcf4a8aca680..67f778f6eedb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/sched.h> | 26 | #include <linux/sched.h> |
| 27 | #include <drm/drmP.h> | 27 | #include <drm/drmP.h> |
| 28 | #include "amdgpu.h" | 28 | #include "amdgpu.h" |
| 29 | #include "amdgpu_trace.h" | ||
| 29 | 30 | ||
| 30 | static struct fence *amdgpu_sched_dependency(struct amd_sched_job *sched_job) | 31 | static struct fence *amdgpu_sched_dependency(struct amd_sched_job *sched_job) |
| 31 | { | 32 | { |
| @@ -45,6 +46,7 @@ static struct fence *amdgpu_sched_run_job(struct amd_sched_job *sched_job) | |||
| 45 | } | 46 | } |
| 46 | job = to_amdgpu_job(sched_job); | 47 | job = to_amdgpu_job(sched_job); |
| 47 | mutex_lock(&job->job_lock); | 48 | mutex_lock(&job->job_lock); |
| 49 | trace_amdgpu_sched_run_job(job); | ||
| 48 | r = amdgpu_ib_schedule(job->adev, | 50 | r = amdgpu_ib_schedule(job->adev, |
| 49 | job->num_ibs, | 51 | job->num_ibs, |
| 50 | job->ibs, | 52 | job->ibs, |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h index 26e2d50a6f64..8f9834ab1bd5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | |||
| @@ -48,6 +48,57 @@ TRACE_EVENT(amdgpu_cs, | |||
| 48 | __entry->fences) | 48 | __entry->fences) |
| 49 | ); | 49 | ); |
| 50 | 50 | ||
| 51 | TRACE_EVENT(amdgpu_cs_ioctl, | ||
| 52 | TP_PROTO(struct amdgpu_job *job), | ||
| 53 | TP_ARGS(job), | ||
| 54 | TP_STRUCT__entry( | ||
| 55 | __field(struct amdgpu_device *, adev) | ||
| 56 | __field(struct amd_sched_job *, sched_job) | ||
| 57 | __field(struct amdgpu_ib *, ib) | ||
| 58 | __field(struct fence *, fence) | ||
| 59 | __field(char *, ring_name) | ||
| 60 | __field(u32, num_ibs) | ||
| 61 | ), | ||
| 62 | |||
| 63 | TP_fast_assign( | ||
| 64 | __entry->adev = job->adev; | ||
| 65 | __entry->sched_job = &job->base; | ||
| 66 | __entry->ib = job->ibs; | ||
| 67 | __entry->fence = &job->base.s_fence->base; | ||
| 68 | __entry->ring_name = job->ibs[0].ring->name; | ||
| 69 | __entry->num_ibs = job->num_ibs; | ||
| 70 | ), | ||
| 71 | TP_printk("adev=%p, sched_job=%p, first ib=%p, sched fence=%p, ring name:%s, num_ibs:%u", | ||
| 72 | __entry->adev, __entry->sched_job, __entry->ib, | ||
| 73 | __entry->fence, __entry->ring_name, __entry->num_ibs) | ||
| 74 | ); | ||
| 75 | |||
| 76 | TRACE_EVENT(amdgpu_sched_run_job, | ||
| 77 | TP_PROTO(struct amdgpu_job *job), | ||
| 78 | TP_ARGS(job), | ||
| 79 | TP_STRUCT__entry( | ||
| 80 | __field(struct amdgpu_device *, adev) | ||
| 81 | __field(struct amd_sched_job *, sched_job) | ||
| 82 | __field(struct amdgpu_ib *, ib) | ||
| 83 | __field(struct fence *, fence) | ||
| 84 | __field(char *, ring_name) | ||
| 85 | __field(u32, num_ibs) | ||
| 86 | ), | ||
| 87 | |||
| 88 | TP_fast_assign( | ||
| 89 | __entry->adev = job->adev; | ||
| 90 | __entry->sched_job = &job->base; | ||
| 91 | __entry->ib = job->ibs; | ||
| 92 | __entry->fence = &job->base.s_fence->base; | ||
| 93 | __entry->ring_name = job->ibs[0].ring->name; | ||
| 94 | __entry->num_ibs = job->num_ibs; | ||
| 95 | ), | ||
| 96 | TP_printk("adev=%p, sched_job=%p, first ib=%p, sched fence=%p, ring name:%s, num_ibs:%u", | ||
| 97 | __entry->adev, __entry->sched_job, __entry->ib, | ||
| 98 | __entry->fence, __entry->ring_name, __entry->num_ibs) | ||
| 99 | ); | ||
| 100 | |||
| 101 | |||
| 51 | TRACE_EVENT(amdgpu_vm_grab_id, | 102 | TRACE_EVENT(amdgpu_vm_grab_id, |
| 52 | TP_PROTO(unsigned vmid, int ring), | 103 | TP_PROTO(unsigned vmid, int ring), |
| 53 | TP_ARGS(vmid, ring), | 104 | TP_ARGS(vmid, ring), |
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_sched_trace.h b/drivers/gpu/drm/amd/scheduler/gpu_sched_trace.h index 144f50acc971..c89dc777768f 100644 --- a/drivers/gpu/drm/amd/scheduler/gpu_sched_trace.h +++ b/drivers/gpu/drm/amd/scheduler/gpu_sched_trace.h | |||
| @@ -16,6 +16,8 @@ TRACE_EVENT(amd_sched_job, | |||
| 16 | TP_ARGS(sched_job), | 16 | TP_ARGS(sched_job), |
| 17 | TP_STRUCT__entry( | 17 | TP_STRUCT__entry( |
| 18 | __field(struct amd_sched_entity *, entity) | 18 | __field(struct amd_sched_entity *, entity) |
| 19 | __field(struct amd_sched_job *, sched_job) | ||
| 20 | __field(struct fence *, fence) | ||
| 19 | __field(const char *, name) | 21 | __field(const char *, name) |
| 20 | __field(u32, job_count) | 22 | __field(u32, job_count) |
| 21 | __field(int, hw_job_count) | 23 | __field(int, hw_job_count) |
| @@ -23,16 +25,32 @@ TRACE_EVENT(amd_sched_job, | |||
| 23 | 25 | ||
| 24 | TP_fast_assign( | 26 | TP_fast_assign( |
| 25 | __entry->entity = sched_job->s_entity; | 27 | __entry->entity = sched_job->s_entity; |
| 28 | __entry->sched_job = sched_job; | ||
| 29 | __entry->fence = &sched_job->s_fence->base; | ||
| 26 | __entry->name = sched_job->sched->name; | 30 | __entry->name = sched_job->sched->name; |
| 27 | __entry->job_count = kfifo_len( | 31 | __entry->job_count = kfifo_len( |
| 28 | &sched_job->s_entity->job_queue) / sizeof(sched_job); | 32 | &sched_job->s_entity->job_queue) / sizeof(sched_job); |
| 29 | __entry->hw_job_count = atomic_read( | 33 | __entry->hw_job_count = atomic_read( |
| 30 | &sched_job->sched->hw_rq_count); | 34 | &sched_job->sched->hw_rq_count); |
| 31 | ), | 35 | ), |
| 32 | TP_printk("entity=%p, ring=%s, job count:%u, hw job count:%d", | 36 | TP_printk("entity=%p, sched job=%p, fence=%p, ring=%s, job count:%u, hw job count:%d", |
| 33 | __entry->entity, __entry->name, __entry->job_count, | 37 | __entry->entity, __entry->sched_job, __entry->fence, __entry->name, |
| 34 | __entry->hw_job_count) | 38 | __entry->job_count, __entry->hw_job_count) |
| 35 | ); | 39 | ); |
| 40 | |||
| 41 | TRACE_EVENT(amd_sched_process_job, | ||
| 42 | TP_PROTO(struct amd_sched_fence *fence), | ||
| 43 | TP_ARGS(fence), | ||
| 44 | TP_STRUCT__entry( | ||
| 45 | __field(struct fence *, fence) | ||
| 46 | ), | ||
| 47 | |||
| 48 | TP_fast_assign( | ||
| 49 | __entry->fence = &fence->base; | ||
| 50 | ), | ||
| 51 | TP_printk("fence=%p signaled", __entry->fence) | ||
| 52 | ); | ||
| 53 | |||
| 36 | #endif | 54 | #endif |
| 37 | 55 | ||
| 38 | /* This part must be outside protection */ | 56 | /* This part must be outside protection */ |
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c index fe5b3c415f18..b8925fea577c 100644 --- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c +++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | |||
| @@ -346,6 +346,7 @@ static void amd_sched_process_job(struct fence *f, struct fence_cb *cb) | |||
| 346 | list_del_init(&s_fence->list); | 346 | list_del_init(&s_fence->list); |
| 347 | spin_unlock_irqrestore(&sched->fence_list_lock, flags); | 347 | spin_unlock_irqrestore(&sched->fence_list_lock, flags); |
| 348 | } | 348 | } |
| 349 | trace_amd_sched_process_job(s_fence); | ||
| 349 | fence_put(&s_fence->base); | 350 | fence_put(&s_fence->base); |
| 350 | wake_up_interruptible(&sched->wake_up_worker); | 351 | wake_up_interruptible(&sched->wake_up_worker); |
| 351 | } | 352 | } |
