···2626} while (0)27272828/*2929+ * Straightforward checks that allocating and freeing IDs work.3030+ */3131+static void ida_check_alloc(struct ida *ida)3232+{3333+ int i, id;3434+3535+ for (i = 0; i < 10000; i++)3636+ IDA_BUG_ON(ida, ida_alloc(ida, GFP_KERNEL) != i);3737+3838+ ida_free(ida, 20);3939+ ida_free(ida, 21);4040+ for (i = 0; i < 3; i++) {4141+ id = ida_alloc(ida, GFP_KERNEL);4242+ IDA_BUG_ON(ida, id < 0);4343+ if (i == 2)4444+ IDA_BUG_ON(ida, id != 10000);4545+ }4646+4747+ for (i = 0; i < 5000; i++)4848+ ida_free(ida, i);4949+5050+ IDA_BUG_ON(ida, ida_alloc_min(ida, 5000, GFP_KERNEL) != 10001);5151+ ida_destroy(ida);5252+5353+ IDA_BUG_ON(ida, !ida_is_empty(ida));5454+}5555+5656+/* Destroy an IDA with a single entry at @base */5757+static void ida_check_destroy_1(struct ida *ida, unsigned int base)5858+{5959+ IDA_BUG_ON(ida, ida_alloc_min(ida, base, GFP_KERNEL) != base);6060+ IDA_BUG_ON(ida, ida_is_empty(ida));6161+ ida_destroy(ida);6262+ IDA_BUG_ON(ida, !ida_is_empty(ida));6363+}6464+6565+/* Check that ida_destroy and ida_is_empty work */6666+static void ida_check_destroy(struct ida *ida)6767+{6868+ /* Destroy an already-empty IDA */6969+ IDA_BUG_ON(ida, !ida_is_empty(ida));7070+ ida_destroy(ida);7171+ IDA_BUG_ON(ida, !ida_is_empty(ida));7272+7373+ ida_check_destroy_1(ida, 0);7474+ ida_check_destroy_1(ida, 1);7575+ ida_check_destroy_1(ida, 1023);7676+ ida_check_destroy_1(ida, 1024);7777+ ida_check_destroy_1(ida, 12345678);7878+}7979+8080+/*2981 * Check what happens when we fill a leaf and then delete it. This may3082 * discover mishandling of IDR_FREE.3183 */···155103 DEFINE_IDA(ida);156104157105 IDA_BUG_ON(&ida, !ida_is_empty(&ida));106106+ ida_check_alloc(&ida);107107+ ida_check_destroy(&ida);158108 ida_check_leaf(&ida, 0);159109 ida_check_leaf(&ida, 1024);160110 ida_check_leaf(&ida, 1024 * 64);
+4-66
tools/testing/radix-tree/idr-test.c
···364364{365365 DEFINE_IDA(ida);366366 DECLARE_BITMAP(bitmap, 2048);367367- int id, err;368367 unsigned int i;369368 time_t s = time(NULL);370369···374375 int bit = i & 2047;375376 if (test_bit(bit, bitmap)) {376377 __clear_bit(bit, bitmap);377377- ida_remove(&ida, bit);378378+ ida_free(&ida, bit);378379 } else {379380 __set_bit(bit, bitmap);380380- do {381381- ida_pre_get(&ida, GFP_KERNEL);382382- err = ida_get_new_above(&ida, bit, &id);383383- } while (err == -EAGAIN);384384- assert(!err);385385- assert(id == bit);381381+ IDA_BUG_ON(&ida, ida_alloc_min(&ida, bit, GFP_KERNEL)382382+ != bit);386383 }387384 }388385 ida_destroy(&ida);···406411407412void user_ida_checks(void)408413{409409- DEFINE_IDA(ida);410410- int id;411411- unsigned long i;412412-413414 radix_tree_cpu_dead(1);415415+414416 ida_check_nomem();415415-416416- for (i = 0; i < 10000; i++) {417417- assert(ida_pre_get(&ida, GFP_KERNEL));418418- assert(!ida_get_new(&ida, &id));419419- assert(id == i);420420- }421421-422422- ida_remove(&ida, 20);423423- ida_remove(&ida, 21);424424- for (i = 0; i < 3; i++) {425425- assert(ida_pre_get(&ida, GFP_KERNEL));426426- assert(!ida_get_new(&ida, &id));427427- if (i == 2)428428- assert(id == 10000);429429- }430430-431431- for (i = 0; i < 5000; i++)432432- ida_remove(&ida, i);433433-434434- assert(ida_pre_get(&ida, GFP_KERNEL));435435- assert(!ida_get_new_above(&ida, 5000, &id));436436- assert(id == 10001);437437-438438- ida_destroy(&ida);439439-440440- assert(ida_is_empty(&ida));441441-442442- assert(ida_pre_get(&ida, GFP_KERNEL));443443- assert(!ida_get_new_above(&ida, 1, &id));444444- assert(id == 1);445445-446446- ida_remove(&ida, id);447447- assert(ida_is_empty(&ida));448448- ida_destroy(&ida);449449- assert(ida_is_empty(&ida));450450-451451- assert(ida_pre_get(&ida, GFP_KERNEL));452452- assert(!ida_get_new_above(&ida, 1, &id));453453- ida_destroy(&ida);454454- assert(ida_is_empty(&ida));455455-456456- assert(ida_pre_get(&ida, GFP_KERNEL));457457- assert(!ida_get_new_above(&ida, 1, &id));458458- assert(id == 1);459459- assert(ida_pre_get(&ida, GFP_KERNEL));460460- assert(!ida_get_new_above(&ida, 1025, &id));461461- assert(id == 1025);462462- assert(ida_pre_get(&ida, GFP_KERNEL));463463- assert(!ida_get_new_above(&ida, 10000, &id));464464- assert(id == 10000);465465- ida_remove(&ida, 1025);466466- ida_destroy(&ida);467467- assert(ida_is_empty(&ida));468468-469417 ida_check_conv_user();470418 ida_check_random();471419 ida_simple_get_remove_test();