[PATCH 29/29] exhaustive

Matthew Auld matthew.auld at intel.com
Tue Sep 24 11:24:17 UTC 2019


---
 .../gpu/drm/i915/gem/selftests/huge_pages.c   | 66 +++++++++++--------
 1 file changed, 40 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
index 45067a540cbc..2b758aacebac 100644
--- a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
+++ b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
@@ -1260,8 +1260,11 @@ static int igt_ppgtt_exhaust_huge(void *arg)
 	struct drm_i915_gem_object *obj;
 	unsigned int size_mask;
 	unsigned int page_mask;
+	unsigned int size;
+	unsigned int base;
+	IGT_TIMEOUT(end_time);
 	int n, i;
-	int err = -ENODEV;
+	int err;
 
 	if (supported == I915_GTT_PAGE_SIZE_4K)
 		return 0;
@@ -1277,8 +1280,10 @@ static int igt_ppgtt_exhaust_huge(void *arg)
 
 	/* XXX: extend this for backing storage backed by device memory */
 
+	base = 0;
+again:
 	for (size_mask = 2; size_mask < BIT(n); size_mask++) {
-		unsigned int size = 0;
+		size = base;
 
 		for (i = 0; i < n; i++) {
 			if (size_mask & BIT(i))
@@ -1305,53 +1310,62 @@ static int igt_ppgtt_exhaust_huge(void *arg)
 				continue;
 
 			obj = huge_pages_object(i915, size, page_sizes);
-			if (IS_ERR(obj)) {
-				err = PTR_ERR(obj);
-				goto out_device;
-			}
+			if (IS_ERR(obj))
+				return PTR_ERR(obj);
 
 			err = i915_gem_object_pin_pages(obj);
 			if (err) {
 				i915_gem_object_put(obj);
 
 				if (err == -ENOMEM) {
-					pr_info("unable to get pages, size=%u, pages=%u\n",
-						size, page_sizes);
-					err = 0;
-					break;
+					pr_info("%s unable to get pages, size=%u, pages=%u\n",
+						__func__, size, page_sizes);
+					return 0;
 				}
 
-				pr_err("pin_pages failed, size=%u, pages=%u\n",
-				       size_mask, page_mask);
+				pr_err("%s pin_pages failed, size=%u, pages=%u\n",
+				       __func__, size_mask, page_mask);
 
-				goto out_device;
+				return err;
 			}
 
 			/* Force the page-size for the gtt insertion */
 			obj->mm.page_sizes.sg = page_sizes;
 
 			err = igt_write_huge(ctx, obj, false);
-			if (err) {
-				pr_err("exhaust write-huge failed with size=%u\n",
-				       size);
-				goto out_unpin;
-			}
-
 			i915_gem_object_unpin_pages(obj);
 			__i915_gem_object_put_pages(obj, I915_MM_NORMAL);
 			i915_gem_object_put(obj);
+			if (err) {
+				pr_err("%s write-huge failed with size=%u, pages=%u\n",
+				       __func__, size, page_sizes);
+				return err;
+			}
+
+			if (igt_timeout(end_time,
+					"%s timed out at size=%u pages=%x\n",
+					__func__, size, page_sizes))
+				return 0;
 		}
 	}
 
-	goto out_device;
+	cond_resched();
 
-out_unpin:
-	i915_gem_object_unpin_pages(obj);
-	i915_gem_object_put(obj);
-out_device:
-	mkwrite_device_info(i915)->page_sizes = supported;
+	mutex_unlock(&i915->drm.struct_mutex);
+	i915_gem_flush_free_objects(i915);
+	mutex_lock(&i915->drm.struct_mutex);
 
-	return err;
+	GEM_BUG_ON(!size);
+
+	{
+		u64 next = roundup_pow_of_two(size) << 1ULL;
+		if (overflows_type(next, typeof(base)))
+			return 0;
+
+		base = next;
+	}
+
+	goto again;
 }
 
 static u32 igt_random_size(struct rnd_state *prng,
-- 
2.20.1



More information about the Intel-gfx-trybot mailing list