> -----Original Message-----
> From: Tvrtko Ursulin [mailto:tvrtko.ursu...@linux.intel.com]
> Sent: Tuesday, July 22, 2014 11:15 AM
> To: Intel-gfx@lists.freedesktop.org
> Cc: Tvrtko Ursulin; Ursulin, Tvrtko; Gore, Tim
> Subject: [PATCH] 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.ursu...@intel.com>
> Cc: Tim Gore <tim.g...@intel.com>
Reviewed-by: Tim Gore <tim.g...@intel.com>

Builds for Android now, and stress-mm test passes on linux. Fails for Android 
but this is a different issue.

> ---
>  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@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to