diff options
author | Matthew Wilcox <willy@infradead.org> | 2018-06-18 17:25:20 -0400 |
---|---|---|
committer | Matthew Wilcox <willy@infradead.org> | 2018-08-21 23:54:20 -0400 |
commit | 161b47e31f9912947a3a72dcb161c79978a1fe04 (patch) | |
tree | b692e9d61c20e194b50e256a4952ea4776331de3 /lib/test_ida.c | |
parent | 0a3856392cff1542170b5bc37211c9a21fd0c3f6 (diff) | |
download | lwn-161b47e31f9912947a3a72dcb161c79978a1fe04.tar.gz lwn-161b47e31f9912947a3a72dcb161c79978a1fe04.zip |
test_ida: Move ida_check_max
Convert to new API and move to kernel space.
Signed-off-by: Matthew Wilcox <willy@infradead.org>
Diffstat (limited to 'lib/test_ida.c')
-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) IDA_BUG_ON(ida, !ida_is_empty(ida)); } +/* + * Check allocations up to and slightly above the maximum allowed (2^31-1) ID. + * Allocating up to 2^31-1 should succeed, and then allocating the next one + * should fail. + */ +static void ida_check_max(struct ida *ida) +{ + unsigned long i, j; + + for (j = 1; j < 65537; j *= 2) { + unsigned long base = (1UL << 31) - j; + for (i = 0; i < j; i++) { + IDA_BUG_ON(ida, ida_alloc_min(ida, base, GFP_KERNEL) != + base + i); + } + IDA_BUG_ON(ida, ida_alloc_min(ida, base, GFP_KERNEL) != + -ENOSPC); + ida_destroy(ida); + IDA_BUG_ON(ida, !ida_is_empty(ida)); + } +} + static int ida_checks(void) { DEFINE_IDA(ida); @@ -55,6 +77,7 @@ static int ida_checks(void) ida_check_leaf(&ida, 0); ida_check_leaf(&ida, 1024); ida_check_leaf(&ida, 1024 * 64); + ida_check_max(&ida); printk("IDA: %u of %u tests passed\n", tests_passed, tests_run); return (tests_run != tests_passed) ? 0 : -EINVAL; |