diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/test_ida.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/test_ida.c b/lib/test_ida.c index 1988f91a20c8..44174ec9f5bf 100644 --- a/lib/test_ida.c +++ b/lib/test_ida.c | |||
@@ -47,6 +47,28 @@ static void ida_check_leaf(struct ida *ida, unsigned int base) | |||
47 | IDA_BUG_ON(ida, !ida_is_empty(ida)); | 47 | IDA_BUG_ON(ida, !ida_is_empty(ida)); |
48 | } | 48 | } |
49 | 49 | ||
50 | /* | ||
51 | * Check allocations up to and slightly above the maximum allowed (2^31-1) ID. | ||
52 | * Allocating up to 2^31-1 should succeed, and then allocating the next one | ||
53 | * should fail. | ||
54 | */ | ||
55 | static void ida_check_max(struct ida *ida) | ||
56 | { | ||
57 | unsigned long i, j; | ||
58 | |||
59 | for (j = 1; j < 65537; j *= 2) { | ||
60 | unsigned long base = (1UL << 31) - j; | ||
61 | for (i = 0; i < j; i++) { | ||
62 | IDA_BUG_ON(ida, ida_alloc_min(ida, base, GFP_KERNEL) != | ||
63 | base + i); | ||
64 | } | ||
65 | IDA_BUG_ON(ida, ida_alloc_min(ida, base, GFP_KERNEL) != | ||
66 | -ENOSPC); | ||
67 | ida_destroy(ida); | ||
68 | IDA_BUG_ON(ida, !ida_is_empty(ida)); | ||
69 | } | ||
70 | } | ||
71 | |||
50 | static int ida_checks(void) | 72 | static int ida_checks(void) |
51 | { | 73 | { |
52 | DEFINE_IDA(ida); | 74 | DEFINE_IDA(ida); |
@@ -55,6 +77,7 @@ static int ida_checks(void) | |||
55 | ida_check_leaf(&ida, 0); | 77 | ida_check_leaf(&ida, 0); |
56 | ida_check_leaf(&ida, 1024); | 78 | ida_check_leaf(&ida, 1024); |
57 | ida_check_leaf(&ida, 1024 * 64); | 79 | ida_check_leaf(&ida, 1024 * 64); |
80 | ida_check_max(&ida); | ||
58 | 81 | ||
59 | printk("IDA: %u of %u tests passed\n", tests_passed, tests_run); | 82 | printk("IDA: %u of %u tests passed\n", tests_passed, tests_run); |
60 | return (tests_run != tests_passed) ? 0 : -EINVAL; | 83 | return (tests_run != tests_passed) ? 0 : -EINVAL; |