All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matthew Auld <matthew.auld@intel.com>
To: intel-gfx@lists.freedesktop.org
Subject: [PATCH 15/18] drm/i915/selftests: exercise evict-for-node page coloring
Date: Tue,  4 Apr 2017 23:11:25 +0100	[thread overview]
Message-ID: <20170404221128.3943-16-matthew.auld@intel.com> (raw)
In-Reply-To: <20170404221128.3943-1-matthew.auld@intel.com>

Signed-off-by: Matthew Auld <matthew.auld@intel.com>
---
 drivers/gpu/drm/i915/selftests/i915_gem_evict.c | 117 ++++++++++++++++++++++--
 1 file changed, 111 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
index 8c0b4dc9de3d..780585a202ba 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
@@ -25,6 +25,7 @@
 #include "../i915_selftest.h"
 
 #include "mock_gem_device.h"
+#include "mock_gtt.h"
 
 static int populate_ggtt(struct drm_i915_private *i915)
 {
@@ -62,11 +63,11 @@ static int populate_ggtt(struct drm_i915_private *i915)
 	return 0;
 }
 
-static void unpin_ggtt(struct drm_i915_private *i915)
+static void unpin_vm(struct i915_address_space *vm)
 {
 	struct i915_vma *vma;
 
-	list_for_each_entry(vma, &i915->ggtt.base.inactive_list, vm_link)
+	list_for_each_entry(vma, &vm->inactive_list, vm_link)
 		i915_vma_unpin(vma);
 }
 
@@ -110,7 +111,7 @@ static int igt_evict_something(void *arg)
 		goto cleanup;
 	}
 
-	unpin_ggtt(i915);
+	unpin_vm(&ggtt->base);
 
 	/* Everything is unpinned, we should be able to evict something */
 	err = i915_gem_evict_something(&ggtt->base,
@@ -187,7 +188,7 @@ static int igt_evict_for_vma(void *arg)
 		goto cleanup;
 	}
 
-	unpin_ggtt(i915);
+	unpin_vm(&ggtt->base);
 
 	/* Everything is unpinned, we should be able to evict the node */
 	err = i915_gem_evict_for_node(&ggtt->base, &target, 0);
@@ -287,12 +288,115 @@ static int igt_evict_for_cache_color(void *arg)
 	err = 0;
 
 cleanup:
-	unpin_ggtt(i915);
+	unpin_vm(&ggtt->base);
 	cleanup_objects(i915);
 	ggtt->base.mm.color_adjust = NULL;
 	return err;
 }
 
+static int igt_evict_for_page_color(void *arg)
+{
+	struct drm_i915_private *i915 = arg;
+	struct i915_hw_ppgtt *ppgtt = mock_ppgtt(i915, "mock-page-color");
+	const unsigned long flags = PIN_USER | PIN_OFFSET_FIXED;
+	struct drm_mm_node target = {
+		/* Straddle the end of the first page-table boundary */
+		.start = (1 << GEN8_PDE_SHIFT) - I915_GTT_PAGE_SIZE_64K,
+		.size = I915_GTT_PAGE_SIZE_64K * 2,
+		.color = I915_GTT_PAGE_SIZE_4K,
+	};
+	struct drm_i915_gem_object *obj;
+	struct i915_vma *vma;
+	int err;
+
+	/* The mock ppgtt mm.color_adjust should be set to
+	 * i915_page_color_adjust.
+	 */
+	GEM_BUG_ON(!i915_vm_has_page_coloring(&ppgtt->base));
+
+	obj = i915_gem_object_create_internal(i915, I915_GTT_PAGE_SIZE);
+	if (IS_ERR(obj)) {
+		err = PTR_ERR(obj);
+		goto cleanup;
+	}
+
+	vma = i915_vma_instance(obj, &ppgtt->base, NULL);
+	if (IS_ERR(vma)) {
+		pr_err("[0]i915_vma_instance failed\n");
+		err = PTR_ERR(vma);
+		goto cleanup;
+	}
+
+	err = i915_vma_pin(vma, 0, 0, flags);
+	if (err) {
+		pr_err("[0]i915_vma_pin failed with err=%d\n", err);
+		goto cleanup;
+	}
+
+	obj = i915_gem_object_create_internal(i915, I915_GTT_PAGE_SIZE);
+	if (IS_ERR(obj)) {
+		unpin_vm(&ppgtt->base);
+		err = PTR_ERR(obj);
+		goto cleanup;
+	}
+
+	vma = i915_vma_instance(obj, &ppgtt->base, NULL);
+	if (IS_ERR(vma)) {
+		pr_err("[1]i915_vma_instance failed\n");
+		err = PTR_ERR(vma);
+		goto cleanup;
+	}
+
+	err = i915_vma_pin(vma, 0, 0,
+			   ((2 << GEN8_PDE_SHIFT) - I915_GTT_PAGE_SIZE_4K) |
+			   flags);
+	if (err) {
+		unpin_vm(&ppgtt->base);
+		pr_err("[1]i915_vma_pin failed with err=%d\n", err);
+		goto cleanup;
+	}
+
+	/* Target the page-table boundary between the two already *pinned* gem
+	 * objects with the same page color - should succeed.
+	 */
+	err = i915_gem_evict_for_node(&ppgtt->base, &target, 0);
+	if (err) {
+		unpin_vm(&ppgtt->base);
+		pr_err("[0]i915_gem_evict_for_node returned err=%d\n", err);
+		goto cleanup;
+	}
+
+	target.color = I915_GTT_PAGE_SIZE_64K;
+
+	/* Again target the page-table boundary between the two already *pinned*
+	 * gem objects, but this time with conflicting page colors - should
+	 * fail.
+	 */
+	err = i915_gem_evict_for_node(&ppgtt->base, &target, 0);
+	if (!err) {
+		unpin_vm(&ppgtt->base);
+		pr_err("[1]i915_gem_evict_for_node returned err=%d\n", err);
+		err = -EINVAL;
+		goto cleanup;
+	}
+
+	unpin_vm(&ppgtt->base);
+
+	/* And finaly target the page-table boundary between the two now
+	 * *unpinned* gem objects, again with conflicting page colors - should
+	 * now succeed.
+	 */
+	err = i915_gem_evict_for_node(&ppgtt->base, &target, 0);
+	if (err)
+		pr_err("[2]i915_gem_evict_for_node returned err=%d\n", err);
+
+cleanup:
+	i915_ppgtt_close(&ppgtt->base);
+	i915_ppgtt_put(ppgtt);
+	cleanup_objects(i915);
+	return err;
+}
+
 static int igt_evict_vm(void *arg)
 {
 	struct drm_i915_private *i915 = arg;
@@ -313,7 +417,7 @@ static int igt_evict_vm(void *arg)
 		goto cleanup;
 	}
 
-	unpin_ggtt(i915);
+	unpin_vm(&ggtt->base);
 
 	err = i915_gem_evict_vm(&ggtt->base, false);
 	if (err) {
@@ -333,6 +437,7 @@ int i915_gem_evict_mock_selftests(void)
 		SUBTEST(igt_evict_something),
 		SUBTEST(igt_evict_for_vma),
 		SUBTEST(igt_evict_for_cache_color),
+		SUBTEST(igt_evict_for_page_color),
 		SUBTEST(igt_evict_vm),
 		SUBTEST(igt_overcommit),
 	};
-- 
2.9.3

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  parent reply	other threads:[~2017-04-04 22:11 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-04 22:11 [RFC PATCH 00/18] drm/i915: initial support for huge gtt pages V2 Matthew Auld
2017-04-04 22:11 ` [PATCH 01/18] drm/i915: add page_size_mask to dev_info Matthew Auld
2017-04-05  6:19   ` Joonas Lahtinen
2017-04-05  8:45     ` Chris Wilson
2017-04-05 12:57       ` Joonas Lahtinen
2017-04-05  8:43   ` Chris Wilson
2017-04-04 22:11 ` [PATCH 02/18] drm/i915: introduce drm_i915_gem_object page_size members Matthew Auld
2017-04-05  6:26   ` Joonas Lahtinen
2017-04-05  6:49   ` Daniel Vetter
2017-04-05  8:48     ` Chris Wilson
2017-04-05 10:07       ` Matthew Auld
2017-04-05 12:15         ` Daniel Vetter
2017-04-05 12:32         ` Chris Wilson
2017-04-05 12:39           ` Chris Wilson
2017-04-04 22:11 ` [PATCH 03/18] drm/i915: pass page_size to insert_entries Matthew Auld
2017-04-04 22:11 ` [PATCH 04/18] drm/i915: s/i915_gtt_color_adjust/i915_ggtt_color_adjust Matthew Auld
2017-04-05  6:30   ` Joonas Lahtinen
2017-04-04 22:11 ` [PATCH 05/18] drm/i915: clean up cache coloring Matthew Auld
2017-04-05  6:35   ` Joonas Lahtinen
2017-04-04 22:11 ` [PATCH 06/18] drm/i915: export color_differs Matthew Auld
2017-04-05  6:39   ` Joonas Lahtinen
2017-04-04 22:11 ` [PATCH 07/18] drm/i915: introduce ppgtt page coloring Matthew Auld
2017-04-05 13:41   ` Chris Wilson
2017-04-05 13:50     ` Matthew Auld
2017-04-05 14:02       ` Chris Wilson
2017-04-05 15:05         ` Matthew Auld
2017-04-10 12:08         ` Matthew Auld
2017-04-04 22:11 ` [PATCH 08/18] drm/i915: handle evict-for-node with " Matthew Auld
2017-04-04 22:11 ` [PATCH 09/18] drm/i915: support inserting 64K pages in the ppgtt Matthew Auld
2017-04-06  3:25   ` kbuild test robot
2017-04-09  0:27   ` kbuild test robot
2017-04-04 22:11 ` [PATCH 10/18] drm/i915: support inserting 2M " Matthew Auld
2017-04-04 22:11 ` [PATCH 11/18] drm/i915: support inserting 1G " Matthew Auld
2017-04-04 22:11 ` [PATCH 12/18] drm/i915: disable GTT cache for huge-pages Matthew Auld
2017-04-04 22:11 ` [PATCH 13/18] drm/i915/selftests: exercise 4K and 64K mm insertion Matthew Auld
2017-04-04 22:11 ` [PATCH 14/18] drm/i915/selftests: modify the gtt tests to also exercise huge pages Matthew Auld
2017-04-04 22:11 ` Matthew Auld [this message]
2017-04-04 22:11 ` [PATCH 16/18] drm/i915/debugfs: include some huge-page metrics Matthew Auld
2017-04-04 22:11 ` [PATCH 17/18] mm/shmem: tweak the huge-page interface Matthew Auld
2017-04-05  6:42   ` Daniel Vetter
2017-04-04 22:11 ` [PATCH 18/18] drm/i915: support transparent-huge-pages through shmemfs Matthew Auld
2017-04-05  8:53 ` [RFC PATCH 00/18] drm/i915: initial support for huge gtt pages V2 Chris Wilson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170404221128.3943-16-matthew.auld@intel.com \
    --to=matthew.auld@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.