@@ -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;
}
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(-)