[PATCH 1/3] huge ro

Matthew Auld matthew.auld at intel.com
Fri May 31 19:13:07 UTC 2019


---
 .../gpu/drm/i915/gem/selftests/huge_pages.c   | 56 ++++++++++++++-----
 1 file changed, 42 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
index ec2985c0a92e..f534967c8a50 100644
--- a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
+++ b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
@@ -8,6 +8,7 @@
 
 #include "i915_selftest.h"
 
+#include "gem/i915_gem_object_blt.h"
 #include "gem/i915_gem_pm.h"
 
 #include "igt_gem_utils.h"
@@ -16,6 +17,7 @@
 #include "selftests/mock_drm.h"
 #include "selftests/mock_gem_device.h"
 #include "selftests/i915_random.h"
+#include "selftests/igt_flush_test.h"
 
 static const unsigned int page_sizes[] = {
 	I915_GTT_PAGE_SIZE_2M,
@@ -168,7 +170,7 @@ huge_pages_object(struct drm_i915_private *i915,
 
 	obj->write_domain = I915_GEM_DOMAIN_CPU;
 	obj->read_domains = I915_GEM_DOMAIN_CPU;
-	obj->cache_level = I915_CACHE_NONE;
+	obj->cache_level = HAS_LLC(i915) ? I915_CACHE_LLC : I915_CACHE_NONE;
 
 	obj->mm.page_mask = page_mask;
 
@@ -1011,13 +1013,20 @@ static int cpu_check(struct drm_i915_gem_object *obj, u32 dword, u32 val)
 
 	for (n = 0; n < obj->base.size >> PAGE_SHIFT; ++n) {
 		u32 *ptr = kmap_atomic(i915_gem_object_get_page(obj, n));
+		bool ok;
 
 		if (needs_flush & CLFLUSH_BEFORE)
 			drm_clflush_virt_range(ptr, PAGE_SIZE);
 
-		if (ptr[dword] != val) {
-			pr_err("n=%lu ptr[%u]=%u, val=%u\n",
-			       n, dword, ptr[dword], val);
+		if (i915_gem_object_is_readonly(obj))
+			ok = ptr[dword] != val;
+		else
+			ok = ptr[dword] == val;
+
+		if (!ok) {
+			pr_err("n=%lu ptr[%u]=%u, val=%u ro=%s\n",
+			       n, dword, ptr[dword], val,
+			       yesno(i915_gem_object_is_readonly(obj)));
 			kunmap_atomic(ptr);
 			err = -EINVAL;
 			break;
@@ -1095,6 +1104,7 @@ static int igt_write_huge(struct i915_gem_context *ctx,
 	struct i915_address_space *vm =
 		ctx->ppgtt ? &ctx->ppgtt->vm : &i915->ggtt.vm;
 	static struct intel_engine_cs *engines[I915_NUM_ENGINES];
+	const bool try_ro = vm->has_read_only && HAS_ENGINE(i915, BCS0);
 	struct intel_engine_cs *engine;
 	I915_RND_STATE(prng);
 	IGT_TIMEOUT(end_time);
@@ -1109,6 +1119,16 @@ static int igt_write_huge(struct i915_gem_context *ctx,
 
 	GEM_BUG_ON(!i915_gem_object_has_pinned_pages(obj));
 
+	if (try_ro) {
+		err = i915_gem_object_fill_blt(obj,
+					       i915->engine[BCS0]->kernel_context,
+					       0);
+		if (err) {
+			pr_info("fill_blt failed\n");
+			return err;
+		}
+	}
+
 	size = obj->base.size;
 	if (obj->mm.page_sizes.sg & I915_GTT_PAGE_SIZE_64K)
 		size = round_up(size, I915_GTT_PAGE_SIZE_2M);
@@ -1152,6 +1172,9 @@ static int igt_write_huge(struct i915_gem_context *ctx,
 		engine = engines[order[i] % n];
 		i = (i + 1) % (n * I915_NUM_ENGINES);
 
+		obj->base.vma_node.readonly =
+			try_ro && prandom_u32_state(&prng) & 1;
+
 		/*
 		 * In order to utilize 64K pages we need to both pad the vma
 		 * size and ensure the vma offset is at the start of the pt
@@ -1730,7 +1753,7 @@ int i915_gem_huge_page_mock_selftests(void)
 	return err;
 }
 
-int i915_gem_huge_page_live_selftests(struct drm_i915_private *dev_priv)
+int i915_gem_huge_page_live_selftests(struct drm_i915_private *i915)
 {
 	static const struct i915_subtest tests[] = {
 		SUBTEST(igt_shrink_thp),
@@ -1745,22 +1768,22 @@ int i915_gem_huge_page_live_selftests(struct drm_i915_private *dev_priv)
 	intel_wakeref_t wakeref;
 	int err;
 
-	if (!HAS_PPGTT(dev_priv)) {
+	if (!HAS_PPGTT(i915)) {
 		pr_info("PPGTT not supported, skipping live-selftests\n");
 		return 0;
 	}
 
-	if (i915_terminally_wedged(dev_priv))
+	if (i915_terminally_wedged(i915))
 		return 0;
 
-	file = mock_file(dev_priv);
+	file = mock_file(i915);
 	if (IS_ERR(file))
 		return PTR_ERR(file);
 
-	mutex_lock(&dev_priv->drm.struct_mutex);
-	wakeref = intel_runtime_pm_get(dev_priv);
+	mutex_lock(&i915->drm.struct_mutex);
+	wakeref = intel_runtime_pm_get(i915);
 
-	ctx = live_context(dev_priv, file);
+	ctx = live_context(i915, file);
 	if (IS_ERR(ctx)) {
 		err = PTR_ERR(ctx);
 		goto out_unlock;
@@ -1772,10 +1795,15 @@ int i915_gem_huge_page_live_selftests(struct drm_i915_private *dev_priv)
 	err = i915_subtests(tests, ctx);
 
 out_unlock:
-	intel_runtime_pm_put(dev_priv, wakeref);
-	mutex_unlock(&dev_priv->drm.struct_mutex);
+	intel_runtime_pm_put(i915, wakeref);
+	mutex_unlock(&i915->drm.struct_mutex);
+
+	mock_file_free(i915, file);
 
-	mock_file_free(dev_priv, file);
+	mutex_lock(&i915->drm.struct_mutex);
+	if (igt_flush_test(i915, I915_WAIT_LOCKED))
+		err = -EIO;
+	mutex_unlock(&i915->drm.struct_mutex);
 
 	return err;
 }
-- 
2.20.1



More information about the Intel-gfx-trybot mailing list