From: Ville Syrjälä <ville.syrj...@linux.intel.com>

Add a subtest to make sure the kernel doesn't leak the vma
pin_count for the last context on reset.

Signed-off-by: Ville Syrjälä <ville.syrj...@linux.intel.com>
---
 tests/gem_ctx_exec.c | 30 +++++++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)

diff --git a/tests/gem_ctx_exec.c b/tests/gem_ctx_exec.c
index da49a2f..da7412c 100644
--- a/tests/gem_ctx_exec.c
+++ b/tests/gem_ctx_exec.c
@@ -46,6 +46,7 @@
 #include "ioctl_wrappers.h"
 #include "drmtest.h"
 #include "igt_aux.h"
+#include "igt_debugfs.h"
 
 struct local_drm_i915_gem_context_destroy {
        __u32 ctx_id;
@@ -92,7 +93,6 @@ static int exec(int fd, uint32_t handle, int ring, int ctx_id)
 
        ret = drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2,
                        &execbuf);
-       gem_sync(fd, handle);
 
        return ret;
 }
@@ -188,15 +188,43 @@ igt_main
        igt_subtest("basic") {
                ctx_id = gem_context_create(fd);
                igt_assert(exec(fd, handle, I915_EXEC_RENDER, ctx_id) == 0);
+               gem_sync(fd, handle);
                context_destroy(fd, ctx_id);
 
                ctx_id = gem_context_create(fd);
                igt_assert(exec(fd, handle, I915_EXEC_RENDER, ctx_id) == 0);
+               gem_sync(fd, handle);
                context_destroy(fd, ctx_id);
 
                igt_assert(exec(fd, handle, I915_EXEC_RENDER, ctx_id) < 0);
+               gem_sync(fd, handle);
        }
 
        igt_subtest("eviction")
                big_exec(fd, handle, I915_EXEC_RENDER);
+
+       igt_subtest("reset-pin-leak") {
+               int i;
+
+               /*
+                * Use an explicit context to isolate the test from
+                * any major code changes related to the per-file
+                * default context (eg. if they would be eliminated).
+                */
+               ctx_id = gem_context_create(fd);
+
+               /*
+                * Iterate enough times that the kernel will
+                * become unhappy if the ggtt pin count for
+                * the last context is leaked at every reset.
+                */
+               for (i = 0; i < 20; i++) {
+                       igt_set_stop_rings(STOP_RING_DEFAULTS);
+                       igt_assert(exec(fd, handle, I915_EXEC_RENDER, 0) == 0);
+                       igt_assert(exec(fd, handle, I915_EXEC_RENDER, ctx_id) 
== 0);
+                       gem_sync(fd, handle);
+               }
+
+               context_destroy(fd, ctx_id);
+       }
 }
-- 
1.8.5.5

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

Reply via email to