aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index adc6a43e2333..dd734970e167 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -1194,26 +1194,24 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
1194 1194
1195 int r; 1195 int r;
1196 1196
1197 job = p->job;
1198 p->job = NULL;
1199
1200 r = drm_sched_job_init(&job->base, entity, p->filp);
1201 if (r)
1202 goto error_unlock;
1203
1204 /* No memory allocation is allowed while holding the mn lock */
1197 amdgpu_mn_lock(p->mn); 1205 amdgpu_mn_lock(p->mn);
1198 amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) { 1206 amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) {
1199 struct amdgpu_bo *bo = e->robj; 1207 struct amdgpu_bo *bo = e->robj;
1200 1208
1201 if (amdgpu_ttm_tt_userptr_needs_pages(bo->tbo.ttm)) { 1209 if (amdgpu_ttm_tt_userptr_needs_pages(bo->tbo.ttm)) {
1202 amdgpu_mn_unlock(p->mn); 1210 r = -ERESTARTSYS;
1203 return -ERESTARTSYS; 1211 goto error_abort;
1204 } 1212 }
1205 } 1213 }
1206 1214
1207 job = p->job;
1208 p->job = NULL;
1209
1210 r = drm_sched_job_init(&job->base, entity, p->filp);
1211 if (r) {
1212 amdgpu_job_free(job);
1213 amdgpu_mn_unlock(p->mn);
1214 return r;
1215 }
1216
1217 job->owner = p->filp; 1215 job->owner = p->filp;
1218 p->fence = dma_fence_get(&job->base.s_fence->finished); 1216 p->fence = dma_fence_get(&job->base.s_fence->finished);
1219 1217
@@ -1243,6 +1241,15 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
1243 amdgpu_mn_unlock(p->mn); 1241 amdgpu_mn_unlock(p->mn);
1244 1242
1245 return 0; 1243 return 0;
1244
1245error_abort:
1246 dma_fence_put(&job->base.s_fence->finished);
1247 job->base.s_fence = NULL;
1248
1249error_unlock:
1250 amdgpu_job_free(job);
1251 amdgpu_mn_unlock(p->mn);
1252 return r;
1246} 1253}
1247 1254
1248int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) 1255int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)