[PATCH v4 1/1] drm/amdgpu: flush gart changes after all BO recovery

Christian König ckoenig.leichtzumerken at gmail.com
Fri May 28 19:13:10 UTC 2021


Am 28.05.21 um 18:51 schrieb Nirmoy Das:
> Don't flush gart changes after recovering each BO instead
> do it after recovering all the BOs. Flishing gart also needed
> for amdgpu_ttm_alloc_gart().
>
> v4: use container_of to retrieve adev struct.
> v3: rename amdgpu_gart_tlb_flush() -> amdgpu_gart_invalidate_tlb().
> v2: abstract out gart tlb flushing logic to amdgpu_gart.c
>
> Signed-off-by: Nirmoy Das <nirmoy.das at amd.com>

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

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c    | 22 ++++++++++++++-------
>   drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h    |  2 +-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c |  4 ++++
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c     |  1 +
>   4 files changed, 21 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
> index 5562b5c90c03..35cc8009ac7a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
> @@ -312,8 +312,6 @@ int amdgpu_gart_bind(struct amdgpu_device *adev, uint64_t offset,
>   		     int pages, struct page **pagelist, dma_addr_t *dma_addr,
>   		     uint64_t flags)
>   {
> -	int r, i;
> -
>   	if (!adev->gart.ready) {
>   		WARN(1, "trying to bind memory to uninitialized GART !\n");
>   		return -EINVAL;
> @@ -322,16 +320,26 @@ int amdgpu_gart_bind(struct amdgpu_device *adev, uint64_t offset,
>   	if (!adev->gart.ptr)
>   		return 0;
>
> -	r = amdgpu_gart_map(adev, offset, pages, dma_addr, flags,
> -		    adev->gart.ptr);
> -	if (r)
> -		return r;
> +	return amdgpu_gart_map(adev, offset, pages, dma_addr, flags,
> +			       adev->gart.ptr);
> +}
> +
> +/**
> + * amdgpu_gart_invalidate_tlb - invalidate gart TLB
> + *
> + * @adev: amdgpu device driver pointer
> + *
> + * Invalidate gart TLB which can be use as a way to flush gart changes
> + *
> + */
> +void amdgpu_gart_invalidate_tlb(struct amdgpu_device *adev)
> +{
> +	int i;
>
>   	mb();
>   	amdgpu_asic_flush_hdp(adev, NULL);
>   	for (i = 0; i < adev->num_vmhubs; i++)
>   		amdgpu_gmc_flush_gpu_tlb(adev, 0, i, 0);
> -	return 0;
>   }
>
>   /**
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h
> index a25fe97b0196..e104022197ae 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h
> @@ -66,5 +66,5 @@ int amdgpu_gart_map(struct amdgpu_device *adev, uint64_t offset,
>   int amdgpu_gart_bind(struct amdgpu_device *adev, uint64_t offset,
>   		     int pages, struct page **pagelist,
>   		     dma_addr_t *dma_addr, uint64_t flags);
> -
> +void amdgpu_gart_invalidate_tlb(struct amdgpu_device *adev);
>   #endif
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
> index 8860545344c7..a1cd775fd61c 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
> @@ -206,10 +206,12 @@ uint64_t amdgpu_gtt_mgr_usage(struct ttm_resource_manager *man)
>   int amdgpu_gtt_mgr_recover(struct ttm_resource_manager *man)
>   {
>   	struct amdgpu_gtt_mgr *mgr = to_gtt_mgr(man);
> +	struct amdgpu_device *adev;
>   	struct amdgpu_gtt_node *node;
>   	struct drm_mm_node *mm_node;
>   	int r = 0;
>
> +	adev = container_of(mgr, typeof(*adev), mman.gtt_mgr);
>   	spin_lock(&mgr->lock);
>   	drm_mm_for_each_node(mm_node, &mgr->mm) {
>   		node = container_of(mm_node, struct amdgpu_gtt_node, node);
> @@ -219,6 +221,8 @@ int amdgpu_gtt_mgr_recover(struct ttm_resource_manager *man)
>   	}
>   	spin_unlock(&mgr->lock);
>
> +	amdgpu_gart_invalidate_tlb(adev);
> +
>   	return r;
>   }
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index c0aef327292a..786650a4a493 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -1014,6 +1014,7 @@ int amdgpu_ttm_alloc_gart(struct ttm_buffer_object *bo)
>   			return r;
>   		}
>
> +		amdgpu_gart_invalidate_tlb(adev);
>   		ttm_resource_free(bo, &bo->mem);
>   		bo->mem = tmp;
>   	}
> --
> 2.31.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx



More information about the amd-gfx mailing list