[igt-dev] [PATCH i-g-t] core_hotplug: Teach the healthcheck how to check execution status
Chris Wilson
chris at chris-wilson.co.uk
Tue Sep 29 11:27:25 UTC 2020
Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/2476
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
tests/core_hotunplug.c | 51 +++++++++++++++++++++---------------------
1 file changed, 25 insertions(+), 26 deletions(-)
diff --git a/tests/core_hotunplug.c b/tests/core_hotunplug.c
index 67e67627f..70669c590 100644
--- a/tests/core_hotunplug.c
+++ b/tests/core_hotunplug.c
@@ -23,7 +23,6 @@
#include <fcntl.h>
#include <limits.h>
-#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
@@ -36,6 +35,7 @@
#include "igt_device_scan.h"
#include "igt_kmod.h"
#include "igt_sysfs.h"
+#include "sw_sync.h"
IGT_TEST_DESCRIPTION("Examine behavior of a driver on device hot unplug");
@@ -222,12 +222,22 @@ static bool local_i915_is_wedged(int i915)
return err == -EIO;
}
-static bool hang_detected = false;
-
-static void local_sig_abort(int sig)
+static int merge_fences(int old, int new)
{
- errno = 0; /* inside a signal, last errno reporting is confusing */
- hang_detected = true;
+ int merge;
+
+ if (new == -1)
+ return old;
+
+ if (old == -1)
+ return new;
+
+ merge = sync_fence_merge(old, new);
+ igt_assert(merge != -1);
+ close(old);
+ close(new);
+
+ return merge;
}
static int local_i915_healthcheck(int i915, const char *prefix)
@@ -239,36 +249,27 @@ static int local_i915_healthcheck(int i915, const char *prefix)
.buffer_count = 1,
};
const struct intel_execution_engine2 *engine;
-
- /* stop our hang detector possibly still running if we failed before */
- igt_stop_hang_detector();
-
- /* don't run again before GPU reset if hang has been already detected */
- if (hang_detected)
- return -EIO;
+ int fence = -1;
local_debug("%s%s\n", prefix, "running i915 GPU healthcheck");
-
if (local_i915_is_wedged(i915))
return -EIO;
obj.handle = gem_create(i915, 4096);
gem_write(i915, obj.handle, 0, &bbe, sizeof(bbe));
- igt_fork_hang_detector(i915);
- signal(SIGIO, local_sig_abort);
-
__for_each_physical_engine(i915, engine) {
- execbuf.flags = engine->flags;
- gem_execbuf(i915, &execbuf);
- }
+ execbuf.flags = engine->flags | I915_EXEC_FENCE_OUT;
+ gem_execbuf_wr(i915, &execbuf);
- gem_sync(i915, obj.handle);
+ fence = merge_fences(fence, execbuf.rsvd2 >> 32);
+ }
+ igt_assert(fence != -1);
gem_close(i915, obj.handle);
- igt_stop_hang_detector();
- if (hang_detected)
- return -EIO;
+ igt_assert_eq(sync_fence_wait(fence, -1), 0);
+ igt_assert_eq(sync_fence_status(fence), 1);
+ close(fence);
if (local_i915_is_wedged(i915))
return -EIO;
@@ -278,14 +279,12 @@ static int local_i915_healthcheck(int i915, const char *prefix)
static int local_i915_recover(int i915)
{
- hang_detected = false;
if (!local_i915_healthcheck(i915, "re-"))
return 0;
local_debug("%s\n", "forcing i915 GPU reset");
igt_force_gpu_reset(i915);
- hang_detected = false;
return local_i915_healthcheck(i915, "post-");
}
--
2.28.0
More information about the igt-dev
mailing list