diff options
Diffstat (limited to 'tools/testing/radix-tree/idr-test.c')
-rw-r--r-- | tools/testing/radix-tree/idr-test.c | 46 |
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 | ||
282 | DEFINE_IDR(find_idr); | ||
283 | |||
284 | static 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 | |||
299 | void 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 | |||
321 | void idr_find_test(void) | ||
322 | { | ||
323 | idr_find_test_1(100000, 0); | ||
324 | idr_find_test_1(0, 100000); | ||
325 | } | ||
326 | |||
282 | void idr_checks(void) | 327 | void 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) |