[PATCH i-g-t] tests/xe_evict|exec_threads: Use fd reopen to avoid corrupting global data
Kamil Konieczny
kamil.konieczny at linux.intel.com
Mon Apr 22 13:56:04 UTC 2024
Hi Zbigniew,
On 2024-04-17 at 16:26:07 +0200, Zbigniew Kempczyński wrote:
> 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);
>
I checked xe_evict again just to be sure and there are
two opens (not counting one from fixture):
grep -n open_driver tests/intel/xe_evict.c
64: fd = drm_reopen_driver(fd);
244: fd = drm_open_driver(DRIVER_XE);
imho that second one could also be called in multi-threaded version
from thread() function, so line 244 should also be fixed into reopen.
You can keep my r-b with fixed version.
Regards,
Kamil
> 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