Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4a2de54d authored by Christian König's avatar Christian König Committed by Alex Deucher
Browse files

drm/amdgpu: fix holding mn_lock while allocating memory



We can't hold the mn_lock while allocating memory.

Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Acked-by: default avatarChunming Zhou <david1.zhou@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 72ef23de
Loading
Loading
Loading
Loading
+19 −12
Original line number Original line Diff line number Diff line
@@ -1203,26 +1203,24 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,


	int r;
	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_mn_lock(p->mn);
	amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) {
	amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) {
		struct amdgpu_bo *bo = e->robj;
		struct amdgpu_bo *bo = e->robj;


		if (amdgpu_ttm_tt_userptr_needs_pages(bo->tbo.ttm)) {
		if (amdgpu_ttm_tt_userptr_needs_pages(bo->tbo.ttm)) {
			amdgpu_mn_unlock(p->mn);
			r = -ERESTARTSYS;
			return -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;
	job->owner = p->filp;
	p->fence = dma_fence_get(&job->base.s_fence->finished);
	p->fence = dma_fence_get(&job->base.s_fence->finished);


@@ -1260,6 +1258,15 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
	amdgpu_mn_unlock(p->mn);
	amdgpu_mn_unlock(p->mn);


	return 0;
	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)
int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)