[igt-dev] [PATCH i-g-t] tests/xe_vm: make sure test can finish within time

Chang, Bruce yu.bruce.chang at intel.com
Tue Apr 11 19:45:55 UTC 2023


the BAT takes a lot longer (> 48s) than expected (~5s). This seems
due to the system is too busy to wake up the main thread which is in
sleep.

So, change the test to run in a timeout instead of relying on main
thread.

on another hand, also change the logic to make sure all threads start
together.

Cc: Niranjana Vishwanathapura <niranjana.vishwanathapura at intel.com>
Signed-off-by: Bruce Chang <yu.bruce.chang at intel.com>
---
 tests/xe/xe_prime_self_import.c | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/tests/xe/xe_prime_self_import.c b/tests/xe/xe_prime_self_import.c
index 5710cff92..fb677b50b 100644
--- a/tests/xe/xe_prime_self_import.c
+++ b/tests/xe/xe_prime_self_import.c
@@ -58,7 +58,8 @@ IGT_TEST_DESCRIPTION("Check whether prime import/export works on the same"
 #define BO_SIZE (16*1024)
 
 static char counter;
-volatile int pls_die = 0;
+static int g_time_out = 5;
+static pthread_barrier_t g_barrier;
 
 static void
 check_bo(int fd1, uint32_t handle1, int fd2, uint32_t handle2)
@@ -272,7 +273,9 @@ static void *thread_fn_reimport_vs_close(void *p)
 	int dma_buf_fd = fds[1];
 	uint32_t handle;
 
-	while (!pls_die) {
+	pthread_barrier_wait(&g_barrier);
+
+	igt_until_timeout(g_time_out) {
 		handle = prime_fd_to_handle(fd, dma_buf_fd);
 
 		close_bo.handle = handle;
@@ -306,6 +309,7 @@ static void *thread_fn_reimport_vs_close(void *p)
 	obj_count = 0;
 
 	num_threads = sysconf(_SC_NPROCESSORS_ONLN);
+	igt_info("create %d threads\n", num_threads);
 
 	threads = calloc(num_threads, sizeof(pthread_t));
 
@@ -315,6 +319,7 @@ static void *thread_fn_reimport_vs_close(void *p)
 	handle = xe_bo_create(fds[0], 0, 0, BO_SIZE);
 
 	fds[1] = prime_handle_to_fd(fds[0], handle);
+	pthread_barrier_init(&g_barrier, NULL, num_threads);
 
 	for (i = 0; i < num_threads; i++) {
 		r = pthread_create(&threads[i], NULL,
@@ -323,15 +328,12 @@ static void *thread_fn_reimport_vs_close(void *p)
 		igt_assert_eq(r, 0);
 	}
 
-	sleep(5);
-
-	pls_die = 1;
-
 	for (i = 0;  i < num_threads; i++) {
 		pthread_join(threads[i], &status);
 		igt_assert(status == 0);
 	}
 
+	pthread_barrier_destroy(&g_barrier);
 	xe_device_put(fds[0]);
 	close(fds[0]);
 	close(fds[1]);
@@ -353,7 +355,9 @@ static void *thread_fn_export_vs_close(void *p)
 	int fd = (uintptr_t)p;
 	uint32_t handle;
 
-	while (!pls_die) {
+	pthread_barrier_wait(&g_barrier);
+
+	igt_until_timeout(g_time_out) {
 		/* We want to race gem close against prime export on handle one.*/
 		handle = xe_bo_create(fd, 0, 0, 4096);
 		if (handle != 1)
@@ -395,6 +399,7 @@ static void test_export_close_race(void)
 	int fake;
 
 	num_threads = sysconf(_SC_NPROCESSORS_ONLN);
+	igt_info("create %d threads\n", num_threads);
 
 	threads = calloc(num_threads, sizeof(pthread_t));
 
@@ -408,6 +413,7 @@ static void test_export_close_race(void)
 
 	fd = drm_open_driver(DRIVER_XE);
 	xe_device_get(fd);
+	pthread_barrier_init(&g_barrier, NULL, num_threads);
 
 	for (i = 0; i < num_threads; i++) {
 		r = pthread_create(&threads[i], NULL,
@@ -416,15 +422,12 @@ static void test_export_close_race(void)
 		igt_assert_eq(r, 0);
 	}
 
-	sleep(5);
-
-	pls_die = 1;
-
 	for (i = 0;  i < num_threads; i++) {
 		pthread_join(threads[i], &status);
 		igt_assert(status == 0);
 	}
 
+	pthread_barrier_destroy(&g_barrier);
 	xe_device_put(fd);
 	close(fd);
 
-- 
2.25.1



More information about the igt-dev mailing list