[igt-dev] [PATCH i-g-t] i915/i915_hangman: fail only after freeing spinners

Kamil Konieczny kamil.konieczny at linux.intel.com
Wed Aug 3 19:13:34 UTC 2022


Failed checks may cause following tests fail, so check for
errors only after all spinners are released.

Cc: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
Signed-off-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
---
 tests/i915/i915_hangman.c | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/tests/i915/i915_hangman.c b/tests/i915/i915_hangman.c
index c7d69fdd..34346daa 100644
--- a/tests/i915/i915_hangman.c
+++ b/tests/i915/i915_hangman.c
@@ -295,6 +295,12 @@ static void context_unban(int fd, unsigned ctx)
 	gem_context_set_param(fd, &param);
 }
 
+#define ERR_HANG_WAIT 0
+#define ERR_HANG_STAT 1
+#define ERR_FENCE_BUSY 2
+#define ERR_FENCE_END  3
+#define ERR_FENCE_STAT 4
+
 static void
 test_engine_hang(const intel_ctx_t *ctx,
 		 const struct intel_execution_engine2 *e, unsigned int flags)
@@ -305,6 +311,7 @@ test_engine_hang(const intel_ctx_t *ctx,
 	IGT_LIST_HEAD(list);
 	uint64_t ahnd = get_reloc_ahnd(device, ctx->id), ahndN;
 	int num_ctx;
+	int err[5] = { 0, 0, 0, 0, 0 };
 
 	igt_skip_on(flags & IGT_SPIN_INVALID_CS &&
 		    gem_engine_has_cmdparser(device, &ctx->cfg, e->flags));
@@ -340,18 +347,21 @@ test_engine_hang(const intel_ctx_t *ctx,
 				      flags));
 
 	/* Wait for the hangcheck to terminate the hanger */
-	igt_assert(sync_fence_wait(spin->out_fence, 30000) == 0); /* 30s */
-	igt_assert_eq(sync_fence_status(spin->out_fence), -EIO);
+	err[ERR_HANG_WAIT] = sync_fence_wait(spin->out_fence, 30000); /* 30s */
+	err[ERR_HANG_STAT] = sync_fence_status(spin->out_fence);
 	igt_spin_free(device, spin);
 
 	/* But no other engines/clients should be affected */
 	igt_list_for_each_entry_safe(spin, next, &list, link) {
 		ahndN = spin->opts.ahnd;
-		igt_assert(sync_fence_wait(spin->out_fence, 0) == -ETIME);
+		if (sync_fence_wait(spin->out_fence, 0) != -ETIME)
+			err[ERR_FENCE_BUSY]++;
 		igt_spin_end(spin);
 
-		igt_assert(sync_fence_wait(spin->out_fence, 500) == 0);
-		igt_assert_eq(sync_fence_status(spin->out_fence), 1);
+		if (sync_fence_wait(spin->out_fence, 500) != 0)
+			err[ERR_FENCE_END]++;
+		if (sync_fence_status(spin->out_fence) != 1)
+			err[ERR_FENCE_STAT]++;
 		igt_spin_free(device, spin);
 		put_ahnd(ahndN);
 	}
@@ -360,6 +370,11 @@ test_engine_hang(const intel_ctx_t *ctx,
 	while (num_ctx)
 		intel_ctx_destroy(device, local_ctx[--num_ctx]);
 
+	igt_assert_eq(err[ERR_HANG_WAIT], 0);
+	igt_assert_eq(err[ERR_HANG_STAT], -EIO);
+	igt_assert_eq(err[ERR_FENCE_BUSY], 0);
+	igt_assert_eq(err[ERR_FENCE_END], 0);
+	igt_assert_eq(err[ERR_FENCE_STAT], 0);
 	check_alive();
 }
 
-- 
2.34.1



More information about the igt-dev mailing list