[PATCH 1/3] drm/amdgpu: move VM eviction decision into amdgpu_vm.c

Felix Kuehling felix.kuehling at amd.com
Thu Dec 5 01:31:44 UTC 2019


On 2019-12-04 10:38 a.m., Christian König wrote:
> When a page tables needs to be evicted the VM code should
> decide if that is possible or not.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c |  5 +----
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c  | 22 ++++++++++++++++++++++
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h  |  1 +
>   3 files changed, 24 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index 19ffe00d9072..81f6764f1ba6 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -1489,11 +1489,8 @@ static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo,
>   	struct dma_fence *f;
>   	int i;
>   
> -	/* Don't evict VM page tables while they are busy, otherwise we can't
> -	 * cleanly handle page faults.
> -	 */
>   	if (bo->type == ttm_bo_type_kernel &&
> -	    !dma_resv_test_signaled_rcu(bo->base.resv, true))
> +	    !amdgpu_vm_evictable(ttm_to_amdgpu_bo(bo)))
>   		return false;
>   
>   	/* If bo is a KFD BO, check if the bo belongs to the current process.
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index a94c4faa5af1..a22bd57129d1 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -2503,6 +2503,28 @@ void amdgpu_vm_bo_rmv(struct amdgpu_device *adev,
>   	kfree(bo_va);
>   }
>   
> +/**
> + * amdgpu_vm_evictable - check if we can evict a VM
> + *
> + * @bo: A page table of the VM.
> + *
> + * Check if it is possible to evict a VM.
> + */
> +bool amdgpu_vm_evictable(struct amdgpu_bo *bo)
> +{
> +	struct amdgpu_vm_bo_base *bo_base = bo->vm_bo;
> +
> +	/* Page tables of a destroyed VM can go away immediately */
> +	if (!bo_base || !bo_base->vm)
> +		return true;
> +
> +	/* Don't evict VM page tables while they are busy */
> +	if (!dma_resv_test_signaled_rcu(bo->tbo.base.resv, true))
> +		return false;
> +
> +	return true;
> +}
> +
>   /**
>    * amdgpu_vm_bo_invalidate - mark the bo as invalid
>    *
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> index 76fcf853035c..db561765453b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> @@ -381,6 +381,7 @@ int amdgpu_vm_handle_moved(struct amdgpu_device *adev,
>   int amdgpu_vm_bo_update(struct amdgpu_device *adev,
>   			struct amdgpu_bo_va *bo_va,
>   			bool clear);
> +bool amdgpu_vm_evictable(struct amdgpu_bo *bo);
>   void amdgpu_vm_bo_invalidate(struct amdgpu_device *adev,
>   			     struct amdgpu_bo *bo, bool evicted);
>   uint64_t amdgpu_vm_map_gart(const dma_addr_t *pages_addr, uint64_t addr);


More information about the amd-gfx mailing list