drm/amdkfd: skip migration for pages already in VRAM
authorAlex Sierra <alex.sierra@amd.com>
Wed, 30 Jun 2021 19:09:10 +0000 (15:09 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 1 Jul 2021 04:05:41 +0000 (00:05 -0400)
Migration skipped for pages that are already in VRAM
domain. These could be the result of previous partial
migrations to SYS RAM, and prefetch back to VRAM.
Ex. Coherent pages in VRAM that were not written/invalidated after
a copy-on-write.

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

index d93abe5..610f33f 100644 (file)
@@ -293,15 +293,13 @@ svm_migrate_copy_to_vram(struct amdgpu_device *adev, struct svm_range *prange,
        for (i = j = 0; i < npages; i++) {
                struct page *spage;
 
-               dst[i] = cursor.start + (j << PAGE_SHIFT);
-               migrate->dst[i] = svm_migrate_addr_to_pfn(adev, dst[i]);
-               svm_migrate_get_vram_page(prange, migrate->dst[i]);
-
-               migrate->dst[i] = migrate_pfn(migrate->dst[i]);
-               migrate->dst[i] |= MIGRATE_PFN_LOCKED;
-
-               if (migrate->src[i] & MIGRATE_PFN_VALID) {
-                       spage = migrate_pfn_to_page(migrate->src[i]);
+               spage = migrate_pfn_to_page(migrate->src[i]);
+               if (spage && !is_zone_device_page(spage)) {
+                       dst[i] = cursor.start + (j << PAGE_SHIFT);
+                       migrate->dst[i] = svm_migrate_addr_to_pfn(adev, dst[i]);
+                       svm_migrate_get_vram_page(prange, migrate->dst[i]);
+                       migrate->dst[i] = migrate_pfn(migrate->dst[i]);
+                       migrate->dst[i] |= MIGRATE_PFN_LOCKED;
                        src[i] = dma_map_page(dev, spage, 0, PAGE_SIZE,
                                              DMA_TO_DEVICE);
                        r = dma_mapping_error(dev, src[i]);