[igt-dev] [PATCH i-g-t 2/2] i915/gem_ctx_persistence: Verify userptr vs context cleanup

Chris Wilson chris at chris-wilson.co.uk
Fri Oct 9 19:16:40 UTC 2020


Verify that the wait for userptr cleanup is after we have cancelled the
non-persistent hanging context.

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Jon Bloomfield <jon.bloomfield at intel.com>
---
 tests/i915/gem_ctx_persistence.c | 47 ++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)

diff --git a/tests/i915/gem_ctx_persistence.c b/tests/i915/gem_ctx_persistence.c
index 09814f24f..174af8361 100644
--- a/tests/i915/gem_ctx_persistence.c
+++ b/tests/i915/gem_ctx_persistence.c
@@ -735,6 +735,50 @@ static void test_process(int i915)
 	gem_quiescent_gpu(i915);
 }
 
+static void test_userptr(int i915)
+{
+	int fence, sv[2];
+
+	cleanup(i915);
+
+	/*
+	 * When a process dies early, do the userptr or the contexts get cleaned
+	 * up first? Since we only cancel the outstanding work along with the
+	 * context, but wait on userptr cleanup for oustanding work, if
+	 * the userptr is before the context, we end up in a scenario where
+	 * we wait forever for the non-peristent context.
+	 */
+
+	igt_require(socketpair(AF_UNIX, SOCK_DGRAM, 0, sv) == 0);
+
+	igt_fork(child, 1) {
+		igt_spin_t *spin;
+
+		i915 = gem_reopen_driver(i915);
+		gem_quiescent_gpu(i915);
+
+		gem_context_set_persistence(i915, 0, false);
+		spin = igt_spin_new(i915, .flags = IGT_SPIN_FENCE_OUT | IGT_SPIN_USERPTR);
+		sendfd(sv[0], spin->out_fence);
+
+		igt_list_del(&spin->link); /* prevent autocleanup */
+	}
+	close(sv[0]);
+	igt_waitchildren();
+	flush_delayed_fput(i915);
+
+	fence = recvfd(sv[1]);
+	close(sv[1]);
+
+	igt_assert_eq(wait_for_status(fence, reset_timeout_ms), -EIO);
+	close(fence);
+
+	/* We have to manually clean up the orphaned spinner */
+	igt_drop_caches_set(i915, DROP_RESET_ACTIVE);
+
+	gem_quiescent_gpu(i915);
+}
+
 static void test_process_mixed(int pfd, unsigned int engine)
 {
 	int fence[2], sv[2];
@@ -1287,6 +1331,9 @@ igt_main
 	igt_subtest("processes")
 		test_processes(i915);
 
+	igt_subtest("userptr")
+		test_userptr(i915);
+
 	igt_subtest("hostile")
 		test_nohangcheck_hostile(i915);
 	igt_subtest("hang")
-- 
2.28.0



More information about the igt-dev mailing list