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.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
index 83d13431cbdd..4f2b5acc8743 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
@@ -61,6 +61,7 @@ int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
61 (*job)->vm = vm; 61 (*job)->vm = vm;
62 (*job)->ibs = (void *)&(*job)[1]; 62 (*job)->ibs = (void *)&(*job)[1];
63 (*job)->num_ibs = num_ibs; 63 (*job)->num_ibs = num_ibs;
64 (*job)->vram_lost_counter = atomic_read(&adev->vram_lost_counter);
64 65
65 amdgpu_sync_create(&(*job)->sync); 66 amdgpu_sync_create(&(*job)->sync);
66 amdgpu_sync_create(&(*job)->dep_sync); 67 amdgpu_sync_create(&(*job)->dep_sync);
@@ -180,8 +181,8 @@ static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job)
180static struct dma_fence *amdgpu_job_run(struct amd_sched_job *sched_job) 181static struct dma_fence *amdgpu_job_run(struct amd_sched_job *sched_job)
181{ 182{
182 struct dma_fence *fence = NULL; 183 struct dma_fence *fence = NULL;
184 struct amdgpu_device *adev;
183 struct amdgpu_job *job; 185 struct amdgpu_job *job;
184 struct amdgpu_fpriv *fpriv = NULL;
185 int r; 186 int r;
186 187
187 if (!sched_job) { 188 if (!sched_job) {
@@ -189,17 +190,17 @@ static struct dma_fence *amdgpu_job_run(struct amd_sched_job *sched_job)
189 return NULL; 190 return NULL;
190 } 191 }
191 job = to_amdgpu_job(sched_job); 192 job = to_amdgpu_job(sched_job);
193 adev = job->adev;
192 194
193 BUG_ON(amdgpu_sync_peek_fence(&job->sync, NULL)); 195 BUG_ON(amdgpu_sync_peek_fence(&job->sync, NULL));
194 196
195 trace_amdgpu_sched_run_job(job); 197 trace_amdgpu_sched_run_job(job);
196 if (job->vm)
197 fpriv = container_of(job->vm, struct amdgpu_fpriv, vm);
198 /* skip ib schedule when vram is lost */ 198 /* skip ib schedule when vram is lost */
199 if (fpriv && amdgpu_kms_vram_lost(job->adev, fpriv)) 199 if (job->vram_lost_counter != atomic_read(&adev->vram_lost_counter)) {
200 DRM_ERROR("Skip scheduling IBs!\n"); 200 DRM_ERROR("Skip scheduling IBs!\n");
201 else { 201 } else {
202 r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs, job, &fence); 202 r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs, job,
203 &fence);
203 if (r) 204 if (r)
204 DRM_ERROR("Error scheduling IBs (%d)\n", r); 205 DRM_ERROR("Error scheduling IBs (%d)\n", r);
205 } 206 }