Loading lib/test_ida.c +54 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,58 @@ void ida_dump(struct ida *ida) { } } \ } while (0) /* * Straightforward checks that allocating and freeing IDs work. */ static void ida_check_alloc(struct ida *ida) { int i, id; for (i = 0; i < 10000; i++) IDA_BUG_ON(ida, ida_alloc(ida, GFP_KERNEL) != i); ida_free(ida, 20); ida_free(ida, 21); for (i = 0; i < 3; i++) { id = ida_alloc(ida, GFP_KERNEL); IDA_BUG_ON(ida, id < 0); if (i == 2) IDA_BUG_ON(ida, id != 10000); } for (i = 0; i < 5000; i++) ida_free(ida, i); IDA_BUG_ON(ida, ida_alloc_min(ida, 5000, GFP_KERNEL) != 10001); ida_destroy(ida); IDA_BUG_ON(ida, !ida_is_empty(ida)); } /* Destroy an IDA with a single entry at @base */ static void ida_check_destroy_1(struct ida *ida, unsigned int base) { IDA_BUG_ON(ida, ida_alloc_min(ida, base, GFP_KERNEL) != base); IDA_BUG_ON(ida, ida_is_empty(ida)); ida_destroy(ida); IDA_BUG_ON(ida, !ida_is_empty(ida)); } /* Check that ida_destroy and ida_is_empty work */ static void ida_check_destroy(struct ida *ida) { /* Destroy an already-empty IDA */ IDA_BUG_ON(ida, !ida_is_empty(ida)); ida_destroy(ida); IDA_BUG_ON(ida, !ida_is_empty(ida)); ida_check_destroy_1(ida, 0); ida_check_destroy_1(ida, 1); ida_check_destroy_1(ida, 1023); ida_check_destroy_1(ida, 1024); ida_check_destroy_1(ida, 12345678); } /* * Check what happens when we fill a leaf and then delete it. This may * discover mishandling of IDR_FREE. Loading Loading @@ -103,6 +155,8 @@ static int ida_checks(void) DEFINE_IDA(ida); IDA_BUG_ON(&ida, !ida_is_empty(&ida)); ida_check_alloc(&ida); ida_check_destroy(&ida); ida_check_leaf(&ida, 0); ida_check_leaf(&ida, 1024); ida_check_leaf(&ida, 1024 * 64); Loading tools/testing/radix-tree/idr-test.c +4 −66 Original line number Diff line number Diff line Loading @@ -364,7 +364,6 @@ void ida_check_random(void) { DEFINE_IDA(ida); DECLARE_BITMAP(bitmap, 2048); int id, err; unsigned int i; time_t s = time(NULL); Loading @@ -375,15 +374,11 @@ void ida_check_random(void) int bit = i & 2047; if (test_bit(bit, bitmap)) { __clear_bit(bit, bitmap); ida_remove(&ida, bit); ida_free(&ida, bit); } else { __set_bit(bit, bitmap); do { ida_pre_get(&ida, GFP_KERNEL); err = ida_get_new_above(&ida, bit, &id); } while (err == -EAGAIN); assert(!err); assert(id == bit); IDA_BUG_ON(&ida, ida_alloc_min(&ida, bit, GFP_KERNEL) != bit); } } ida_destroy(&ida); Loading Loading @@ -411,66 +406,9 @@ void ida_simple_get_remove_test(void) void user_ida_checks(void) { DEFINE_IDA(ida); int id; unsigned long i; radix_tree_cpu_dead(1); ida_check_nomem(); for (i = 0; i < 10000; i++) { assert(ida_pre_get(&ida, GFP_KERNEL)); assert(!ida_get_new(&ida, &id)); assert(id == i); } ida_remove(&ida, 20); ida_remove(&ida, 21); for (i = 0; i < 3; i++) { assert(ida_pre_get(&ida, GFP_KERNEL)); assert(!ida_get_new(&ida, &id)); if (i == 2) assert(id == 10000); } for (i = 0; i < 5000; i++) ida_remove(&ida, i); assert(ida_pre_get(&ida, GFP_KERNEL)); assert(!ida_get_new_above(&ida, 5000, &id)); assert(id == 10001); ida_destroy(&ida); assert(ida_is_empty(&ida)); assert(ida_pre_get(&ida, GFP_KERNEL)); assert(!ida_get_new_above(&ida, 1, &id)); assert(id == 1); ida_remove(&ida, id); assert(ida_is_empty(&ida)); ida_destroy(&ida); assert(ida_is_empty(&ida)); assert(ida_pre_get(&ida, GFP_KERNEL)); assert(!ida_get_new_above(&ida, 1, &id)); ida_destroy(&ida); assert(ida_is_empty(&ida)); assert(ida_pre_get(&ida, GFP_KERNEL)); assert(!ida_get_new_above(&ida, 1, &id)); assert(id == 1); assert(ida_pre_get(&ida, GFP_KERNEL)); assert(!ida_get_new_above(&ida, 1025, &id)); assert(id == 1025); assert(ida_pre_get(&ida, GFP_KERNEL)); assert(!ida_get_new_above(&ida, 10000, &id)); assert(id == 10000); ida_remove(&ida, 1025); ida_destroy(&ida); assert(ida_is_empty(&ida)); ida_check_nomem(); ida_check_conv_user(); ida_check_random(); ida_simple_get_remove_test(); Loading Loading
lib/test_ida.c +54 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,58 @@ void ida_dump(struct ida *ida) { } } \ } while (0) /* * Straightforward checks that allocating and freeing IDs work. */ static void ida_check_alloc(struct ida *ida) { int i, id; for (i = 0; i < 10000; i++) IDA_BUG_ON(ida, ida_alloc(ida, GFP_KERNEL) != i); ida_free(ida, 20); ida_free(ida, 21); for (i = 0; i < 3; i++) { id = ida_alloc(ida, GFP_KERNEL); IDA_BUG_ON(ida, id < 0); if (i == 2) IDA_BUG_ON(ida, id != 10000); } for (i = 0; i < 5000; i++) ida_free(ida, i); IDA_BUG_ON(ida, ida_alloc_min(ida, 5000, GFP_KERNEL) != 10001); ida_destroy(ida); IDA_BUG_ON(ida, !ida_is_empty(ida)); } /* Destroy an IDA with a single entry at @base */ static void ida_check_destroy_1(struct ida *ida, unsigned int base) { IDA_BUG_ON(ida, ida_alloc_min(ida, base, GFP_KERNEL) != base); IDA_BUG_ON(ida, ida_is_empty(ida)); ida_destroy(ida); IDA_BUG_ON(ida, !ida_is_empty(ida)); } /* Check that ida_destroy and ida_is_empty work */ static void ida_check_destroy(struct ida *ida) { /* Destroy an already-empty IDA */ IDA_BUG_ON(ida, !ida_is_empty(ida)); ida_destroy(ida); IDA_BUG_ON(ida, !ida_is_empty(ida)); ida_check_destroy_1(ida, 0); ida_check_destroy_1(ida, 1); ida_check_destroy_1(ida, 1023); ida_check_destroy_1(ida, 1024); ida_check_destroy_1(ida, 12345678); } /* * Check what happens when we fill a leaf and then delete it. This may * discover mishandling of IDR_FREE. Loading Loading @@ -103,6 +155,8 @@ static int ida_checks(void) DEFINE_IDA(ida); IDA_BUG_ON(&ida, !ida_is_empty(&ida)); ida_check_alloc(&ida); ida_check_destroy(&ida); ida_check_leaf(&ida, 0); ida_check_leaf(&ida, 1024); ida_check_leaf(&ida, 1024 * 64); Loading
tools/testing/radix-tree/idr-test.c +4 −66 Original line number Diff line number Diff line Loading @@ -364,7 +364,6 @@ void ida_check_random(void) { DEFINE_IDA(ida); DECLARE_BITMAP(bitmap, 2048); int id, err; unsigned int i; time_t s = time(NULL); Loading @@ -375,15 +374,11 @@ void ida_check_random(void) int bit = i & 2047; if (test_bit(bit, bitmap)) { __clear_bit(bit, bitmap); ida_remove(&ida, bit); ida_free(&ida, bit); } else { __set_bit(bit, bitmap); do { ida_pre_get(&ida, GFP_KERNEL); err = ida_get_new_above(&ida, bit, &id); } while (err == -EAGAIN); assert(!err); assert(id == bit); IDA_BUG_ON(&ida, ida_alloc_min(&ida, bit, GFP_KERNEL) != bit); } } ida_destroy(&ida); Loading Loading @@ -411,66 +406,9 @@ void ida_simple_get_remove_test(void) void user_ida_checks(void) { DEFINE_IDA(ida); int id; unsigned long i; radix_tree_cpu_dead(1); ida_check_nomem(); for (i = 0; i < 10000; i++) { assert(ida_pre_get(&ida, GFP_KERNEL)); assert(!ida_get_new(&ida, &id)); assert(id == i); } ida_remove(&ida, 20); ida_remove(&ida, 21); for (i = 0; i < 3; i++) { assert(ida_pre_get(&ida, GFP_KERNEL)); assert(!ida_get_new(&ida, &id)); if (i == 2) assert(id == 10000); } for (i = 0; i < 5000; i++) ida_remove(&ida, i); assert(ida_pre_get(&ida, GFP_KERNEL)); assert(!ida_get_new_above(&ida, 5000, &id)); assert(id == 10001); ida_destroy(&ida); assert(ida_is_empty(&ida)); assert(ida_pre_get(&ida, GFP_KERNEL)); assert(!ida_get_new_above(&ida, 1, &id)); assert(id == 1); ida_remove(&ida, id); assert(ida_is_empty(&ida)); ida_destroy(&ida); assert(ida_is_empty(&ida)); assert(ida_pre_get(&ida, GFP_KERNEL)); assert(!ida_get_new_above(&ida, 1, &id)); ida_destroy(&ida); assert(ida_is_empty(&ida)); assert(ida_pre_get(&ida, GFP_KERNEL)); assert(!ida_get_new_above(&ida, 1, &id)); assert(id == 1); assert(ida_pre_get(&ida, GFP_KERNEL)); assert(!ida_get_new_above(&ida, 1025, &id)); assert(id == 1025); assert(ida_pre_get(&ida, GFP_KERNEL)); assert(!ida_get_new_above(&ida, 10000, &id)); assert(id == 10000); ida_remove(&ida, 1025); ida_destroy(&ida); assert(ida_is_empty(&ida)); ida_check_nomem(); ida_check_conv_user(); ida_check_random(); ida_simple_get_remove_test(); Loading