summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Kempczyński <zbigniew.kempczynski@intel.com>2024-04-22 16:47:13 +0200
committerZbigniew Kempczyński <zbigniew.kempczynski@intel.com>2024-04-23 08:15:08 +0200
commit2e8f3e06fbd7335cf65a93115c72f0e167a570a2 (patch)
treec4fe349fd0ea1088146f79bd107c696b7c72ffaf
parentd5d516bfdf77898e934b4c7ed947a43711cfb226 (diff)
tests/xe_evict|exec_threads: Use fd reopen to avoid corrupting global data
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. Cc: Matthew Brost <matthew.brost@intel.com> Cc: Kamil Konieczny <kamil.konieczny@linux.intel.com> Reviewed-by: Kamil Konieczny <kamil.konieczny@linux.intel.com> Link: https://lore.kernel.org/r/20240422144713.76025-1-zbigniew.kempczynski@intel.com Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
-rw-r--r--tests/intel/xe_evict.c10
-rw-r--r--tests/intel/xe_exec_threads.c22
2 files changed, 13 insertions, 19 deletions
diff --git a/tests/intel/xe_evict.c b/tests/intel/xe_evict.c
index 8ef55211f..5994ebb14 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)
@@ -241,7 +241,7 @@ test_evict_cm(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, DRM_XE_VM_CREATE_FLAG_LR_MODE, 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 8083980f9..1e80842b9 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;