|
@@ -1194,26 +1194,24 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
|
|
|
|
|
|
int r;
|
|
|
|
|
|
+ job = p->job;
|
|
|
+ p->job = NULL;
|
|
|
+
|
|
|
+ r = drm_sched_job_init(&job->base, entity, p->filp);
|
|
|
+ if (r)
|
|
|
+ goto error_unlock;
|
|
|
+
|
|
|
+ /* No memory allocation is allowed while holding the mn lock */
|
|
|
amdgpu_mn_lock(p->mn);
|
|
|
amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) {
|
|
|
struct amdgpu_bo *bo = e->robj;
|
|
|
|
|
|
if (amdgpu_ttm_tt_userptr_needs_pages(bo->tbo.ttm)) {
|
|
|
- amdgpu_mn_unlock(p->mn);
|
|
|
- return -ERESTARTSYS;
|
|
|
+ r = -ERESTARTSYS;
|
|
|
+ goto error_abort;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- job = p->job;
|
|
|
- p->job = NULL;
|
|
|
-
|
|
|
- r = drm_sched_job_init(&job->base, entity, p->filp);
|
|
|
- if (r) {
|
|
|
- amdgpu_job_free(job);
|
|
|
- amdgpu_mn_unlock(p->mn);
|
|
|
- return r;
|
|
|
- }
|
|
|
-
|
|
|
job->owner = p->filp;
|
|
|
p->fence = dma_fence_get(&job->base.s_fence->finished);
|
|
|
|
|
@@ -1243,6 +1241,15 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
|
|
|
amdgpu_mn_unlock(p->mn);
|
|
|
|
|
|
return 0;
|
|
|
+
|
|
|
+error_abort:
|
|
|
+ dma_fence_put(&job->base.s_fence->finished);
|
|
|
+ job->base.s_fence = NULL;
|
|
|
+
|
|
|
+error_unlock:
|
|
|
+ amdgpu_job_free(job);
|
|
|
+ amdgpu_mn_unlock(p->mn);
|
|
|
+ return r;
|
|
|
}
|
|
|
|
|
|
int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
|