aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_job.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_job.c52
1 files changed, 25 insertions, 27 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
index 0cfc68db575b..bdc210ac74f8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
@@ -37,10 +37,7 @@ static void amdgpu_job_timedout(struct amd_sched_job *s_job)
37 atomic_read(&job->ring->fence_drv.last_seq), 37 atomic_read(&job->ring->fence_drv.last_seq),
38 job->ring->fence_drv.sync_seq); 38 job->ring->fence_drv.sync_seq);
39 39
40 if (amdgpu_sriov_vf(job->adev)) 40 amdgpu_gpu_recover(job->adev, job);
41 amdgpu_sriov_gpu_reset(job->adev, job);
42 else
43 amdgpu_gpu_reset(job->adev);
44} 41}
45 42
46int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs, 43int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
@@ -63,7 +60,6 @@ int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
63 (*job)->num_ibs = num_ibs; 60 (*job)->num_ibs = num_ibs;
64 61
65 amdgpu_sync_create(&(*job)->sync); 62 amdgpu_sync_create(&(*job)->sync);
66 amdgpu_sync_create(&(*job)->dep_sync);
67 amdgpu_sync_create(&(*job)->sched_sync); 63 amdgpu_sync_create(&(*job)->sched_sync);
68 (*job)->vram_lost_counter = atomic_read(&adev->vram_lost_counter); 64 (*job)->vram_lost_counter = atomic_read(&adev->vram_lost_counter);
69 65
@@ -104,10 +100,9 @@ static void amdgpu_job_free_cb(struct amd_sched_job *s_job)
104{ 100{
105 struct amdgpu_job *job = container_of(s_job, struct amdgpu_job, base); 101 struct amdgpu_job *job = container_of(s_job, struct amdgpu_job, base);
106 102
107 amdgpu_ring_priority_put(job->ring, amd_sched_get_job_priority(s_job)); 103 amdgpu_ring_priority_put(job->ring, s_job->s_priority);
108 dma_fence_put(job->fence); 104 dma_fence_put(job->fence);
109 amdgpu_sync_free(&job->sync); 105 amdgpu_sync_free(&job->sync);
110 amdgpu_sync_free(&job->dep_sync);
111 amdgpu_sync_free(&job->sched_sync); 106 amdgpu_sync_free(&job->sched_sync);
112 kfree(job); 107 kfree(job);
113} 108}
@@ -118,7 +113,6 @@ void amdgpu_job_free(struct amdgpu_job *job)
118 113
119 dma_fence_put(job->fence); 114 dma_fence_put(job->fence);
120 amdgpu_sync_free(&job->sync); 115 amdgpu_sync_free(&job->sync);
121 amdgpu_sync_free(&job->dep_sync);
122 amdgpu_sync_free(&job->sched_sync); 116 amdgpu_sync_free(&job->sched_sync);
123 kfree(job); 117 kfree(job);
124} 118}
@@ -141,28 +135,29 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
141 job->fence_ctx = entity->fence_context; 135 job->fence_ctx = entity->fence_context;
142 *f = dma_fence_get(&job->base.s_fence->finished); 136 *f = dma_fence_get(&job->base.s_fence->finished);
143 amdgpu_job_free_resources(job); 137 amdgpu_job_free_resources(job);
144 amdgpu_ring_priority_get(job->ring, 138 amdgpu_ring_priority_get(job->ring, job->base.s_priority);
145 amd_sched_get_job_priority(&job->base)); 139 amd_sched_entity_push_job(&job->base, entity);
146 amd_sched_entity_push_job(&job->base);
147 140
148 return 0; 141 return 0;
149} 142}
150 143
151static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job) 144static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job,
145 struct amd_sched_entity *s_entity)
152{ 146{
153 struct amdgpu_job *job = to_amdgpu_job(sched_job); 147 struct amdgpu_job *job = to_amdgpu_job(sched_job);
154 struct amdgpu_vm *vm = job->vm; 148 struct amdgpu_vm *vm = job->vm;
155 149 bool explicit = false;
156 struct dma_fence *fence = amdgpu_sync_get_fence(&job->dep_sync);
157 int r; 150 int r;
158 151 struct dma_fence *fence = amdgpu_sync_get_fence(&job->sync, &explicit);
159 if (amd_sched_dependency_optimized(fence, sched_job->s_entity)) { 152
160 r = amdgpu_sync_fence(job->adev, &job->sched_sync, fence); 153 if (fence && explicit) {
161 if (r) 154 if (amd_sched_dependency_optimized(fence, s_entity)) {
162 DRM_ERROR("Error adding fence to sync (%d)\n", r); 155 r = amdgpu_sync_fence(job->adev, &job->sched_sync, fence, false);
156 if (r)
157 DRM_ERROR("Error adding fence to sync (%d)\n", r);
158 }
163 } 159 }
164 if (!fence) 160
165 fence = amdgpu_sync_get_fence(&job->sync);
166 while (fence == NULL && vm && !job->vm_id) { 161 while (fence == NULL && vm && !job->vm_id) {
167 struct amdgpu_ring *ring = job->ring; 162 struct amdgpu_ring *ring = job->ring;
168 163
@@ -172,7 +167,7 @@ static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job)
172 if (r) 167 if (r)
173 DRM_ERROR("Error getting VM ID (%d)\n", r); 168 DRM_ERROR("Error getting VM ID (%d)\n", r);
174 169
175 fence = amdgpu_sync_get_fence(&job->sync); 170 fence = amdgpu_sync_get_fence(&job->sync, NULL);
176 } 171 }
177 172
178 return fence; 173 return fence;
@@ -180,7 +175,7 @@ static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job)
180 175
181static struct dma_fence *amdgpu_job_run(struct amd_sched_job *sched_job) 176static struct dma_fence *amdgpu_job_run(struct amd_sched_job *sched_job)
182{ 177{
183 struct dma_fence *fence = NULL; 178 struct dma_fence *fence = NULL, *finished;
184 struct amdgpu_device *adev; 179 struct amdgpu_device *adev;
185 struct amdgpu_job *job; 180 struct amdgpu_job *job;
186 int r; 181 int r;
@@ -190,15 +185,18 @@ static struct dma_fence *amdgpu_job_run(struct amd_sched_job *sched_job)
190 return NULL; 185 return NULL;
191 } 186 }
192 job = to_amdgpu_job(sched_job); 187 job = to_amdgpu_job(sched_job);
188 finished = &job->base.s_fence->finished;
193 adev = job->adev; 189 adev = job->adev;
194 190
195 BUG_ON(amdgpu_sync_peek_fence(&job->sync, NULL)); 191 BUG_ON(amdgpu_sync_peek_fence(&job->sync, NULL));
196 192
197 trace_amdgpu_sched_run_job(job); 193 trace_amdgpu_sched_run_job(job);
198 /* skip ib schedule when vram is lost */ 194
199 if (job->vram_lost_counter != atomic_read(&adev->vram_lost_counter)) { 195 if (job->vram_lost_counter != atomic_read(&adev->vram_lost_counter))
200 dma_fence_set_error(&job->base.s_fence->finished, -ECANCELED); 196 dma_fence_set_error(finished, -ECANCELED);/* skip IB as well if VRAM lost */
201 DRM_ERROR("Skip scheduling IBs!\n"); 197
198 if (finished->error < 0) {
199 DRM_INFO("Skip scheduling IBs!\n");
202 } else { 200 } else {
203 r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs, job, 201 r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs, job,
204 &fence); 202 &fence);