[PATCH 03/10] drm/amdkfd: set owner ref to svm range prefault

Felix Kuehling felix.kuehling at amd.com
Mon Jun 21 20:02:52 UTC 2021


On 2021-06-21 12:04 p.m., Alex Sierra wrote:
> svm_range_prefault is called right before migrations to VRAM,
> to make sure pages are resident in system memory before the migration.
> With partial migrations, this reference is used by hmm range get pages
> to avoid migrating pages that are already in the same VRAM domain.
>
> Signed-off-by: Alex Sierra <alex.sierra at amd.com>

Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>


> ---
>   drivers/gpu/drm/amd/amdkfd/kfd_migrate.c | 2 +-
>   drivers/gpu/drm/amd/amdkfd/kfd_svm.c     | 5 +++--
>   drivers/gpu/drm/amd/amdkfd/kfd_svm.h     | 3 ++-
>   3 files changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
> index 11f7f590c6ec..b298aa8dea4d 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
> @@ -512,7 +512,7 @@ svm_migrate_ram_to_vram(struct svm_range *prange, uint32_t best_loc,
>   		 prange->start, prange->last, best_loc);
>   
>   	/* FIXME: workaround for page locking bug with invalid pages */
> -	svm_range_prefault(prange, mm);
> +	svm_range_prefault(prange, mm, SVM_ADEV_PGMAP_OWNER(adev));
>   
>   	start = prange->start << PAGE_SHIFT;
>   	end = (prange->last + 1) << PAGE_SHIFT;
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
> index b939f353ac8c..54f47b09b14a 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
> @@ -2646,7 +2646,8 @@ svm_range_best_prefetch_location(struct svm_range *prange)
>   /* FIXME: This is a workaround for page locking bug when some pages are
>    * invalid during migration to VRAM
>    */
> -void svm_range_prefault(struct svm_range *prange, struct mm_struct *mm)
> +void svm_range_prefault(struct svm_range *prange, struct mm_struct *mm,
> +			void *owner)
>   {
>   	struct hmm_range *hmm_range;
>   	int r;
> @@ -2657,7 +2658,7 @@ void svm_range_prefault(struct svm_range *prange, struct mm_struct *mm)
>   	r = amdgpu_hmm_range_get_pages(&prange->notifier, mm, NULL,
>   				       prange->start << PAGE_SHIFT,
>   				       prange->npages, &hmm_range,
> -				       false, true, NULL);
> +				       false, true, owner);
>   	if (!r) {
>   		amdgpu_hmm_range_get_pages_done(hmm_range);
>   		prange->validated_once = true;
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.h b/drivers/gpu/drm/amd/amdkfd/kfd_svm.h
> index 4297250f259d..08542fe39303 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.h
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.h
> @@ -176,7 +176,8 @@ void schedule_deferred_list_work(struct svm_range_list *svms);
>   void svm_range_dma_unmap(struct device *dev, dma_addr_t *dma_addr,
>   			 unsigned long offset, unsigned long npages);
>   void svm_range_free_dma_mappings(struct svm_range *prange);
> -void svm_range_prefault(struct svm_range *prange, struct mm_struct *mm);
> +void svm_range_prefault(struct svm_range *prange, struct mm_struct *mm,
> +			void *owner);
>   
>   #else
>   


More information about the amd-gfx mailing list