[PATCH] drm/i915/selftest/mmap_migrate: wait for clear memory

Mikolaj Wasiak mikolaj.wasiak at intel.com
Fri Apr 11 10:48:16 UTC 2025


Mmap_migrate test runs multiple times filling GPU memory
with objects. Those objects are deleted after each run
but cleaning pages takes some time after the objects are
put. This patch lets tests to wait for cleanup after previous test
if they need to allocate whole memory with new objects.

Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13929

Signed-off-by: Mikolaj Wasiak <mikolaj.wasiak at intel.com>
---
 .../drm/i915/gem/selftests/i915_gem_mman.c    | 35 +++++++++++++++++--
 1 file changed, 32 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
index 9c3f17e51885..e486a52b855a 100644
--- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
+++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
@@ -1047,8 +1047,36 @@ static void igt_make_evictable(struct list_head *objects)
 	cond_resched();
 }
 
+static int igt_try_pinning_pages(struct drm_i915_gem_object *obj,
+				 bool force_pin)
+{
+	int retries;
+	int max_retries;
+	int err;
+
+	retries = 0;
+	max_retries = 10;
+	do {
+		err = i915_gem_object_pin_pages_unlocked(obj);
+		if (!err)
+			break;
+
+		if (err != -ENXIO && err != -ENOMEM)
+			break;
+
+		if (!force_pin)
+			break;
+
+		retries++;
+		msleep(20);
+	} while (retries < max_retries);
+
+	return err;
+}
+
 static int igt_fill_mappable(struct intel_memory_region *mr,
-			     struct list_head *objects)
+			     struct list_head *objects,
+			     bool force_fill)
 {
 	u64 size, total;
 	int err;
@@ -1066,7 +1094,7 @@ static int igt_fill_mappable(struct intel_memory_region *mr,
 
 		list_add(&obj->st_link, objects);
 
-		err = i915_gem_object_pin_pages_unlocked(obj);
+		err = igt_try_pinning_pages(obj, force_fill);
 		if (err) {
 			if (err != -ENXIO && err != -ENOMEM)
 				goto err_close;
@@ -1208,7 +1236,8 @@ static int __igt_mmap_migrate(struct intel_memory_region **placements,
 	}
 
 	if (flags & IGT_MMAP_MIGRATE_FILL) {
-		err = igt_fill_mappable(placements[0], &objects);
+		err = igt_fill_mappable(placements[0], &objects,
+				flags & IGT_MMAP_MIGRATE_UNFAULTABLE);
 		if (err)
 			goto out_put;
 	}
-- 
2.43.0



More information about the Intel-gfx mailing list