[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
Mon Apr 22 14:19:56 UTC 2024


On Mon, Apr 22, 2024 at 03:56:04PM +0200, Kamil Konieczny wrote:
> 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.

Eh, good catch. I'll fix it and resend.

--
Zbigniew

> 
> 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