diff options
author | Chunming Zhou <David1.Zhou@amd.com> | 2017-05-09 03:50:22 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-05-24 17:40:35 -0400 |
commit | df83d1ebc9e304fa3ba4bf79dba76418789a77cf (patch) | |
tree | 150b6da48a391edd59e3f74f1da6f948c3fbac51 /drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | |
parent | a022c54e60222fa192004ed951a658cba7262784 (diff) |
drm/amdgpu: add sched sync for amdgpu job v2
this is an improvement for previous patch, the sched_sync is to store fence
that could be skipped as scheduled, when job is executed, we didn't need
pipeline_sync if all fences in sched_sync are signalled, otherwise insert
pipeline_sync still.
v2: handle error when adding fence to sync failed.
Signed-off-by: Chunming Zhou <David1.Zhou@amd.com>
Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com> (v1)
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_job.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c index 7570f2439a11..4af92649c4a4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | |||
@@ -60,6 +60,7 @@ int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs, | |||
60 | (*job)->need_pipeline_sync = false; | 60 | (*job)->need_pipeline_sync = false; |
61 | 61 | ||
62 | amdgpu_sync_create(&(*job)->sync); | 62 | amdgpu_sync_create(&(*job)->sync); |
63 | amdgpu_sync_create(&(*job)->sched_sync); | ||
63 | 64 | ||
64 | return 0; | 65 | return 0; |
65 | } | 66 | } |
@@ -98,6 +99,7 @@ static void amdgpu_job_free_cb(struct amd_sched_job *s_job) | |||
98 | 99 | ||
99 | dma_fence_put(job->fence); | 100 | dma_fence_put(job->fence); |
100 | amdgpu_sync_free(&job->sync); | 101 | amdgpu_sync_free(&job->sync); |
102 | amdgpu_sync_free(&job->sched_sync); | ||
101 | kfree(job); | 103 | kfree(job); |
102 | } | 104 | } |
103 | 105 | ||
@@ -107,6 +109,7 @@ void amdgpu_job_free(struct amdgpu_job *job) | |||
107 | 109 | ||
108 | dma_fence_put(job->fence); | 110 | dma_fence_put(job->fence); |
109 | amdgpu_sync_free(&job->sync); | 111 | amdgpu_sync_free(&job->sync); |
112 | amdgpu_sync_free(&job->sched_sync); | ||
110 | kfree(job); | 113 | kfree(job); |
111 | } | 114 | } |
112 | 115 | ||
@@ -139,10 +142,10 @@ static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job) | |||
139 | struct amdgpu_vm *vm = job->vm; | 142 | struct amdgpu_vm *vm = job->vm; |
140 | 143 | ||
141 | struct dma_fence *fence = amdgpu_sync_get_fence(&job->sync); | 144 | struct dma_fence *fence = amdgpu_sync_get_fence(&job->sync); |
145 | int r; | ||
142 | 146 | ||
143 | while (fence == NULL && vm && !job->vm_id) { | 147 | while (fence == NULL && vm && !job->vm_id) { |
144 | struct amdgpu_ring *ring = job->ring; | 148 | struct amdgpu_ring *ring = job->ring; |
145 | int r; | ||
146 | 149 | ||
147 | r = amdgpu_vm_grab_id(vm, ring, &job->sync, | 150 | r = amdgpu_vm_grab_id(vm, ring, &job->sync, |
148 | &job->base.s_fence->finished, | 151 | &job->base.s_fence->finished, |
@@ -153,9 +156,11 @@ static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job) | |||
153 | fence = amdgpu_sync_get_fence(&job->sync); | 156 | fence = amdgpu_sync_get_fence(&job->sync); |
154 | } | 157 | } |
155 | 158 | ||
156 | if (amd_sched_dependency_optimized(fence, sched_job->s_entity)) | 159 | if (amd_sched_dependency_optimized(fence, sched_job->s_entity)) { |
157 | job->need_pipeline_sync = true; | 160 | r = amdgpu_sync_fence(job->adev, &job->sched_sync, fence); |
158 | 161 | if (r) | |
162 | DRM_ERROR("Error adding fence to sync (%d)\n", r); | ||
163 | } | ||
159 | return fence; | 164 | return fence; |
160 | } | 165 | } |
161 | 166 | ||