On Tue, Apr 30, 2019 at 06:06:32PM -0700, Yury Norov wrote: > The test is derived from bitmap_parselist() > NO_LEN is reserved for use in following patches. >
Reviewed-by: Andy Shevchenko <andriy.shevche...@linux.intel.com> > Signed-off-by: Yury Norov <yno...@marvell.com> > --- > lib/test_bitmap.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 93 insertions(+), 1 deletion(-) > > diff --git a/lib/test_bitmap.c b/lib/test_bitmap.c > index d3a501f2a81a..731e107d811a 100644 > --- a/lib/test_bitmap.c > +++ b/lib/test_bitmap.c > @@ -205,7 +205,8 @@ static void __init test_copy(void) > expect_eq_pbl("0-108,128-1023", bmap2, 1024); > } > > -#define PARSE_TIME 0x1 > +#define PARSE_TIME 0x1 > +#define NO_LEN 0x2 > > struct test_bitmap_parselist{ > const int errno; > @@ -328,6 +329,85 @@ static void __init __test_bitmap_parselist(int is_user) > } > } > > +static const unsigned long parse_test[] __initconst = { > + BITMAP_FROM_U64(0), > + BITMAP_FROM_U64(1), > + BITMAP_FROM_U64(0xdeadbeef), > + BITMAP_FROM_U64(0x100000000ULL), > +}; > + > +static const unsigned long parse_test2[] __initconst = { > + BITMAP_FROM_U64(0x100000000ULL), BITMAP_FROM_U64(0xdeadbeef), > + BITMAP_FROM_U64(0x100000000ULL), BITMAP_FROM_U64(0xbaadf00ddeadbeef), > + BITMAP_FROM_U64(0x100000000ULL), BITMAP_FROM_U64(0x0badf00ddeadbeef), > +}; > + > +static const struct test_bitmap_parselist parse_tests[] __initconst = { > + {0, "0", &parse_test[0 * step], 32, 0}, > + {0, "1", &parse_test[1 * step], 32, 0}, > + {0, "deadbeef", &parse_test[2 * step], 32, 0}, > + {0, "1,0", &parse_test[3 * step], 33, 0}, > + > + {0, "deadbeef,1,0", &parse_test2[0 * 2 * step], 96, 0}, > + {0, "baadf00d,deadbeef,1,0", &parse_test2[1 * 2 * step], 128, 0}, > + {0, "badf00d,deadbeef,1,0", &parse_test2[2 * 2 * step], 124, 0}, > + > + {-EINVAL, "goodfood,deadbeef,1,0", NULL, 128, 0}, > + {-EOVERFLOW, "3,0", NULL, 33, 0}, > + {-EOVERFLOW, "123badf00d,deadbeef,1,0", NULL, 128, 0}, > + {-EOVERFLOW, "badf00d,deadbeef,1,0", NULL, 90, 0}, > + {-EOVERFLOW, "fbadf00d,deadbeef,1,0", NULL, 95, 0}, > + {-EOVERFLOW, "badf00d,deadbeef,1,0", NULL, 100, 0}, > +}; > + > +static void __init __test_bitmap_parse(int is_user) > +{ > + int i; > + int err; > + ktime_t time; > + DECLARE_BITMAP(bmap, 2048); > + char *mode = is_user ? "_user" : ""; > + > + for (i = 0; i < ARRAY_SIZE(parse_tests); i++) { > + struct test_bitmap_parselist test = parse_tests[i]; > + > + if (is_user) { > + size_t len = strlen(test.in); > + mm_segment_t orig_fs = get_fs(); > + > + set_fs(KERNEL_DS); > + time = ktime_get(); > + err = bitmap_parse_user(test.in, len, bmap, test.nbits); > + time = ktime_get() - time; > + set_fs(orig_fs); > + } else { > + size_t len = test.flags & NO_LEN ? > + UINT_MAX : strlen(test.in); > + time = ktime_get(); > + err = bitmap_parse(test.in, len, bmap, test.nbits); > + time = ktime_get() - time; > + } > + > + if (err != test.errno) { > + pr_err("parse%s: %d: input is %s, errno is %d, expected > %d\n", > + mode, i, test.in, err, test.errno); > + continue; > + } > + > + if (!err && test.expected > + && !__bitmap_equal(bmap, test.expected, test.nbits)) { > + pr_err("parse%s: %d: input is %s, result is 0x%lx, > expected 0x%lx\n", > + mode, i, test.in, bmap[0], > + *test.expected); > + continue; > + } > + > + if (test.flags & PARSE_TIME) > + pr_err("parse%s: %d: input is '%s' OK, Time: %llu\n", > + mode, i, test.in, time); > + } > +} > + > static void __init test_bitmap_parselist(void) > { > __test_bitmap_parselist(0); > @@ -338,6 +418,16 @@ static void __init test_bitmap_parselist_user(void) > __test_bitmap_parselist(1); > } > > +static void __init test_bitmap_parse(void) > +{ > + __test_bitmap_parse(0); > +} > + > +static void __init test_bitmap_parse_user(void) > +{ > + __test_bitmap_parse(1); > +} > + > #define EXP_BYTES (sizeof(exp) * 8) > > static void __init test_bitmap_arr32(void) > @@ -409,6 +499,8 @@ static void __init selftest(void) > test_fill_set(); > test_copy(); > test_bitmap_arr32(); > + test_bitmap_parse(); > + test_bitmap_parse_user(); > test_bitmap_parselist(); > test_bitmap_parselist_user(); > test_mem_optimisations(); > -- > 2.17.1 > -- With Best Regards, Andy Shevchenko