diff options
Diffstat (limited to 'drivers/mtd/tests')
| -rw-r--r-- | drivers/mtd/tests/mtd_nandecctest.c | 12 | ||||
| -rw-r--r-- | drivers/mtd/tests/mtd_oobtest.c | 49 | ||||
| -rw-r--r-- | drivers/mtd/tests/mtd_pagetest.c | 43 | ||||
| -rw-r--r-- | drivers/mtd/tests/mtd_speedtest.c | 9 | ||||
| -rw-r--r-- | drivers/mtd/tests/mtd_stresstest.c | 11 | ||||
| -rw-r--r-- | drivers/mtd/tests/mtd_subpagetest.c | 42 | ||||
| -rw-r--r-- | drivers/mtd/tests/mtd_torturetest.c | 25 | 
7 files changed, 64 insertions, 127 deletions
diff --git a/drivers/mtd/tests/mtd_nandecctest.c b/drivers/mtd/tests/mtd_nandecctest.c index 1eee264509a..70106607c24 100644 --- a/drivers/mtd/tests/mtd_nandecctest.c +++ b/drivers/mtd/tests/mtd_nandecctest.c @@ -44,7 +44,7 @@ struct nand_ecc_test {  static void single_bit_error_data(void *error_data, void *correct_data,  				size_t size)  { -	unsigned int offset = random32() % (size * BITS_PER_BYTE); +	unsigned int offset = prandom_u32() % (size * BITS_PER_BYTE);  	memcpy(error_data, correct_data, size);  	__change_bit_le(offset, error_data); @@ -55,9 +55,9 @@ static void double_bit_error_data(void *error_data, void *correct_data,  {  	unsigned int offset[2]; -	offset[0] = random32() % (size * BITS_PER_BYTE); +	offset[0] = prandom_u32() % (size * BITS_PER_BYTE);  	do { -		offset[1] = random32() % (size * BITS_PER_BYTE); +		offset[1] = prandom_u32() % (size * BITS_PER_BYTE);  	} while (offset[0] == offset[1]);  	memcpy(error_data, correct_data, size); @@ -68,7 +68,7 @@ static void double_bit_error_data(void *error_data, void *correct_data,  static unsigned int random_ecc_bit(size_t size)  { -	unsigned int offset = random32() % (3 * BITS_PER_BYTE); +	unsigned int offset = prandom_u32() % (3 * BITS_PER_BYTE);  	if (size == 256) {  		/* @@ -76,7 +76,7 @@ static unsigned int random_ecc_bit(size_t size)  		 * and 17th bit) in ECC code for 256 byte data block  		 */  		while (offset == 16 || offset == 17) -			offset = random32() % (3 * BITS_PER_BYTE); +			offset = prandom_u32() % (3 * BITS_PER_BYTE);  	}  	return offset; @@ -256,7 +256,7 @@ static int nand_ecc_test_run(const size_t size)  		goto error;  	} -	get_random_bytes(correct_data, size); +	prandom_bytes(correct_data, size);  	__nand_calculate_ecc(correct_data, size, correct_ecc);  	for (i = 0; i < ARRAY_SIZE(nand_ecc_test); i++) { diff --git a/drivers/mtd/tests/mtd_oobtest.c b/drivers/mtd/tests/mtd_oobtest.c index e827fa8cd84..3e24b379ffa 100644 --- a/drivers/mtd/tests/mtd_oobtest.c +++ b/drivers/mtd/tests/mtd_oobtest.c @@ -29,6 +29,7 @@  #include <linux/mtd/mtd.h>  #include <linux/slab.h>  #include <linux/sched.h> +#include <linux/random.h>  static int dev = -EINVAL;  module_param(dev, int, S_IRUGO); @@ -46,26 +47,7 @@ static int use_offset;  static int use_len;  static int use_len_max;  static int vary_offset; -static unsigned long next = 1; - -static inline unsigned int simple_rand(void) -{ -	next = next * 1103515245 + 12345; -	return (unsigned int)((next / 65536) % 32768); -} - -static inline void simple_srand(unsigned long seed) -{ -	next = seed; -} - -static void set_random_data(unsigned char *buf, size_t len) -{ -	size_t i; - -	for (i = 0; i < len; ++i) -		buf[i] = simple_rand(); -} +static struct rnd_state rnd_state;  static int erase_eraseblock(int ebnum)  { @@ -129,7 +111,7 @@ static int write_eraseblock(int ebnum)  	loff_t addr = ebnum * mtd->erasesize;  	for (i = 0; i < pgcnt; ++i, addr += mtd->writesize) { -		set_random_data(writebuf, use_len); +		prandom_bytes_state(&rnd_state, writebuf, use_len);  		ops.mode      = MTD_OPS_AUTO_OOB;  		ops.len       = 0;  		ops.retlen    = 0; @@ -182,7 +164,7 @@ static int verify_eraseblock(int ebnum)  	loff_t addr = ebnum * mtd->erasesize;  	for (i = 0; i < pgcnt; ++i, addr += mtd->writesize) { -		set_random_data(writebuf, use_len); +		prandom_bytes_state(&rnd_state, writebuf, use_len);  		ops.mode      = MTD_OPS_AUTO_OOB;  		ops.len       = 0;  		ops.retlen    = 0; @@ -273,7 +255,7 @@ static int verify_eraseblock_in_one_go(int ebnum)  	loff_t addr = ebnum * mtd->erasesize;  	size_t len = mtd->ecclayout->oobavail * pgcnt; -	set_random_data(writebuf, len); +	prandom_bytes_state(&rnd_state, writebuf, len);  	ops.mode      = MTD_OPS_AUTO_OOB;  	ops.len       = 0;  	ops.retlen    = 0; @@ -424,12 +406,12 @@ static int __init mtd_oobtest_init(void)  	if (err)  		goto out; -	simple_srand(1); +	prandom_seed_state(&rnd_state, 1);  	err = write_whole_device();  	if (err)  		goto out; -	simple_srand(1); +	prandom_seed_state(&rnd_state, 1);  	err = verify_all_eraseblocks();  	if (err)  		goto out; @@ -444,13 +426,13 @@ static int __init mtd_oobtest_init(void)  	if (err)  		goto out; -	simple_srand(3); +	prandom_seed_state(&rnd_state, 3);  	err = write_whole_device();  	if (err)  		goto out;  	/* Check all eraseblocks */ -	simple_srand(3); +	prandom_seed_state(&rnd_state, 3);  	pr_info("verifying all eraseblocks\n");  	for (i = 0; i < ebcnt; ++i) {  		if (bbt[i]) @@ -479,7 +461,7 @@ static int __init mtd_oobtest_init(void)  	use_len = mtd->ecclayout->oobavail;  	use_len_max = mtd->ecclayout->oobavail;  	vary_offset = 1; -	simple_srand(5); +	prandom_seed_state(&rnd_state, 5);  	err = write_whole_device();  	if (err) @@ -490,7 +472,7 @@ static int __init mtd_oobtest_init(void)  	use_len = mtd->ecclayout->oobavail;  	use_len_max = mtd->ecclayout->oobavail;  	vary_offset = 1; -	simple_srand(5); +	prandom_seed_state(&rnd_state, 5);  	err = verify_all_eraseblocks();  	if (err)  		goto out; @@ -649,7 +631,7 @@ static int __init mtd_oobtest_init(void)  		goto out;  	/* Write all eraseblocks */ -	simple_srand(11); +	prandom_seed_state(&rnd_state, 11);  	pr_info("writing OOBs of whole device\n");  	for (i = 0; i < ebcnt - 1; ++i) {  		int cnt = 2; @@ -659,7 +641,7 @@ static int __init mtd_oobtest_init(void)  			continue;  		addr = (i + 1) * mtd->erasesize - mtd->writesize;  		for (pg = 0; pg < cnt; ++pg) { -			set_random_data(writebuf, sz); +			prandom_bytes_state(&rnd_state, writebuf, sz);  			ops.mode      = MTD_OPS_AUTO_OOB;  			ops.len       = 0;  			ops.retlen    = 0; @@ -680,12 +662,13 @@ static int __init mtd_oobtest_init(void)  	pr_info("written %u eraseblocks\n", i);  	/* Check all eraseblocks */ -	simple_srand(11); +	prandom_seed_state(&rnd_state, 11);  	pr_info("verifying all eraseblocks\n");  	for (i = 0; i < ebcnt - 1; ++i) {  		if (bbt[i] || bbt[i + 1])  			continue; -		set_random_data(writebuf, mtd->ecclayout->oobavail * 2); +		prandom_bytes_state(&rnd_state, writebuf, +					mtd->ecclayout->oobavail * 2);  		addr = (i + 1) * mtd->erasesize - mtd->writesize;  		ops.mode      = MTD_OPS_AUTO_OOB;  		ops.len       = 0; diff --git a/drivers/mtd/tests/mtd_pagetest.c b/drivers/mtd/tests/mtd_pagetest.c index f93a76f8811..0c1140b6c28 100644 --- a/drivers/mtd/tests/mtd_pagetest.c +++ b/drivers/mtd/tests/mtd_pagetest.c @@ -29,6 +29,7 @@  #include <linux/mtd/mtd.h>  #include <linux/slab.h>  #include <linux/sched.h> +#include <linux/random.h>  static int dev = -EINVAL;  module_param(dev, int, S_IRUGO); @@ -45,26 +46,7 @@ static int bufsize;  static int ebcnt;  static int pgcnt;  static int errcnt; -static unsigned long next = 1; - -static inline unsigned int simple_rand(void) -{ -	next = next * 1103515245 + 12345; -	return (unsigned int)((next / 65536) % 32768); -} - -static inline void simple_srand(unsigned long seed) -{ -	next = seed; -} - -static void set_random_data(unsigned char *buf, size_t len) -{ -	size_t i; - -	for (i = 0; i < len; ++i) -		buf[i] = simple_rand(); -} +static struct rnd_state rnd_state;  static int erase_eraseblock(int ebnum)  { @@ -98,7 +80,7 @@ static int write_eraseblock(int ebnum)  	size_t written;  	loff_t addr = ebnum * mtd->erasesize; -	set_random_data(writebuf, mtd->erasesize); +	prandom_bytes_state(&rnd_state, writebuf, mtd->erasesize);  	cond_resched();  	err = mtd_write(mtd, addr, mtd->erasesize, &written, writebuf);  	if (err || written != mtd->erasesize) @@ -124,7 +106,7 @@ static int verify_eraseblock(int ebnum)  	for (i = 0; i < ebcnt && bbt[ebcnt - i - 1]; ++i)  		addrn -= mtd->erasesize; -	set_random_data(writebuf, mtd->erasesize); +	prandom_bytes_state(&rnd_state, writebuf, mtd->erasesize);  	for (j = 0; j < pgcnt - 1; ++j, addr += pgsize) {  		/* Do a read to set the internal dataRAMs to different data */  		err = mtd_read(mtd, addr0, bufsize, &read, twopages); @@ -160,7 +142,8 @@ static int verify_eraseblock(int ebnum)  	}  	/* Check boundary between eraseblocks */  	if (addr <= addrn - pgsize - pgsize && !bbt[ebnum + 1]) { -		unsigned long oldnext = next; +		struct rnd_state old_state = rnd_state; +  		/* Do a read to set the internal dataRAMs to different data */  		err = mtd_read(mtd, addr0, bufsize, &read, twopages);  		if (mtd_is_bitflip(err)) @@ -188,13 +171,13 @@ static int verify_eraseblock(int ebnum)  			return err;  		}  		memcpy(boundary, writebuf + mtd->erasesize - pgsize, pgsize); -		set_random_data(boundary + pgsize, pgsize); +		prandom_bytes_state(&rnd_state, boundary + pgsize, pgsize);  		if (memcmp(twopages, boundary, bufsize)) {  			pr_err("error: verify failed at %#llx\n",  			       (long long)addr);  			errcnt += 1;  		} -		next = oldnext; +		rnd_state = old_state;  	}  	return err;  } @@ -326,7 +309,7 @@ static int erasecrosstest(void)  		return err;  	pr_info("writing 1st page of block %d\n", ebnum); -	set_random_data(writebuf, pgsize); +	prandom_bytes_state(&rnd_state, writebuf, pgsize);  	strcpy(writebuf, "There is no data like this!");  	err = mtd_write(mtd, addr0, pgsize, &written, writebuf);  	if (err || written != pgsize) { @@ -359,7 +342,7 @@ static int erasecrosstest(void)  		return err;  	pr_info("writing 1st page of block %d\n", ebnum); -	set_random_data(writebuf, pgsize); +	prandom_bytes_state(&rnd_state, writebuf, pgsize);  	strcpy(writebuf, "There is no data like this!");  	err = mtd_write(mtd, addr0, pgsize, &written, writebuf);  	if (err || written != pgsize) { @@ -417,7 +400,7 @@ static int erasetest(void)  		return err;  	pr_info("writing 1st page of block %d\n", ebnum); -	set_random_data(writebuf, pgsize); +	prandom_bytes_state(&rnd_state, writebuf, pgsize);  	err = mtd_write(mtd, addr0, pgsize, &written, writebuf);  	if (err || written != pgsize) {  		pr_err("error: write failed at %#llx\n", @@ -565,7 +548,7 @@ static int __init mtd_pagetest_init(void)  	pr_info("erased %u eraseblocks\n", i);  	/* Write all eraseblocks */ -	simple_srand(1); +	prandom_seed_state(&rnd_state, 1);  	pr_info("writing whole device\n");  	for (i = 0; i < ebcnt; ++i) {  		if (bbt[i]) @@ -580,7 +563,7 @@ static int __init mtd_pagetest_init(void)  	pr_info("written %u eraseblocks\n", i);  	/* Check all eraseblocks */ -	simple_srand(1); +	prandom_seed_state(&rnd_state, 1);  	pr_info("verifying all eraseblocks\n");  	for (i = 0; i < ebcnt; ++i) {  		if (bbt[i]) diff --git a/drivers/mtd/tests/mtd_speedtest.c b/drivers/mtd/tests/mtd_speedtest.c index 596cbea8df4..a6ce9c1fa6c 100644 --- a/drivers/mtd/tests/mtd_speedtest.c +++ b/drivers/mtd/tests/mtd_speedtest.c @@ -49,13 +49,6 @@ static int pgcnt;  static int goodebcnt;  static struct timeval start, finish; -static void set_random_data(unsigned char *buf, size_t len) -{ -	size_t i; - -	for (i = 0; i < len; ++i) -		buf[i] = random32(); -}  static int erase_eraseblock(int ebnum)  { @@ -396,7 +389,7 @@ static int __init mtd_speedtest_init(void)  		goto out;  	} -	set_random_data(iobuf, mtd->erasesize); +	prandom_bytes(iobuf, mtd->erasesize);  	err = scan_for_bad_eraseblocks();  	if (err) diff --git a/drivers/mtd/tests/mtd_stresstest.c b/drivers/mtd/tests/mtd_stresstest.c index 3729f679ae5..787f539d16c 100644 --- a/drivers/mtd/tests/mtd_stresstest.c +++ b/drivers/mtd/tests/mtd_stresstest.c @@ -55,7 +55,7 @@ static int rand_eb(void)  	unsigned int eb;  again: -	eb = random32(); +	eb = prandom_u32();  	/* Read or write up 2 eraseblocks at a time - hence 'ebcnt - 1' */  	eb %= (ebcnt - 1);  	if (bbt[eb]) @@ -67,7 +67,7 @@ static int rand_offs(void)  {  	unsigned int offs; -	offs = random32(); +	offs = prandom_u32();  	offs %= bufsize;  	return offs;  } @@ -76,7 +76,7 @@ static int rand_len(int offs)  {  	unsigned int len; -	len = random32(); +	len = prandom_u32();  	len %= (bufsize - offs);  	return len;  } @@ -191,7 +191,7 @@ static int do_write(void)  static int do_operation(void)  { -	if (random32() & 1) +	if (prandom_u32() & 1)  		return do_read();  	else  		return do_write(); @@ -282,8 +282,7 @@ static int __init mtd_stresstest_init(void)  	}  	for (i = 0; i < ebcnt; i++)  		offsets[i] = mtd->erasesize; -	for (i = 0; i < bufsize; i++) -		writebuf[i] = random32(); +	prandom_bytes(writebuf, bufsize);  	err = scan_for_bad_eraseblocks();  	if (err) diff --git a/drivers/mtd/tests/mtd_subpagetest.c b/drivers/mtd/tests/mtd_subpagetest.c index c880c2229c5..aade56f2794 100644 --- a/drivers/mtd/tests/mtd_subpagetest.c +++ b/drivers/mtd/tests/mtd_subpagetest.c @@ -28,6 +28,7 @@  #include <linux/mtd/mtd.h>  #include <linux/slab.h>  #include <linux/sched.h> +#include <linux/random.h>  static int dev = -EINVAL;  module_param(dev, int, S_IRUGO); @@ -43,26 +44,7 @@ static int bufsize;  static int ebcnt;  static int pgcnt;  static int errcnt; -static unsigned long next = 1; - -static inline unsigned int simple_rand(void) -{ -	next = next * 1103515245 + 12345; -	return (unsigned int)((next / 65536) % 32768); -} - -static inline void simple_srand(unsigned long seed) -{ -	next = seed; -} - -static void set_random_data(unsigned char *buf, size_t len) -{ -	size_t i; - -	for (i = 0; i < len; ++i) -		buf[i] = simple_rand(); -} +static struct rnd_state rnd_state;  static inline void clear_data(unsigned char *buf, size_t len)  { @@ -119,7 +101,7 @@ static int write_eraseblock(int ebnum)  	int err = 0;  	loff_t addr = ebnum * mtd->erasesize; -	set_random_data(writebuf, subpgsize); +	prandom_bytes_state(&rnd_state, writebuf, subpgsize);  	err = mtd_write(mtd, addr, subpgsize, &written, writebuf);  	if (unlikely(err || written != subpgsize)) {  		pr_err("error: write failed at %#llx\n", @@ -133,7 +115,7 @@ static int write_eraseblock(int ebnum)  	addr += subpgsize; -	set_random_data(writebuf, subpgsize); +	prandom_bytes_state(&rnd_state, writebuf, subpgsize);  	err = mtd_write(mtd, addr, subpgsize, &written, writebuf);  	if (unlikely(err || written != subpgsize)) {  		pr_err("error: write failed at %#llx\n", @@ -157,7 +139,7 @@ static int write_eraseblock2(int ebnum)  	for (k = 1; k < 33; ++k) {  		if (addr + (subpgsize * k) > (ebnum + 1) * mtd->erasesize)  			break; -		set_random_data(writebuf, subpgsize * k); +		prandom_bytes_state(&rnd_state, writebuf, subpgsize * k);  		err = mtd_write(mtd, addr, subpgsize * k, &written, writebuf);  		if (unlikely(err || written != subpgsize * k)) {  			pr_err("error: write failed at %#llx\n", @@ -193,7 +175,7 @@ static int verify_eraseblock(int ebnum)  	int err = 0;  	loff_t addr = ebnum * mtd->erasesize; -	set_random_data(writebuf, subpgsize); +	prandom_bytes_state(&rnd_state, writebuf, subpgsize);  	clear_data(readbuf, subpgsize);  	err = mtd_read(mtd, addr, subpgsize, &read, readbuf);  	if (unlikely(err || read != subpgsize)) { @@ -220,7 +202,7 @@ static int verify_eraseblock(int ebnum)  	addr += subpgsize; -	set_random_data(writebuf, subpgsize); +	prandom_bytes_state(&rnd_state, writebuf, subpgsize);  	clear_data(readbuf, subpgsize);  	err = mtd_read(mtd, addr, subpgsize, &read, readbuf);  	if (unlikely(err || read != subpgsize)) { @@ -257,7 +239,7 @@ static int verify_eraseblock2(int ebnum)  	for (k = 1; k < 33; ++k) {  		if (addr + (subpgsize * k) > (ebnum + 1) * mtd->erasesize)  			break; -		set_random_data(writebuf, subpgsize * k); +		prandom_bytes_state(&rnd_state, writebuf, subpgsize * k);  		clear_data(readbuf, subpgsize * k);  		err = mtd_read(mtd, addr, subpgsize * k, &read, readbuf);  		if (unlikely(err || read != subpgsize * k)) { @@ -430,7 +412,7 @@ static int __init mtd_subpagetest_init(void)  		goto out;  	pr_info("writing whole device\n"); -	simple_srand(1); +	prandom_seed_state(&rnd_state, 1);  	for (i = 0; i < ebcnt; ++i) {  		if (bbt[i])  			continue; @@ -443,7 +425,7 @@ static int __init mtd_subpagetest_init(void)  	}  	pr_info("written %u eraseblocks\n", i); -	simple_srand(1); +	prandom_seed_state(&rnd_state, 1);  	pr_info("verifying all eraseblocks\n");  	for (i = 0; i < ebcnt; ++i) {  		if (bbt[i]) @@ -466,7 +448,7 @@ static int __init mtd_subpagetest_init(void)  		goto out;  	/* Write all eraseblocks */ -	simple_srand(3); +	prandom_seed_state(&rnd_state, 3);  	pr_info("writing whole device\n");  	for (i = 0; i < ebcnt; ++i) {  		if (bbt[i]) @@ -481,7 +463,7 @@ static int __init mtd_subpagetest_init(void)  	pr_info("written %u eraseblocks\n", i);  	/* Check all eraseblocks */ -	simple_srand(3); +	prandom_seed_state(&rnd_state, 3);  	pr_info("verifying all eraseblocks\n");  	for (i = 0; i < ebcnt; ++i) {  		if (bbt[i]) diff --git a/drivers/mtd/tests/mtd_torturetest.c b/drivers/mtd/tests/mtd_torturetest.c index c4cde1e9edd..3a9f6a6a79f 100644 --- a/drivers/mtd/tests/mtd_torturetest.c +++ b/drivers/mtd/tests/mtd_torturetest.c @@ -208,7 +208,7 @@ static inline int write_pattern(int ebnum, void *buf)  static int __init tort_init(void)  {  	int err = 0, i, infinite = !cycles_count; -	int bad_ebs[ebcnt]; +	int *bad_ebs;  	printk(KERN_INFO "\n");  	printk(KERN_INFO "=================================================\n"); @@ -250,28 +250,24 @@ static int __init tort_init(void)  	err = -ENOMEM;  	patt_5A5 = kmalloc(mtd->erasesize, GFP_KERNEL); -	if (!patt_5A5) { -		pr_err("error: cannot allocate memory\n"); +	if (!patt_5A5)  		goto out_mtd; -	}  	patt_A5A = kmalloc(mtd->erasesize, GFP_KERNEL); -	if (!patt_A5A) { -		pr_err("error: cannot allocate memory\n"); +	if (!patt_A5A)  		goto out_patt_5A5; -	}  	patt_FF = kmalloc(mtd->erasesize, GFP_KERNEL); -	if (!patt_FF) { -		pr_err("error: cannot allocate memory\n"); +	if (!patt_FF)  		goto out_patt_A5A; -	}  	check_buf = kmalloc(mtd->erasesize, GFP_KERNEL); -	if (!check_buf) { -		pr_err("error: cannot allocate memory\n"); +	if (!check_buf)  		goto out_patt_FF; -	} + +	bad_ebs = kcalloc(ebcnt, sizeof(*bad_ebs), GFP_KERNEL); +	if (!bad_ebs) +		goto out_check_buf;  	err = 0; @@ -290,7 +286,6 @@ static int __init tort_init(void)  	/*  	 * Check if there is a bad eraseblock among those we are going to test.  	 */ -	memset(&bad_ebs[0], 0, sizeof(int) * ebcnt);  	if (mtd_can_have_bb(mtd)) {  		for (i = eb; i < eb + ebcnt; i++) {  			err = mtd_block_isbad(mtd, (loff_t)i * mtd->erasesize); @@ -394,6 +389,8 @@ out:  	pr_info("finished after %u erase cycles\n",  	       erase_cycles); +	kfree(bad_ebs); +out_check_buf:  	kfree(check_buf);  out_patt_FF:  	kfree(patt_FF);  |