diff options
Diffstat (limited to 'lib/test_bitmap.c')
| -rw-r--r-- | lib/test_bitmap.c | 87 | 
1 files changed, 58 insertions, 29 deletions
| diff --git a/lib/test_bitmap.c b/lib/test_bitmap.c index 6cd7d0740005..d3a501f2a81a 100644 --- a/lib/test_bitmap.c +++ b/lib/test_bitmap.c @@ -11,6 +11,9 @@  #include <linux/printk.h>  #include <linux/slab.h>  #include <linux/string.h> +#include <linux/uaccess.h> + +#include "../tools/testing/selftests/kselftest_module.h"  static unsigned total_tests __initdata;  static unsigned failed_tests __initdata; @@ -224,7 +227,8 @@ static const unsigned long exp[] __initconst = {  	BITMAP_FROM_U64(0xffffffff),  	BITMAP_FROM_U64(0xfffffffe),  	BITMAP_FROM_U64(0x3333333311111111ULL), -	BITMAP_FROM_U64(0xffffffff77777777ULL) +	BITMAP_FROM_U64(0xffffffff77777777ULL), +	BITMAP_FROM_U64(0),  };  static const unsigned long exp2[] __initconst = { @@ -247,55 +251,93 @@ static const struct test_bitmap_parselist parselist_tests[] __initconst = {  	{0, "1-31:4/4",			&exp[9 * step], 32, 0},  	{0, "0-31:1/4,32-63:2/4",	&exp[10 * step], 64, 0},  	{0, "0-31:3/4,32-63:4/4",	&exp[11 * step], 64, 0}, +	{0, "  ,,  0-31:3/4  ,, 32-63:4/4  ,,  ",	&exp[11 * step], 64, 0},  	{0, "0-31:1/4,32-63:2/4,64-95:3/4,96-127:4/4",	exp2, 128, 0},  	{0, "0-2047:128/256", NULL, 2048, PARSE_TIME}, +	{0, "",				&exp[12 * step], 8, 0}, +	{0, "\n",			&exp[12 * step], 8, 0}, +	{0, ",,  ,,  , ,  ,",		&exp[12 * step], 8, 0}, +	{0, " ,  ,,  , ,   ",		&exp[12 * step], 8, 0}, +	{0, " ,  ,,  , ,   \n",		&exp[12 * step], 8, 0}, +  	{-EINVAL, "-1",	NULL, 8, 0},  	{-EINVAL, "-0",	NULL, 8, 0},  	{-EINVAL, "10-1", NULL, 8, 0},  	{-EINVAL, "0-31:", NULL, 8, 0},  	{-EINVAL, "0-31:0", NULL, 8, 0}, +	{-EINVAL, "0-31:0/", NULL, 8, 0},  	{-EINVAL, "0-31:0/0", NULL, 8, 0},  	{-EINVAL, "0-31:1/0", NULL, 8, 0},  	{-EINVAL, "0-31:10/1", NULL, 8, 0}, +	{-EOVERFLOW, "0-98765432123456789:10/1", NULL, 8, 0}, + +	{-EINVAL, "a-31", NULL, 8, 0}, +	{-EINVAL, "0-a1", NULL, 8, 0}, +	{-EINVAL, "a-31:10/1", NULL, 8, 0}, +	{-EINVAL, "0-31:a/1", NULL, 8, 0}, +	{-EINVAL, "0-\n", NULL, 8, 0},  }; -static void __init test_bitmap_parselist(void) +static void __init __test_bitmap_parselist(int is_user)  {  	int i;  	int err; -	cycles_t cycles; +	ktime_t time;  	DECLARE_BITMAP(bmap, 2048); +	char *mode = is_user ? "_user"  : "";  	for (i = 0; i < ARRAY_SIZE(parselist_tests); i++) {  #define ptest parselist_tests[i] -		cycles = get_cycles(); -		err = bitmap_parselist(ptest.in, bmap, ptest.nbits); -		cycles = get_cycles() - cycles; +		if (is_user) { +			mm_segment_t orig_fs = get_fs(); +			size_t len = strlen(ptest.in); + +			set_fs(KERNEL_DS); +			time = ktime_get(); +			err = bitmap_parselist_user(ptest.in, len, +						    bmap, ptest.nbits); +			time = ktime_get() - time; +			set_fs(orig_fs); +		} else { +			time = ktime_get(); +			err = bitmap_parselist(ptest.in, bmap, ptest.nbits); +			time = ktime_get() - time; +		}  		if (err != ptest.errno) { -			pr_err("test %d: input is %s, errno is %d, expected %d\n", -					i, ptest.in, err, ptest.errno); +			pr_err("parselist%s: %d: input is %s, errno is %d, expected %d\n", +					mode, i, ptest.in, err, ptest.errno);  			continue;  		}  		if (!err && ptest.expected  			 && !__bitmap_equal(bmap, ptest.expected, ptest.nbits)) { -			pr_err("test %d: input is %s, result is 0x%lx, expected 0x%lx\n", -					i, ptest.in, bmap[0], *ptest.expected); +			pr_err("parselist%s: %d: input is %s, result is 0x%lx, expected 0x%lx\n", +					mode, i, ptest.in, bmap[0], +					*ptest.expected);  			continue;  		}  		if (ptest.flags & PARSE_TIME) -			pr_err("test %d: input is '%s' OK, Time: %llu\n", -					i, ptest.in, -					(unsigned long long)cycles); +			pr_err("parselist%s: %d: input is '%s' OK, Time: %llu\n", +					mode, i, ptest.in, time);  	}  } +static void __init test_bitmap_parselist(void) +{ +	__test_bitmap_parselist(0); +} + +static void __init test_bitmap_parselist_user(void) +{ +	__test_bitmap_parselist(1); +} +  #define EXP_BYTES	(sizeof(exp) * 8)  static void __init test_bitmap_arr32(void) @@ -361,30 +403,17 @@ static void noinline __init test_mem_optimisations(void)  	}  } -static int __init test_bitmap_init(void) +static void __init selftest(void)  {  	test_zero_clear();  	test_fill_set();  	test_copy();  	test_bitmap_arr32();  	test_bitmap_parselist(); +	test_bitmap_parselist_user();  	test_mem_optimisations(); - -	if (failed_tests == 0) -		pr_info("all %u tests passed\n", total_tests); -	else -		pr_warn("failed %u out of %u tests\n", -			failed_tests, total_tests); - -	return failed_tests ? -EINVAL : 0;  } -static void __exit test_bitmap_cleanup(void) -{ -} - -module_init(test_bitmap_init); -module_exit(test_bitmap_cleanup); - +KSTM_MODULE_LOADERS(test_bitmap);  MODULE_AUTHOR("david decotigny <[email protected]>");  MODULE_LICENSE("GPL"); |