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 d93abe5fe66eb72ccb28383b299295efc339caa1..610f33f7c2af5f6824cbe60d82d2fc2b96d140d8 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]);