mirror of
https://github.com/torvalds/linux.git
synced 2026-09-11 20:13:02 +02:00
drm/pagemap: dma-unmap pages before handling migration errors
drm_pagemap_migrate_unmap_pages() relies on the pages array to determine
which pages require DMA unmapping. However,
drm_pagemap_migration_unlock_put_pages() clears the array as part of its
cleanup, leaving drm_pagemap_migrate_unmap_pages() with no valid page
information if it is called afterward.
Call drm_pagemap_migrate_unmap_pages() before
drm_pagemap_migration_unlock_put_pages() so the pages array remains
valid during DMA unmapping.
Reported-by: Sashiko <sashiko-bot@kernel.org>
Fixes: f86ad0ed62 ("drm/gpusvm, drm/pagemap: Move migration functionality to drm_pagemap")
Cc: stable@vger.kernel.org
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Link: https://patch.msgid.link/20260902063504.3024362-1-matthew.brost@intel.com
This commit is contained in:
parent
332ad707e3
commit
9e6372ec2a
|
|
@ -1283,13 +1283,13 @@ int drm_pagemap_evict_to_ram(struct drm_pagemap_devmem *devmem_allocation)
|
|||
goto err_finalize;
|
||||
|
||||
err_finalize:
|
||||
drm_pagemap_migrate_unmap_pages(devmem_allocation->dev, pagemap_addr, dst, npages,
|
||||
DMA_FROM_DEVICE, &state);
|
||||
if (err)
|
||||
drm_pagemap_migration_unlock_put_pages(npages, dst);
|
||||
migrate_device_pages(src, dst, npages);
|
||||
drm_pagemap_retire_migrated_pages(src, npages);
|
||||
migrate_device_finalize(src, dst, npages);
|
||||
drm_pagemap_migrate_unmap_pages(devmem_allocation->dev, pagemap_addr, dst, npages,
|
||||
DMA_FROM_DEVICE, &state);
|
||||
|
||||
err_free:
|
||||
kvfree(buf);
|
||||
|
|
@ -1416,15 +1416,15 @@ static int __drm_pagemap_migrate_to_ram(struct vm_area_struct *vas,
|
|||
goto err_finalize;
|
||||
|
||||
err_finalize:
|
||||
if (dev)
|
||||
drm_pagemap_migrate_unmap_pages(dev, pagemap_addr, migrate.dst,
|
||||
npages, DMA_FROM_DEVICE,
|
||||
&state);
|
||||
if (err)
|
||||
drm_pagemap_migration_unlock_put_pages(npages, migrate.dst);
|
||||
migrate_vma_pages(&migrate);
|
||||
drm_pagemap_retire_migrated_pages(migrate.src, npages);
|
||||
migrate_vma_finalize(&migrate);
|
||||
if (dev)
|
||||
drm_pagemap_migrate_unmap_pages(dev, pagemap_addr, migrate.dst,
|
||||
npages, DMA_FROM_DEVICE,
|
||||
&state);
|
||||
err_free:
|
||||
kvfree(buf);
|
||||
err_out:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user