[PATCH] drm/amdgpu: add proper error handling to amdgpu_bo_list_get

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Jul 27, 2018 at 03:39:01PM +0200, Christian König wrote:
> Otherwise we silently don't use a BO list when the handle is invalid.
> 
> Signed-off-by: Christian König <christian.koenig at amd.com>

Reviewed-by: Huang Rui <ray.huang at amd.com>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu.h         |  4 ++--
>  drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | 28 ++++++++++------------------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c      | 11 ++++++++---
>  3 files changed, 20 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index 13aaa118aca4..4cd20e722d70 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -713,8 +713,8 @@ struct amdgpu_bo_list {
>  	struct amdgpu_bo_list_entry *array;
>  };
>  
> -struct amdgpu_bo_list *
> -amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id);
> +int amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id,
> +		       struct amdgpu_bo_list **result);
>  void amdgpu_bo_list_get_list(struct amdgpu_bo_list *list,
>  			     struct list_head *validated);
>  void amdgpu_bo_list_put(struct amdgpu_bo_list *list);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
> index 7679c068c89a..944868e47119 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
> @@ -180,27 +180,20 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,
>  	return r;
>  }
>  
> -struct amdgpu_bo_list *
> -amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id)
> +int amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id,
> +		       struct amdgpu_bo_list **result)
>  {
> -	struct amdgpu_bo_list *result;
> -
>  	rcu_read_lock();
> -	result = idr_find(&fpriv->bo_list_handles, id);
> +	*result = idr_find(&fpriv->bo_list_handles, id);
>  
> -	if (result) {
> -		if (kref_get_unless_zero(&result->refcount)) {
> -			rcu_read_unlock();
> -			mutex_lock(&result->lock);
> -		} else {
> -			rcu_read_unlock();
> -			result = NULL;
> -		}
> -	} else {
> +	if (*result && kref_get_unless_zero(&(*result)->refcount)) {
>  		rcu_read_unlock();
> +		mutex_lock(&(*result)->lock);
> +		return 0;
>  	}
>  
> -	return result;
> +	rcu_read_unlock();
> +	return -ENOENT;
>  }
>  
>  void amdgpu_bo_list_get_list(struct amdgpu_bo_list *list,
> @@ -335,9 +328,8 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,
>  		break;
>  
>  	case AMDGPU_BO_LIST_OP_UPDATE:
> -		r = -ENOENT;
> -		list = amdgpu_bo_list_get(fpriv, handle);
> -		if (!list)
> +		r = amdgpu_bo_list_get(fpriv, handle, &list);
> +		if (r)
>  			goto error_free;
>  
>  		r = amdgpu_bo_list_set(adev, filp, list, info,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> index 533b2e7656c0..8a49c3b97bd4 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> @@ -572,11 +572,16 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
>  	INIT_LIST_HEAD(&p->validated);
>  
>  	/* p->bo_list could already be assigned if AMDGPU_CHUNK_ID_BO_HANDLES is present */
> -	if (!p->bo_list)
> -		p->bo_list = amdgpu_bo_list_get(fpriv, cs->in.bo_list_handle);
> -	else
> +	if (p->bo_list) {
>  		mutex_lock(&p->bo_list->lock);
>  
> +	} else if (cs->in.bo_list_handle) {
> +		r = amdgpu_bo_list_get(fpriv, cs->in.bo_list_handle,
> +				       &p->bo_list);
> +		if (r)
> +			return r;
> +	}
> +
>  	if (p->bo_list) {
>  		amdgpu_bo_list_get_list(p->bo_list, &p->validated);
>  		if (p->bo_list->first_userptr != p->bo_list->num_entries)
> -- 
> 2.14.1
> 
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux