[igt-dev] [PATCH i-g-t] lib: Cancel all outstanding requests at the start of a test

Kamil Konieczny kamil.konieczny at linux.intel.com
Mon Jun 5 18:36:12 UTC 2023


From: Chris Wilson <chris at chris-wilson.co.uk>

Currently, we try to cancel all outstanding requests at the end of a
test, as commit ("40de31df52ffed5e392d607a83e3aea4efb150e6")
  Author: Chris Wilson <chris at chris-wilson.co.uk>
  Date:   Fri Sep 7 09:27:20 2018 +0100

  lib: Cancel all outstanding requests at the end of a test

  Quite often on catastrophic failure the test leaves a long queue of
  unterminated batches pending execution. Each runs until hangcheck fires
  and skips onto the next, leaving us waiting for a very long time at test
  exit.

However, given that the runner may send a SIGKILL the atexist handler may
not be run, leaking the requests into the start of the next test where
we only wait for the requests to idle. Forcibly cancel those requests as
well.

v1: corrected description, fixed checkpatch error [Kamil]

Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Cc: Chris Wilson <chris.p.wilson at intel.com>
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Signed-off-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
---
 lib/drmtest.c | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index aa2e6b08f..b9f83bb29 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -603,6 +603,17 @@ static const char *chipset_to_str(int chipset)
 	}
 }
 
+static int __drm_reopen_driver(int fd)
+{
+	char path[256];
+
+	snprintf(path, sizeof(path), "/proc/self/fd/%d", fd);
+	fd = open(path, O_RDWR | O_CLOEXEC);
+	igt_assert_fd(fd);
+
+	return fd;
+}
+
 /**
  * drm_open_driver:
  * @chipset: OR'd flags for each chipset to search, eg. #DRIVER_INTEL
@@ -627,9 +638,8 @@ int drm_open_driver(int chipset)
 	 */
 	if (is_i915_device(fd)) {
 		if (__sync_fetch_and_add(&open_count, 1) == 0) {
-			gem_quiescent_gpu(fd);
-
-			at_exit_drm_fd = __drm_open_driver(chipset);
+			__cancel_work_at_exit(fd);
+			at_exit_drm_fd = __drm_reopen_driver(fd);
 			igt_install_exit_handler(cancel_work_at_exit);
 		}
 	}
@@ -676,9 +686,9 @@ int drm_open_driver_render(int chipset)
 	if (__sync_fetch_and_add(&open_count, 1))
 		return fd;
 
-	at_exit_drm_render_fd = __drm_open_driver(chipset);
-	if(chipset & DRIVER_INTEL){
-		gem_quiescent_gpu(fd);
+	at_exit_drm_render_fd = __drm_reopen_driver(fd);
+	if (chipset & DRIVER_INTEL) {
+		__cancel_work_at_exit(fd);
 		igt_install_exit_handler(cancel_work_at_exit_render);
 	}
 
-- 
2.39.2



More information about the igt-dev mailing list