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 | |
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>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 13 |
3 files changed, 17 insertions, 5 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index ea8ad69fa65d..37bd00345ae0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
@@ -1124,6 +1124,7 @@ struct amdgpu_job { | |||
1124 | struct amdgpu_vm *vm; | 1124 | struct amdgpu_vm *vm; |
1125 | struct amdgpu_ring *ring; | 1125 | struct amdgpu_ring *ring; |
1126 | struct amdgpu_sync sync; | 1126 | struct amdgpu_sync sync; |
1127 | struct amdgpu_sync sched_sync; | ||
1127 | struct amdgpu_ib *ibs; | 1128 | struct amdgpu_ib *ibs; |
1128 | struct dma_fence *fence; /* the hw fence */ | 1129 | struct dma_fence *fence; /* the hw fence */ |
1129 | uint32_t preamble_status; | 1130 | uint32_t preamble_status; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c index 53d0d21ee26d..631a9f77b973 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | |||
@@ -121,6 +121,7 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, | |||
121 | { | 121 | { |
122 | struct amdgpu_device *adev = ring->adev; | 122 | struct amdgpu_device *adev = ring->adev; |
123 | struct amdgpu_ib *ib = &ibs[0]; | 123 | struct amdgpu_ib *ib = &ibs[0]; |
124 | struct dma_fence *tmp; | ||
124 | bool skip_preamble, need_ctx_switch; | 125 | bool skip_preamble, need_ctx_switch; |
125 | unsigned patch_offset = ~0; | 126 | unsigned patch_offset = ~0; |
126 | struct amdgpu_vm *vm; | 127 | struct amdgpu_vm *vm; |
@@ -160,8 +161,13 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, | |||
160 | dev_err(adev->dev, "scheduling IB failed (%d).\n", r); | 161 | dev_err(adev->dev, "scheduling IB failed (%d).\n", r); |
161 | return r; | 162 | return r; |
162 | } | 163 | } |
163 | if (ring->funcs->emit_pipeline_sync && job && job->need_pipeline_sync) | 164 | |
165 | if (ring->funcs->emit_pipeline_sync && job && | ||
166 | (tmp = amdgpu_sync_get_fence(&job->sched_sync))) { | ||
167 | job->need_pipeline_sync = true; | ||
164 | amdgpu_ring_emit_pipeline_sync(ring); | 168 | amdgpu_ring_emit_pipeline_sync(ring); |
169 | dma_fence_put(tmp); | ||
170 | } | ||
165 | 171 | ||
166 | if (vm) { | 172 | if (vm) { |
167 | r = amdgpu_vm_flush(ring, job); | 173 | r = amdgpu_vm_flush(ring, job); |
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 | ||