diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 21 | 
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 970b065e9a6b..d0d0ea565e3d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c @@ -128,6 +128,8 @@ static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, union drm_amdgpu_cs  		goto free_chunk;  	} +	mutex_lock(&p->ctx->lock); +  	/* skip guilty context job */  	if (atomic_read(&p->ctx->guilty) == 1) {  		ret = -ECANCELED; @@ -709,6 +711,7 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error,  	dma_fence_put(parser->fence);  	if (parser->ctx) { +		mutex_unlock(&parser->ctx->lock);  		amdgpu_ctx_put(parser->ctx);  	}  	if (parser->bo_list) @@ -1157,6 +1160,9 @@ static int amdgpu_cs_dependencies(struct amdgpu_device *adev,  {  	int i, r; +	/* TODO: Investigate why we still need the context lock */ +	mutex_unlock(&p->ctx->lock); +  	for (i = 0; i < p->nchunks; ++i) {  		struct amdgpu_cs_chunk *chunk; @@ -1167,32 +1173,34 @@ static int amdgpu_cs_dependencies(struct amdgpu_device *adev,  		case AMDGPU_CHUNK_ID_SCHEDULED_DEPENDENCIES:  			r = amdgpu_cs_process_fence_dep(p, chunk);  			if (r) -				return r; +				goto out;  			break;  		case AMDGPU_CHUNK_ID_SYNCOBJ_IN:  			r = amdgpu_cs_process_syncobj_in_dep(p, chunk);  			if (r) -				return r; +				goto out;  			break;  		case AMDGPU_CHUNK_ID_SYNCOBJ_OUT:  			r = amdgpu_cs_process_syncobj_out_dep(p, chunk);  			if (r) -				return r; +				goto out;  			break;  		case AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_WAIT:  			r = amdgpu_cs_process_syncobj_timeline_in_dep(p, chunk);  			if (r) -				return r; +				goto out;  			break;  		case AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_SIGNAL:  			r = amdgpu_cs_process_syncobj_timeline_out_dep(p, chunk);  			if (r) -				return r; +				goto out;  			break;  		}  	} -	return 0; +out: +	mutex_lock(&p->ctx->lock); +	return r;  }  static void amdgpu_cs_post_dependencies(struct amdgpu_cs_parser *p) @@ -1368,6 +1376,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)  		goto out;  	r = amdgpu_cs_submit(&parser, cs); +  out:  	amdgpu_cs_parser_fini(&parser, r, reserved_buffers);  | 
