Data present in foreign device memory may cause migration to fail.
For now, retry once after first migrating to system.

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

diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c
index 9814f95cb212..41e075aa015c 100644
--- a/drivers/gpu/drm/xe/xe_svm.c
+++ b/drivers/gpu/drm/xe/xe_svm.c
@@ -1529,13 +1529,24 @@ 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)
 {
+       int err, retries = 1;
+
        xe_assert(range_to_vm(&range->base)->xe, 
range->base.pages.flags.migrate_devmem);
        range_debug(range, "ALLOCATE VRAM");
 
-       return drm_pagemap_populate_mm(dpagemap, xe_svm_range_start(range),
-                                      xe_svm_range_end(range),
-                                      range->base.gpusvm->mm,
-                                      ctx->timeslice_ms);
+retry:
+       err = drm_pagemap_populate_mm(dpagemap, xe_svm_range_start(range),
+                                     xe_svm_range_end(range),
+                                     range->base.gpusvm->mm,
+                                     ctx->timeslice_ms);
+       if ((err == -EBUSY || err == -EFAULT) && retries--) {
+               range_debug(range, "ALLOCATE VRAM - Retry.");
+
+               drm_gpusvm_range_evict(range->base.gpusvm, &range->base);
+               goto retry;
+       }
+
+       return err;
 }
 
 static struct drm_pagemap_addr
-- 
2.51.0

Reply via email to