drm/amdkfd: set owner ref to svm range prefault
authorAlex Sierra <alex.sierra@amd.com>
Thu, 6 May 2021 18:06:54 +0000 (13:06 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 1 Jul 2021 04:05:41 +0000 (00:05 -0400)
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@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
drivers/gpu/drm/amd/amdkfd/kfd_svm.c
drivers/gpu/drm/amd/amdkfd/kfd_svm.h

index f1be090f779863367141ecd63d578f59435ca570..90645017258ae1c04b3313dd3a679c711c828bfb 100644 (file)
@@ -471,7 +471,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;
index e64427c3137372f471f6e4002b9a165d9acee730..51d89433ca1ba63956f3295b4d78a4a4488eb301 100644 (file)
@@ -2717,7 +2717,8 @@ out:
 /* 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;
@@ -2728,7 +2729,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;
index 1f88bdfdbcc222ca7de61de660ccce39070f3f2c..9a7744a12dabe080f8cd88b6c9b20b535dcb1e9c 100644 (file)
@@ -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);
 struct kfd_process_device *
 svm_range_get_pdd_by_adev(struct svm_range *prange, struct amdgpu_device *adev);