aboutsummaryrefslogtreecommitdiffstats
path: root/tools/testing/radix-tree/idr-test.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/testing/radix-tree/idr-test.c')
-rw-r--r--tools/testing/radix-tree/idr-test.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/tools/testing/radix-tree/idr-test.c b/tools/testing/radix-tree/idr-test.c
index 698c08f851b8..8995092d541e 100644
--- a/tools/testing/radix-tree/idr-test.c
+++ b/tools/testing/radix-tree/idr-test.c
@@ -279,6 +279,51 @@ static void idr_align_test(struct idr *idr)
279 } 279 }
280} 280}
281 281
282DEFINE_IDR(find_idr);
283
284static void *idr_throbber(void *arg)
285{
286 time_t start = time(NULL);
287 int id = *(int *)arg;
288
289 rcu_register_thread();
290 do {
291 idr_alloc(&find_idr, xa_mk_value(id), id, id + 1, GFP_KERNEL);
292 idr_remove(&find_idr, id);
293 } while (time(NULL) < start + 10);
294 rcu_unregister_thread();
295
296 return NULL;
297}
298
299void idr_find_test_1(int anchor_id, int throbber_id)
300{
301 pthread_t throbber;
302 time_t start = time(NULL);
303
304 pthread_create(&throbber, NULL, idr_throbber, &throbber_id);
305
306 BUG_ON(idr_alloc(&find_idr, xa_mk_value(anchor_id), anchor_id,
307 anchor_id + 1, GFP_KERNEL) != anchor_id);
308
309 do {
310 int id = 0;
311 void *entry = idr_get_next(&find_idr, &id);
312 BUG_ON(entry != xa_mk_value(id));
313 } while (time(NULL) < start + 11);
314
315 pthread_join(throbber, NULL);
316
317 idr_remove(&find_idr, anchor_id);
318 BUG_ON(!idr_is_empty(&find_idr));
319}
320
321void idr_find_test(void)
322{
323 idr_find_test_1(100000, 0);
324 idr_find_test_1(0, 100000);
325}
326
282void idr_checks(void) 327void idr_checks(void)
283{ 328{
284 unsigned long i; 329 unsigned long i;
@@ -360,6 +405,7 @@ void idr_checks(void)
360 idr_u32_test(1); 405 idr_u32_test(1);
361 idr_u32_test(0); 406 idr_u32_test(0);
362 idr_align_test(&idr); 407 idr_align_test(&idr);
408 idr_find_test();
363} 409}
364 410
365#define module_init(x) 411#define module_init(x)