mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 18:21:24 +02:00
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: 75af93b3f5 ("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
This commit is contained in:
parent
cc54eabdfb
commit
3902846af3
|
|
@ -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);
|
err = ops->populate_devmem_pfn(devmem_allocation, npages, migrate.dst);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_finalize;
|
goto err_aborted_migration;
|
||||||
|
|
||||||
own_pages = 0;
|
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,
|
err = drm_pagemap_migrate_range(devmem_allocation, migrate.src, migrate.dst,
|
||||||
pages, pagemap_addr, &last, &cur,
|
pages, pagemap_addr, &last, &cur,
|
||||||
mdetails);
|
mdetails);
|
||||||
if (err)
|
if (err) {
|
||||||
|
npages = i + 1;
|
||||||
goto err_finalize;
|
goto err_finalize;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
cur.start = npages;
|
cur.start = npages;
|
||||||
cur.ops = NULL; /* Force migration */
|
cur.ops = NULL; /* Force migration */
|
||||||
|
|
@ -646,7 +648,7 @@ int drm_pagemap_migrate_to_devmem(struct drm_pagemap_devmem *devmem_allocation,
|
||||||
err_aborted_migration:
|
err_aborted_migration:
|
||||||
migrate_vma_pages(&migrate);
|
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]);
|
struct page *page = migrate_pfn_to_page(migrate.src[i]);
|
||||||
unsigned long nr_pages = page ? NR_PAGES(folio_order(page_folio(page))) : 1;
|
unsigned long nr_pages = page ? NR_PAGES(folio_order(page_folio(page))) : 1;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user