Commit 979f6163 authored by Francois Dugast's avatar Francois Dugast
Browse files

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: default avatarMatthew Brost <matthew.brost@intel.com>
Link: https://lore.kernel.org/r/20250805140028.599361-7-francois.dugast@intel.com


Signed-off-by: default avatarFrancois Dugast <francois.dugast@intel.com>
parent 321d4203
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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
+8 −0
Original line number Diff line number Diff line
@@ -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;
			}
		}

		/*