drm/xe/svm: Migrate folios when possible

The DMA mapping can now correspond to a folio (order > 0), so move
the iterator by the number of pages in the folio in order to migrate
all pages at once.

This requires forcing contiguous memory for SVM BOs, which greatly
simplifies the code and enables 2MB device page support, allowing a
major performance improvement. Negative effects like extra eviction
are unlikely as SVM BOs have a maximal size of 2MB.

v2:
- Improve commit message (Matthew Brost)
- Fix increment, chunk, assert match (Matthew Brost)

Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Link: https://lore.kernel.org/r/20250805140028.599361-7-francois.dugast@intel.com
Signed-off-by: Francois Dugast <francois.dugast@intel.com>
This commit is contained in:
Francois Dugast 2025-08-05 15:59:07 +02:00
parent 321d420325
commit 979f61633d
2 changed files with 10 additions and 0 deletions

View File

@ -200,6 +200,8 @@ static bool force_contiguous(u32 bo_flags)
else if (bo_flags & XE_BO_FLAG_PINNED &&
!(bo_flags & XE_BO_FLAG_PINNED_LATE_RESTORE))
return true; /* needs vmap */
else if (bo_flags & XE_BO_FLAG_CPU_ADDR_MIRROR)
return true;
/*
* For eviction / restore on suspend / resume objects pinned in VRAM

View File

@ -383,6 +383,14 @@ static int xe_svm_copy(struct page **pages,
}
match = vram_addr + PAGE_SIZE * (i - pos) == __vram_addr;
/* Expected with contiguous memory */
xe_assert(vr->xe, match);
if (pagemap_addr[i].order) {
i += NR_PAGES(pagemap_addr[i].order) - 1;
chunk = (i - pos) == (XE_MIGRATE_CHUNK_SIZE / PAGE_SIZE);
last = (i + 1) == npages;
}
}
/*