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 | |
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>
-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 | } |