[Intel-gfx] [PATCH] igt/gem_userptr_blits: Fix multi-threaded mm stress tester
Gore, Tim
tim.gore at intel.com
Tue Jul 22 13:23:46 CEST 2014
Builds ok for Android now. I get an assert when I run it on MRD7/Gmin but
This may be expected. I'll put it on my list of tests to look into.
Tim
> -----Original Message-----
> From: Tvrtko Ursulin [mailto:tvrtko.ursulin at linux.intel.com]
> Sent: Tuesday, July 22, 2014 11:15 AM
> To: Intel-gfx at 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.ursulin at intel.com>
> Cc: Tim Gore <tim.gore at intel.com>
> ---
> 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
More information about the Intel-gfx
mailing list