diff mbox series

[RFC,13/19] drm/gpusvm: Allow mixed mappings

Message ID 20250312210416.3120-14-thomas.hellstrom@linux.intel.com (mailing list archive)
State New
Headers show
Series drm, drm/xe: Multi-device GPUSVM | expand

Commit Message

Thomas Hellström March 12, 2025, 9:04 p.m. UTC
Racing while migrating can cause part of an SVM range to reside in
system and part of the range to reside in local VRAM.

Currently we disallow that and repeatedly try to force everything
out to system memory.

Instead, allow drm_gpusvm_range_get_pages() to be a bit more permissive,
and allow mapping of mixed ranges.

Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
---
 drivers/gpu/drm/drm_gpusvm.c | 14 +-------------
 1 file changed, 1 insertion(+), 13 deletions(-)
diff mbox series

Patch

diff --git a/drivers/gpu/drm/drm_gpusvm.c b/drivers/gpu/drm/drm_gpusvm.c
index 8d836248f5fe..5d502ca091ee 100644
--- a/drivers/gpu/drm/drm_gpusvm.c
+++ b/drivers/gpu/drm/drm_gpusvm.c
@@ -1213,7 +1213,6 @@  int drm_gpusvm_range_get_pages(struct drm_gpusvm *gpusvm,
 		.dev_private_owner = ctx->device_private_page_owner,
 	};
 	struct mm_struct *mm = gpusvm->mm;
-	void *zdd;
 	unsigned long timeout =
 		jiffies + msecs_to_jiffies(HMM_RANGE_DEFAULT_TIMEOUT);
 	unsigned long i, j;
@@ -1295,7 +1294,6 @@  int drm_gpusvm_range_get_pages(struct drm_gpusvm *gpusvm,
 		goto map_pages;
 	}
 
-	zdd = NULL;
 	num_dma_mapped = 0;
 	for (i = 0, j = 0; i < npages; ++j) {
 		struct page *page = hmm_pfn_to_page(pfns[i]);
@@ -1303,17 +1301,7 @@  int drm_gpusvm_range_get_pages(struct drm_gpusvm *gpusvm,
 		order = hmm_pfn_to_map_order(pfns[i]);
 		if (is_device_private_page(page) ||
 		    is_device_coherent_page(page)) {
-			if (zdd != page->zone_device_data && i > 0) {
-				err = -EOPNOTSUPP;
-				goto err_unmap;
-			}
-			zdd = page->zone_device_data;
 			if (pagemap != page->pgmap) {
-				if (i > 0) {
-					err = -EOPNOTSUPP;
-					goto err_unmap;
-				}
-
 				pagemap = page->pgmap;
 				dpagemap = drm_pagemap_page_to_dpagemap(page);
 				if (drm_WARN_ON(gpusvm->drm, !dpagemap)) {
@@ -1341,7 +1329,7 @@  int drm_gpusvm_range_get_pages(struct drm_gpusvm *gpusvm,
 		} else {
 			dma_addr_t addr;
 
-			if (is_zone_device_page(page) || pagemap) {
+			if (is_zone_device_page(page)) {
 				err = -EOPNOTSUPP;
 				goto err_unmap;
 			}