summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTvrtko Ursulin <tvrtko.ursulin@linux.intel.com>2014-07-22 11:14:51 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2014-07-24 09:31:31 +0100
commit8b3ded404c25bf23221e3b5ff2cc873107185781 (patch)
treef8853c2d5a375c712596e3dc36b2040a4f73877f
parent700bdf1401f1596d25024fd1038e782708bf39e5 (diff)
igt/gem_userptr_blits: Fix multi-threaded mm stress tester
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@intel.com> Cc: Tim Gore <tim.gore@intel.com> Reviewed-by: Tim Gore <tim.gore@intel.com>
-rw-r--r--tests/gem_userptr_blits.c37
1 files changed, 26 insertions, 11 deletions
diff --git a/tests/gem_userptr_blits.c b/tests/gem_userptr_blits.c
index 3d045a7d..54134094 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;