[PATCH 1/2] drm/amdgpu: Optimization of AMDGPU_BO_LIST_OP_CREATE (v2)

Christian König deathsimple at vodafone.de
Fri Jun 16 17:42:18 UTC 2017


Am 16.06.2017 um 07:03 schrieb Alex Xie:
> v2: Remove duplication of zeroing of bo list (Christian König)
>      Move idr_alloc function to end of ioctl (Christian König)
>      Call kfree bo_list when amdgpu_bo_list_set return error.
>      Combine the previous two patches into this patch.
>      Add amdgpu_bo_list_set function prototype.
>
> Signed-off-by: Alex Xie <AlexBin.Xie at amd.com>

Reviewed-by: Christian König <christian.koenig at amd.com>

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | 53 ++++++++++++++++-------------
>   1 file changed, 30 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
> index a664987..5af956f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
> @@ -35,33 +35,45 @@
>   #define AMDGPU_BO_LIST_MAX_PRIORITY	32u
>   #define AMDGPU_BO_LIST_NUM_BUCKETS	(AMDGPU_BO_LIST_MAX_PRIORITY + 1)
>   
> -static int amdgpu_bo_list_create(struct amdgpu_fpriv *fpriv,
> -				 struct amdgpu_bo_list **result,
> +static int amdgpu_bo_list_set(struct amdgpu_device *adev,
> +				     struct drm_file *filp,
> +				     struct amdgpu_bo_list *list,
> +				     struct drm_amdgpu_bo_list_entry *info,
> +				     unsigned num_entries);
> +
> +static int amdgpu_bo_list_create(struct amdgpu_device *adev,
> +				 struct drm_file *filp,
> +				 struct drm_amdgpu_bo_list_entry *info,
> +				 unsigned num_entries,
>   				 int *id)
>   {
>   	int r;
> +	struct amdgpu_fpriv *fpriv = filp->driver_priv;
> +	struct amdgpu_bo_list *list;
>   
> -	*result = kzalloc(sizeof(struct amdgpu_bo_list), GFP_KERNEL);
> -	if (!*result)
> +	list = kzalloc(sizeof(struct amdgpu_bo_list), GFP_KERNEL);
> +	if (!list)
>   		return -ENOMEM;
>   
> +	/* initialize bo list*/
> +	mutex_init(&list->lock);
> +
> +	r = amdgpu_bo_list_set(adev, filp, list, info, num_entries);
> +	if (r) {
> +		kfree(list);
> +		return r;
> +	}
> +
> +	/* idr alloc should be called only after initialization of bo list. */
>   	mutex_lock(&fpriv->bo_list_lock);
> -	r = idr_alloc(&fpriv->bo_list_handles, *result,
> -		      1, 0, GFP_KERNEL);
> +	r = idr_alloc(&fpriv->bo_list_handles, list, 1, 0, GFP_KERNEL);
> +	mutex_unlock(&fpriv->bo_list_lock);
>   	if (r < 0) {
> -		mutex_unlock(&fpriv->bo_list_lock);
> -		kfree(*result);
> +		kfree(list);
>   		return r;
>   	}
>   	*id = r;
>   
> -	mutex_init(&(*result)->lock);
> -	(*result)->num_entries = 0;
> -	(*result)->array = NULL;
> -
> -	mutex_lock(&(*result)->lock);
> -	mutex_unlock(&fpriv->bo_list_lock);
> -
>   	return 0;
>   }
>   
> @@ -77,6 +89,7 @@ static void amdgpu_bo_list_destroy(struct amdgpu_fpriv *fpriv, int id)
>   		mutex_unlock(&list->lock);
>   		amdgpu_bo_list_free(list);
>   	}
> +
>   	mutex_unlock(&fpriv->bo_list_lock);
>   }
>   
> @@ -273,16 +286,10 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,
>   
>   	switch (args->in.operation) {
>   	case AMDGPU_BO_LIST_OP_CREATE:
> -		r = amdgpu_bo_list_create(fpriv, &list, &handle);
> +		r = amdgpu_bo_list_create(adev, filp, info, args->in.bo_number,
> +					  &handle);
>   		if (r)
>   			goto error_free;
> -
> -		r = amdgpu_bo_list_set(adev, filp, list, info,
> -					      args->in.bo_number);
> -		amdgpu_bo_list_put(list);
> -		if (r)
> -			goto error_free;
> -
>   		break;
>   
>   	case AMDGPU_BO_LIST_OP_DESTROY:




More information about the amd-gfx mailing list