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

Thomas Hellström thomas.hellstrom at linux.intel.com
Wed Mar 12 21:04:10 UTC 2025


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 at linux.intel.com>
---
 drivers/gpu/drm/drm_gpusvm.c | 14 +-------------
 1 file changed, 1 insertion(+), 13 deletions(-)

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;
 			}
-- 
2.48.1



More information about the Intel-xe mailing list