summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorMatthew Brost <matthew.brost@intel.com>2026-01-07 10:27:15 -0800
committerMatthew Brost <matthew.brost@intel.com>2026-01-07 21:29:39 -0800
commit3902846af36beca676735540470a115b3d637263 (patch)
treeae07e0c0cdd2c015e014d4d7eefc26b564b9ef14 /drivers
parentcc54eabdfbf0c5b6638edc50002cfafac1f1e18b (diff)
drm/pagemap Fix error paths in drm_pagemap_migrate_to_devmem
Avoid unlocking and putting device pages unless they were successfully locked, and do not calculate migrated_pages on error paths. Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com> Fixes: 75af93b3f5d0 ("drm/pagemap, drm/xe: Support destination migration over interconnect") Signed-off-by: Matthew Brost <matthew.brost@intel.com> Reviewed-by: Francois Dugast <francois.dugast@intel.com> Link: https://patch.msgid.link/20260107182716.2236607-2-matthew.brost@intel.com
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/drm_pagemap.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/gpu/drm/drm_pagemap.c b/drivers/gpu/drm/drm_pagemap.c
index ba099aa7c52f..aa43a8475100 100644
--- a/drivers/gpu/drm/drm_pagemap.c
+++ b/drivers/gpu/drm/drm_pagemap.c
@@ -582,7 +582,7 @@ int drm_pagemap_migrate_to_devmem(struct drm_pagemap_devmem *devmem_allocation,
err = ops->populate_devmem_pfn(devmem_allocation, npages, migrate.dst);
if (err)
- goto err_finalize;
+ goto err_aborted_migration;
own_pages = 0;
@@ -621,8 +621,10 @@ int drm_pagemap_migrate_to_devmem(struct drm_pagemap_devmem *devmem_allocation,
err = drm_pagemap_migrate_range(devmem_allocation, migrate.src, migrate.dst,
pages, pagemap_addr, &last, &cur,
mdetails);
- if (err)
+ if (err) {
+ npages = i + 1;
goto err_finalize;
+ }
}
cur.start = npages;
cur.ops = NULL; /* Force migration */
@@ -646,7 +648,7 @@ err_finalize:
err_aborted_migration:
migrate_vma_pages(&migrate);
- for (i = 0; i < npages;) {
+ for (i = 0; !err && i < npages;) {
struct page *page = migrate_pfn_to_page(migrate.src[i]);
unsigned long nr_pages = page ? NR_PAGES(folio_order(page_folio(page))) : 1;