[PATCH v1 4/5] drm/xe/migrate: Use order to calculate migration length

Francois Dugast francois.dugast at intel.com
Thu Jul 17 13:38:26 UTC 2025


Since GPU SVM can DMA map folios, it can no longer be assumed that the
order is always 0 and that the mapping size is always PAGE_SIZE. Instead,
to determinate the migration length, use the order associated with each
DMA mapping, provided by drm_pagemap_device_addr.

Signed-off-by: Francois Dugast <francois.dugast at intel.com>
Cc: Matthew Brost <matthew.brost at intel.com>
---
 drivers/gpu/drm/xe/xe_migrate.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_migrate.c b/drivers/gpu/drm/xe/xe_migrate.c
index 33d67993f1f6..efbf8c0f41dc 100644
--- a/drivers/gpu/drm/xe/xe_migrate.c
+++ b/drivers/gpu/drm/xe/xe_migrate.c
@@ -1724,7 +1724,12 @@ struct dma_fence *xe_migrate_to_vram(struct xe_migrate *m,
 				     struct drm_pagemap_device_addr *src_addr,
 				     u64 dst_addr)
 {
-	return xe_migrate_vram(m, npages * PAGE_SIZE, 0, src_addr, dst_addr,
+	unsigned long i, len = 0;
+
+	for (i = 0; i < npages; i++)
+		len += PAGE_SIZE << src_addr[i].order;
+
+	return xe_migrate_vram(m, len, 0, src_addr, dst_addr,
 			       XE_MIGRATE_COPY_TO_VRAM);
 }
 
@@ -1745,7 +1750,12 @@ struct dma_fence *xe_migrate_from_vram(struct xe_migrate *m,
 				       u64 src_addr,
 				       struct drm_pagemap_device_addr *dst_addr)
 {
-	return xe_migrate_vram(m, npages * PAGE_SIZE, 0, dst_addr, src_addr,
+	unsigned long i, len = 0;
+
+	for (i = 0; i < npages; i++)
+		len += PAGE_SIZE << dst_addr[i].order;
+
+	return xe_migrate_vram(m, len, 0, dst_addr, src_addr,
 			       XE_MIGRATE_COPY_TO_SRAM);
 }
 
-- 
2.43.0



More information about the Intel-xe mailing list