diff options
Diffstat (limited to 'tools/testing/radix-tree/idr-test.c')
| -rw-r--r-- | tools/testing/radix-tree/idr-test.c | 21 | 
1 files changed, 18 insertions, 3 deletions
| diff --git a/tools/testing/radix-tree/idr-test.c b/tools/testing/radix-tree/idr-test.c index 3b796dd5e577..ca24f6839d50 100644 --- a/tools/testing/radix-tree/idr-test.c +++ b/tools/testing/radix-tree/idr-test.c @@ -296,21 +296,34 @@ static void *idr_throbber(void *arg)  	return NULL;  } +/* + * There are always either 1 or 2 objects in the IDR.  If we find nothing, + * or we find something at an ID we didn't expect, that's a bug. + */  void idr_find_test_1(int anchor_id, int throbber_id)  {  	pthread_t throbber;  	time_t start = time(NULL); -	pthread_create(&throbber, NULL, idr_throbber, &throbber_id); -  	BUG_ON(idr_alloc(&find_idr, xa_mk_value(anchor_id), anchor_id,  				anchor_id + 1, GFP_KERNEL) != anchor_id); +	pthread_create(&throbber, NULL, idr_throbber, &throbber_id); + +	rcu_read_lock();  	do {  		int id = 0;  		void *entry = idr_get_next(&find_idr, &id); -		BUG_ON(entry != xa_mk_value(id)); +		rcu_read_unlock(); +		if ((id != anchor_id && id != throbber_id) || +		    entry != xa_mk_value(id)) { +			printf("%s(%d, %d): %p at %d\n", __func__, anchor_id, +				throbber_id, entry, id); +			abort(); +		} +		rcu_read_lock();  	} while (time(NULL) < start + 11); +	rcu_read_unlock();  	pthread_join(throbber, NULL); @@ -577,6 +590,7 @@ void ida_tests(void)  int __weak main(void)  { +	rcu_register_thread();  	radix_tree_init();  	idr_checks();  	ida_tests(); @@ -584,5 +598,6 @@ int __weak main(void)  	rcu_barrier();  	if (nr_allocated)  		printf("nr_allocated = %d\n", nr_allocated); +	rcu_unregister_thread();  	return 0;  } |