Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

test_ida: Convert check_ida_conv to new API

Move as much as possible to kernel space; leave the parts in user space
that rely on checking memory allocation failures to detect the
transition between an exceptional entry and a bitmap.

Signed-off-by: Matthew Wilcox <willy@infradead.org>

+40 -46
+30
lib/test_ida.c
··· 69 69 } 70 70 } 71 71 72 + /* 73 + * Check handling of conversions between exceptional entries and full bitmaps. 74 + */ 75 + static void ida_check_conv(struct ida *ida) 76 + { 77 + unsigned long i; 78 + 79 + for (i = 0; i < IDA_BITMAP_BITS * 2; i += IDA_BITMAP_BITS) { 80 + IDA_BUG_ON(ida, ida_alloc_min(ida, i + 1, GFP_KERNEL) != i + 1); 81 + IDA_BUG_ON(ida, ida_alloc_min(ida, i + BITS_PER_LONG, 82 + GFP_KERNEL) != i + BITS_PER_LONG); 83 + ida_free(ida, i + 1); 84 + ida_free(ida, i + BITS_PER_LONG); 85 + IDA_BUG_ON(ida, !ida_is_empty(ida)); 86 + } 87 + 88 + for (i = 0; i < IDA_BITMAP_BITS * 2; i++) 89 + IDA_BUG_ON(ida, ida_alloc(ida, GFP_KERNEL) != i); 90 + for (i = IDA_BITMAP_BITS * 2; i > 0; i--) 91 + ida_free(ida, i - 1); 92 + IDA_BUG_ON(ida, !ida_is_empty(ida)); 93 + 94 + for (i = 0; i < IDA_BITMAP_BITS + BITS_PER_LONG - 4; i++) 95 + IDA_BUG_ON(ida, ida_alloc(ida, GFP_KERNEL) != i); 96 + for (i = IDA_BITMAP_BITS + BITS_PER_LONG - 4; i > 0; i--) 97 + ida_free(ida, i - 1); 98 + IDA_BUG_ON(ida, !ida_is_empty(ida)); 99 + } 100 + 72 101 static int ida_checks(void) 73 102 { 74 103 DEFINE_IDA(ida); ··· 107 78 ida_check_leaf(&ida, 1024); 108 79 ida_check_leaf(&ida, 1024 * 64); 109 80 ida_check_max(&ida); 81 + ida_check_conv(&ida); 110 82 111 83 printk("IDA: %u of %u tests passed\n", tests_passed, tests_run); 112 84 return (tests_run != tests_passed) ? 0 : -EINVAL;
+10 -46
tools/testing/radix-tree/idr-test.c
··· 339 339 /* 340 340 * Check handling of conversions between exceptional entries and full bitmaps. 341 341 */ 342 - void ida_check_conv(void) 342 + void ida_check_conv_user(void) 343 343 { 344 344 DEFINE_IDA(ida); 345 - int id; 346 345 unsigned long i; 347 - 348 - for (i = 0; i < IDA_BITMAP_BITS * 2; i += IDA_BITMAP_BITS) { 349 - assert(ida_pre_get(&ida, GFP_KERNEL)); 350 - assert(!ida_get_new_above(&ida, i + 1, &id)); 351 - assert(id == i + 1); 352 - assert(!ida_get_new_above(&ida, i + BITS_PER_LONG, &id)); 353 - assert(id == i + BITS_PER_LONG); 354 - ida_remove(&ida, i + 1); 355 - ida_remove(&ida, i + BITS_PER_LONG); 356 - assert(ida_is_empty(&ida)); 357 - } 358 - 359 - assert(ida_pre_get(&ida, GFP_KERNEL)); 360 - 361 - for (i = 0; i < IDA_BITMAP_BITS * 2; i++) { 362 - assert(ida_pre_get(&ida, GFP_KERNEL)); 363 - assert(!ida_get_new(&ida, &id)); 364 - assert(id == i); 365 - } 366 - 367 - for (i = IDA_BITMAP_BITS * 2; i > 0; i--) { 368 - ida_remove(&ida, i - 1); 369 - } 370 - assert(ida_is_empty(&ida)); 371 - 372 - for (i = 0; i < IDA_BITMAP_BITS + BITS_PER_LONG - 4; i++) { 373 - assert(ida_pre_get(&ida, GFP_KERNEL)); 374 - assert(!ida_get_new(&ida, &id)); 375 - assert(id == i); 376 - } 377 - 378 - for (i = IDA_BITMAP_BITS + BITS_PER_LONG - 4; i > 0; i--) { 379 - ida_remove(&ida, i - 1); 380 - } 381 - assert(ida_is_empty(&ida)); 382 346 383 347 radix_tree_cpu_dead(1); 384 348 for (i = 0; i < 1000000; i++) { 385 - int err = ida_get_new(&ida, &id); 386 - if (err == -EAGAIN) { 387 - assert((i % IDA_BITMAP_BITS) == (BITS_PER_LONG - 2)); 388 - assert(ida_pre_get(&ida, GFP_KERNEL)); 389 - err = ida_get_new(&ida, &id); 349 + int id = ida_alloc(&ida, GFP_NOWAIT); 350 + if (id == -ENOMEM) { 351 + IDA_BUG_ON(&ida, (i % IDA_BITMAP_BITS) != 352 + BITS_PER_LONG - 2); 353 + id = ida_alloc(&ida, GFP_KERNEL); 390 354 } else { 391 - assert((i % IDA_BITMAP_BITS) != (BITS_PER_LONG - 2)); 355 + IDA_BUG_ON(&ida, (i % IDA_BITMAP_BITS) == 356 + BITS_PER_LONG - 2); 392 357 } 393 - assert(!err); 394 - assert(id == i); 358 + IDA_BUG_ON(&ida, id != i); 395 359 } 396 360 ida_destroy(&ida); 397 361 } ··· 471 507 ida_destroy(&ida); 472 508 assert(ida_is_empty(&ida)); 473 509 474 - ida_check_conv(); 510 + ida_check_conv_user(); 475 511 ida_check_random(); 476 512 ida_simple_get_remove_test(); 477 513