[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