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

Gore, Tim tim.gore at intel.com
Thu Jul 24 10:19:19 CEST 2014


> -----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>
Reviewed-by: Tim Gore <tim.gore at 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




More information about the Intel-gfx mailing list