diff options
Diffstat (limited to 'tools/testing/radix-tree/idr-test.c')
| -rw-r--r-- | tools/testing/radix-tree/idr-test.c | 29 | 
1 files changed, 29 insertions, 0 deletions
diff --git a/tools/testing/radix-tree/idr-test.c b/tools/testing/radix-tree/idr-test.c index 8995092d541e..3b796dd5e577 100644 --- a/tools/testing/radix-tree/idr-test.c +++ b/tools/testing/radix-tree/idr-test.c @@ -523,8 +523,27 @@ static void *ida_random_fn(void *arg)  	return NULL;  } +static void *ida_leak_fn(void *arg) +{ +	struct ida *ida = arg; +	time_t s = time(NULL); +	int i, ret; + +	rcu_register_thread(); + +	do for (i = 0; i < 1000; i++) { +		ret = ida_alloc_range(ida, 128, 128, GFP_KERNEL); +		if (ret >= 0) +			ida_free(ida, 128); +	} while (time(NULL) < s + 2); + +	rcu_unregister_thread(); +	return NULL; +} +  void ida_thread_tests(void)  { +	DEFINE_IDA(ida);  	pthread_t threads[20];  	int i; @@ -536,6 +555,16 @@ void ida_thread_tests(void)  	while (i--)  		pthread_join(threads[i], NULL); + +	for (i = 0; i < ARRAY_SIZE(threads); i++) +		if (pthread_create(&threads[i], NULL, ida_leak_fn, &ida)) { +			perror("creating ida thread"); +			exit(1); +		} + +	while (i--) +		pthread_join(threads[i], NULL); +	assert(ida_is_empty(&ida));  }  void ida_tests(void)  | 
