Use drm_gpusvm_scan_mm() to avoid unnecessarily calling into
drm_pagemap_populate_mm();

v3:
- New patch.

Signed-off-by: Thomas Hellström <[email protected]>
---
 drivers/gpu/drm/xe/xe_svm.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c
index efc4e53e8636..58107ba56534 100644
--- a/drivers/gpu/drm/xe/xe_svm.c
+++ b/drivers/gpu/drm/xe/xe_svm.c
@@ -1623,11 +1623,23 @@ struct drm_pagemap *xe_vma_resolve_pagemap(struct 
xe_vma *vma, struct xe_tile *t
 int xe_svm_alloc_vram(struct xe_svm_range *range, const struct drm_gpusvm_ctx 
*ctx,
                      struct drm_pagemap *dpagemap)
 {
-       struct xe_device *xe = range_to_vm(&range->base)->xe;
+       struct xe_vm *vm = range_to_vm(&range->base);
+       enum drm_gpusvm_scan_result migration_state;
+       struct xe_device *xe = vm->xe;
 
        xe_assert(range_to_vm(&range->base)->xe, 
range->base.pages.flags.migrate_devmem);
        range_debug(range, "ALLOCATE VRAM");
 
+       migration_state = drm_gpusvm_scan_mm(&range->base,
+                                            xe_svm_private_page_owner(vm, 
false),
+                                            dpagemap->pagemap);
+
+       if (migration_state == DRM_GPUSVM_SCAN_EQUAL) {
+               if (IS_ENABLED(CONFIG_DRM_XE_DEBUG_VM))
+                       drm_dbg(dpagemap->drm, "Already migrated!\n");
+               return 0;
+       }
+
        if (IS_ENABLED(CONFIG_DRM_XE_DEBUG_VM))
                drm_dbg(&xe->drm, "Request migration to device memory on 
\"%s\".\n",
                        dpagemap->drm->unique);
-- 
2.51.1

Reply via email to