[PATCH i-g-t] tests/xe_evict|exec_threads: Use fd reopen to avoid corrupting global data

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Wed Apr 17 14:26:07 UTC 2024


Device scanning and filtering was designed to work in multi-process
environment. Due to that opening the device with drm_open_driver()
in multiple threads lead to global device data corruption.

At the moment there's no easy way to redesign this so simplest thing
we may do is to just acquire device fd in main process and reopen it
(this doesn't involve any device scanning) in spawned threads.

Lets use drm_reopen_driver() to stop calling not thread-safe code.

Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
Cc: Matthew Brost <matthew.brost at intel.com>
---
 tests/intel/xe_evict.c        |  8 ++++----
 tests/intel/xe_exec_threads.c | 22 ++++++++--------------
 2 files changed, 12 insertions(+), 18 deletions(-)

diff --git a/tests/intel/xe_evict.c b/tests/intel/xe_evict.c
index 8ef55211f7..9b97cccab2 100644
--- a/tests/intel/xe_evict.c
+++ b/tests/intel/xe_evict.c
@@ -61,7 +61,7 @@ test_evict(int fd, struct drm_xe_engine_class_instance *eci,
 	bo = calloc(n_execs / 2, sizeof(*bo));
 	igt_assert(bo);
 
-	fd = drm_open_driver(DRIVER_XE);
+	fd = drm_reopen_driver(fd);
 
 	vm = xe_vm_create(fd, 0, 0);
 	if (flags & BIND_EXEC_QUEUE)
@@ -769,21 +769,21 @@ igt_main
 
 	for (const struct section *s = sections; s->name; s++) {
 		igt_subtest_f("evict-%s", s->name)
-			test_evict(-1, hwe, s->n_exec_queues, s->n_execs,
+			test_evict(fd, hwe, s->n_exec_queues, s->n_execs,
 				   calc_bo_size(vram_size, s->mul, s->div),
 				   s->flags, NULL);
 	}
 
 	for (const struct section_cm *s = sections_cm; s->name; s++) {
 		igt_subtest_f("evict-%s", s->name)
-			test_evict_cm(-1, hwe, s->n_exec_queues, s->n_execs,
+			test_evict_cm(fd, hwe, s->n_exec_queues, s->n_execs,
 				      calc_bo_size(vram_size, s->mul, s->div),
 				      s->flags, NULL);
 	}
 
 	for (const struct section_threads *s = sections_threads; s->name; s++) {
 		igt_subtest_f("evict-%s", s->name)
-			threads(-1, hwe, s->n_threads, s->n_exec_queues,
+			threads(fd, hwe, s->n_threads, s->n_exec_queues,
 				 s->n_execs,
 				 calc_bo_size(vram_size, s->mul, s->div),
 				 s->flags);
diff --git a/tests/intel/xe_exec_threads.c b/tests/intel/xe_exec_threads.c
index 8083980f90..1e80842b98 100644
--- a/tests/intel/xe_exec_threads.c
+++ b/tests/intel/xe_exec_threads.c
@@ -71,8 +71,8 @@ test_balancer(int fd, int gt, uint32_t vm, uint64_t addr, uint64_t userptr,
 
 	igt_assert(n_exec_queues <= MAX_N_EXEC_QUEUES);
 
-	if (!fd) {
-		fd = drm_open_driver(DRIVER_XE);
+	if (flags & FD) {
+		fd = drm_reopen_driver(fd);
 		owns_fd = true;
 	}
 
@@ -273,8 +273,8 @@ test_compute_mode(int fd, uint32_t vm, uint64_t addr, uint64_t userptr,
 
 	igt_assert(n_exec_queues <= MAX_N_EXEC_QUEUES);
 
-	if (!fd) {
-		fd = drm_open_driver(DRIVER_XE);
+	if (flags & FD) {
+		fd = drm_reopen_driver(fd);
 		owns_fd = true;
 	}
 
@@ -477,8 +477,8 @@ test_legacy_mode(int fd, uint32_t vm, uint64_t addr, uint64_t userptr,
 
 	igt_assert(n_exec_queues <= MAX_N_EXEC_QUEUES);
 
-	if (!fd) {
-		fd = drm_open_driver(DRIVER_XE);
+	if (flags & FD) {
+		fd = drm_reopen_driver(fd);
 		owns_fd = true;
 	}
 
@@ -995,10 +995,7 @@ static void threads(int fd, int flags)
 #define ADDRESS_SHIFT	39
 		threads_data[i].addr = addr | (i << ADDRESS_SHIFT);
 		threads_data[i].userptr = userptr | (i << ADDRESS_SHIFT);
-		if (flags & FD)
-			threads_data[i].fd = 0;
-		else
-			threads_data[i].fd = fd;
+		threads_data[i].fd = fd;
 		threads_data[i].vm_legacy_mode = vm_legacy_mode;
 		threads_data[i].vm_compute_mode = vm_compute_mode;
 		threads_data[i].eci = hwe;
@@ -1046,10 +1043,7 @@ static void threads(int fd, int flags)
 						threads_data[i].addr = addr;
 					threads_data[i].userptr = userptr |
 						(i << ADDRESS_SHIFT);
-					if (flags & FD)
-						threads_data[i].fd = 0;
-					else
-						threads_data[i].fd = fd;
+					threads_data[i].fd = fd;
 					threads_data[i].gt = gt;
 					threads_data[i].vm_legacy_mode =
 						vm_legacy_mode;
-- 
2.34.1



More information about the igt-dev mailing list