[PATCH 2/9] drm/amdgpu: fix and cleanup VM ready check

zhoucm1 david1.zhou at amd.com
Mon Aug 28 04:09:32 UTC 2017



On 2017年08月25日 17:38, Christian König wrote:
> From: Christian König <christian.koenig at amd.com>
>
> Stop checking the mapped BO itself, cause that one is
> certainly not a page table.
>
> Additional to that move the code into amdgpu_vm.c
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
Reviewed-by: Chunming Zhou <david1.zhou at amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 33 ++-------------------------------
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c  | 32 ++++++++++++++++++++++++++++++++
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h  |  1 +
>   3 files changed, 35 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index 7171968..9b1b6bd 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> @@ -127,35 +127,6 @@ int amdgpu_gem_object_open(struct drm_gem_object *obj,
>   	return 0;
>   }
>   
> -static int amdgpu_gem_vm_check(void *param, struct amdgpu_bo *bo)
> -{
> -	/* if anything is swapped out don't swap it in here,
> -	   just abort and wait for the next CS */
> -	if (!amdgpu_bo_gpu_accessible(bo))
> -		return -ERESTARTSYS;
> -
> -	if (bo->shadow && !amdgpu_bo_gpu_accessible(bo->shadow))
> -		return -ERESTARTSYS;
> -
> -	return 0;
> -}
> -
> -static bool amdgpu_gem_vm_ready(struct amdgpu_device *adev,
> -				struct amdgpu_vm *vm,
> -				struct list_head *list)
> -{
> -	struct ttm_validate_buffer *entry;
> -
> -	list_for_each_entry(entry, list, head) {
> -		struct amdgpu_bo *bo =
> -			container_of(entry->bo, struct amdgpu_bo, tbo);
> -		if (amdgpu_gem_vm_check(NULL, bo))
> -			return false;
> -	}
> -
> -	return !amdgpu_vm_validate_pt_bos(adev, vm, amdgpu_gem_vm_check, NULL);
> -}
> -
>   void amdgpu_gem_object_close(struct drm_gem_object *obj,
>   			     struct drm_file *file_priv)
>   {
> @@ -189,7 +160,7 @@ void amdgpu_gem_object_close(struct drm_gem_object *obj,
>   	if (bo_va && --bo_va->ref_count == 0) {
>   		amdgpu_vm_bo_rmv(adev, bo_va);
>   
> -		if (amdgpu_gem_vm_ready(adev, vm, &list)) {
> +		if (amdgpu_vm_ready(adev, vm)) {
>   			struct dma_fence *fence = NULL;
>   
>   			r = amdgpu_vm_clear_freed(adev, vm, &fence);
> @@ -513,7 +484,7 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev,
>   {
>   	int r = -ERESTARTSYS;
>   
> -	if (!amdgpu_gem_vm_ready(adev, vm, list))
> +	if (!amdgpu_vm_ready(adev, vm))
>   		goto error;
>   
>   	r = amdgpu_vm_update_directories(adev, vm);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index c77689f..f621dba 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -232,6 +232,38 @@ int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm,
>   }
>   
>   /**
> + * amdgpu_vm_check - helper for amdgpu_vm_ready
> + */
> +static int amdgpu_vm_check(void *param, struct amdgpu_bo *bo)
> +{
> +	/* if anything is swapped out don't swap it in here,
> +	   just abort and wait for the next CS */
> +	if (!amdgpu_bo_gpu_accessible(bo))
> +		return -ERESTARTSYS;
> +
> +	if (bo->shadow && !amdgpu_bo_gpu_accessible(bo->shadow))
> +		return -ERESTARTSYS;
> +
> +	return 0;
> +}
> +
> +/**
> + * amdgpu_vm_ready - check VM is ready for updates
> + *
> + * @adev: amdgpu device
> + * @vm: VM to check
> + *
> + * Check if all VM PDs/PTs are ready for updates
> + */
> +bool amdgpu_vm_ready(struct amdgpu_device *adev, struct amdgpu_vm *vm)
> +{
> +	if (amdgpu_vm_check(NULL, vm->root.bo))
> +		return false;
> +
> +	return !amdgpu_vm_validate_pt_bos(adev, vm, amdgpu_vm_check, NULL);
> +}
> +
> +/**
>    * amdgpu_vm_alloc_levels - allocate the PD/PT levels
>    *
>    * @adev: amdgpu_device pointer
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> index ba6691b..9347d28 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> @@ -225,6 +225,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm);
>   void amdgpu_vm_get_pd_bo(struct amdgpu_vm *vm,
>   			 struct list_head *validated,
>   			 struct amdgpu_bo_list_entry *entry);
> +bool amdgpu_vm_ready(struct amdgpu_device *adev, struct amdgpu_vm *vm);
>   int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm,
>   			      int (*callback)(void *p, struct amdgpu_bo *bo),
>   			      void *param);



More information about the amd-gfx mailing list