[PATCH] igt/gem_userptr_blits: Fix multi-threaded mm stress tester

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Two parts to the fix:
  1. Do not use pthread_cancel since not available on Android.
  2. Do not assert in the thread since that does not get propagated
     to the process. Rather pass out any failures so we know test
     did not work as expected.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx>
Cc: Tim Gore <tim.gore@xxxxxxxxx>
---
 tests/gem_userptr_blits.c | 37 ++++++++++++++++++++++++++-----------
 1 file changed, 26 insertions(+), 11 deletions(-)

diff --git a/tests/gem_userptr_blits.c b/tests/gem_userptr_blits.c
index 2a52856..3277096 100644
--- a/tests/gem_userptr_blits.c
+++ b/tests/gem_userptr_blits.c
@@ -1137,21 +1137,32 @@ static void test_unmap_cycles(int fd, int expected)
 		test_unmap(fd, expected);
 }
 
+struct stress_thread_data {
+	unsigned int stop;
+	int exit_code;
+};
+
 static void *mm_stress_thread(void *data)
 {
-        void *ptr;
-        int ret;
+	struct stress_thread_data *stdata = (struct stress_thread_data *)data;
+	void *ptr;
+	int ret;
 
-	for (;;) {
+	while (!stdata->stop) {
 		ptr = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE,
 				MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
-		igt_assert(ptr != MAP_FAILED);
+		if (ptr == MAP_FAILED) {
+			stdata->exit_code = -EFAULT;
+			break;
+		}
 		ret = munmap(ptr, PAGE_SIZE);
-		igt_assert(ret == 0);
-		pthread_testcancel();
-        }
+		if (ret) {
+		        stdata->exit_code = errno;
+		        break;
+		}
+	}
 
-        return NULL;
+	return NULL;
 }
 
 static void test_stress_mm(int fd)
@@ -1161,10 +1172,13 @@ static void test_stress_mm(int fd)
 	unsigned int loops = 100000;
 	uint32_t handle;
 	void *ptr;
+	struct stress_thread_data stdata;
+
+	memset(&stdata, 0, sizeof(stdata));
 
 	igt_assert(posix_memalign(&ptr, PAGE_SIZE, PAGE_SIZE) == 0);
 
-	ret = pthread_create(&t, NULL, mm_stress_thread, NULL);
+	ret = pthread_create(&t, NULL, mm_stress_thread, &stdata);
 	igt_assert(ret == 0);
 
 	while (loops--) {
@@ -1176,10 +1190,11 @@ static void test_stress_mm(int fd)
 
 	free(ptr);
 
-	ret = pthread_cancel(t);
-	igt_assert(ret == 0);
+	stdata.stop = 1;
 	ret = pthread_join(t, NULL);
 	igt_assert(ret == 0);
+
+	igt_assert(stdata.exit_code == 0);
 }
 
 unsigned int total_ram;
-- 
1.9.3

_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux