[PATCH v2 1/1] drm/amdgpu: cleanup gart tlb flush logic
Christian König
christian.koenig at amd.com
Fri May 28 14:48:14 UTC 2021
Am 28.05.21 um 16:44 schrieb Nirmoy Das:
> Don't flush gpu tlb after recovering each BO instead
> do it after receovering all the BOs.
>
> v2: abstract out gart tlb flushing logic to amdgpu_gart.c
>
> Signed-off-by: Nirmoy Das <nirmoy.das at amd.com>
> ---
> Is there a better way to get adev in amdgpu_gtt_mgr_recover()?
>
> drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c | 20 +++++++++++++++-----
> drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h | 2 +-
> drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 6 ++++++
> drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 1 +
> 4 files changed, 23 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
> index 5562b5c90c03..e2059f7ed639 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
> @@ -322,16 +322,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_tlb_flush - flush gart TLB
Either change the description like "flush GART changes" and drop the
_tlb_ part of the name orr rename the function to
amdgpu_gart_invalidate_tlb.
Since we flush gart changes by invalidating the TLB. Otherwise we have a
mixup in the name.
Sorry didn't though about that before, apart from that the patch looks
good to me.
Christian.
> + *
> + * @adev: amdgpu device driver pointer
> + *
> + * Flush TLB of gart page table.
> + *
> + */
> +void amdgpu_gart_tlb_flush(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..c853b70a24cf 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_tlb_flush(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..b61a54f6d95d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
> @@ -205,6 +205,7 @@ uint64_t amdgpu_gtt_mgr_usage(struct ttm_resource_manager *man)
> */
> int amdgpu_gtt_mgr_recover(struct ttm_resource_manager *man)
> {
> + struct amdgpu_device *adev = NULL;
> struct amdgpu_gtt_mgr *mgr = to_gtt_mgr(man);
> struct amdgpu_gtt_node *node;
> struct drm_mm_node *mm_node;
> @@ -216,9 +217,14 @@ int amdgpu_gtt_mgr_recover(struct ttm_resource_manager *man)
> r = amdgpu_ttm_recover_gart(node->tbo);
> if (r)
> break;
> + if (!adev)
> + adev = amdgpu_ttm_adev(node->tbo->bdev);
> }
> spin_unlock(&mgr->lock);
>
> + if (adev)
> + amdgpu_gart_tlb_flush(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..5e514759d319 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_tlb_flush(adev);
> ttm_resource_free(bo, &bo->mem);
> bo->mem = tmp;
> }
> --
> 2.31.1
>
More information about the amd-gfx
mailing list