The second loop in drm_pagemap_migrate_to_devmem() checks
`page_pgmap(src_page) == pagemap && !can_migrate_same_pagemap` to skip
pages already on the target pagemap. However, this condition is always
false at this point: if can_migrate_same_pagemap is false and any own
pages exist, the first loop already returns -EBUSY before reaching here.

v2:
  - Skip the no-op migrate_vma_pages() when all pages already reside on
    the target pagemap.

Signed-off-by: Zhaoyu Liu <[email protected]>
---
 drivers/gpu/drm/drm_pagemap.c | 21 ++++++---------------
 1 file changed, 6 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/drm_pagemap.c b/drivers/gpu/drm/drm_pagemap.c
index 15c78eca180b..64922b944092 100644
--- a/drivers/gpu/drm/drm_pagemap.c
+++ b/drivers/gpu/drm/drm_pagemap.c
@@ -698,7 +698,7 @@ int drm_pagemap_migrate_to_devmem(struct drm_pagemap_devmem 
*devmem_allocation,
                 * nothing. Raced or unknown device pages.
                 */
                err = -EBUSY;
-               goto err_aborted_migration;
+               goto direct_finalize;
        }
 
        /* Count device-private pages to migrate */
@@ -719,19 +719,17 @@ int drm_pagemap_migrate_to_devmem(struct 
drm_pagemap_devmem *devmem_allocation,
        if (own_pages == npages) {
                err = 0;
                drm_dbg(dpagemap->drm, "Migration wasn't necessary.\n");
-               goto err_aborted_migration;
+               goto direct_finalize;
        } else if (own_pages && !mdetails->can_migrate_same_pagemap) {
                err = -EBUSY;
                drm_dbg(dpagemap->drm, "Migration aborted due to 
fragmentation.\n");
-               goto err_aborted_migration;
+               goto direct_finalize;
        }
 
        err = ops->populate_devmem_pfn(devmem_allocation, npages, migrate.dst);
        if (err)
                goto err_aborted_migration;
 
-       own_pages = 0;
-
        for (i = 0; i < npages;) {
                unsigned long j;
                struct page *page = pfn_to_page(migrate.dst[i]);
@@ -744,12 +742,7 @@ int drm_pagemap_migrate_to_devmem(struct 
drm_pagemap_devmem *devmem_allocation,
                        struct drm_pagemap_zdd *src_zdd =
                                drm_pagemap_page_zone_device_data(src_page);
 
-                       if (page_pgmap(src_page) == pagemap &&
-                           !mdetails->can_migrate_same_pagemap) {
-                               migrate.dst[i] = 0;
-                               own_pages++;
-                               goto next;
-                       }
+                       /* Own or peer device private page */
                        cur.dpagemap = src_zdd->dpagemap;
                        cur.ops = src_zdd->devmem_allocation->ops;
                        cur.device = cur.dpagemap->drm->dev;
@@ -786,7 +779,6 @@ int drm_pagemap_migrate_to_devmem(struct drm_pagemap_devmem 
*devmem_allocation,
                        goto err_finalize;
                }
 
-next:
                i += NR_PAGES(order);
        }
 
@@ -797,8 +789,6 @@ int drm_pagemap_migrate_to_devmem(struct drm_pagemap_devmem 
*devmem_allocation,
        if (err)
                goto err_finalize;
 
-       drm_WARN_ON(dpagemap->drm, !!own_pages);
-
        dma_fence_put(devmem_allocation->pre_migrate_fence);
        devmem_allocation->pre_migrate_fence = NULL;
 
@@ -822,11 +812,12 @@ int drm_pagemap_migrate_to_devmem(struct 
drm_pagemap_devmem *devmem_allocation,
                i += nr_pages;
        }
 
-       if (!err && migrated_pages < npages - own_pages) {
+       if (!err && migrated_pages < npages) {
                drm_dbg(dpagemap->drm, "Raced while finalizing migration.\n");
                err = -EBUSY;
        }
 
+direct_finalize:
        migrate_vma_finalize(&migrate);
 err_free:
        drm_pagemap_zdd_put(zdd);
-- 
2.34.1

Reply via email to