Patchwork [v2] mtd: torturetest: add the support for random data pattern

login
register
mail settings
Submitter Huang Shijie
Date Feb. 5, 2013, 8:21 a.m.
Message ID <1360052485-11961-1-git-send-email-b32955@freescale.com>
Download mbox | patch
Permalink /patch/218199/
State New
Headers show

Comments

Huang Shijie - Feb. 5, 2013, 8:21 a.m.
Add a new module parameter 'pattern'. The meaning of the pattern is:
  (1) pattern == 0 for 55/AA pattern.
  (2) pattern < 0 for random pattern.
  (3) pattern > 0 for random pattern too, the value of the pattern is used
      as the seed for the random generator.

Signed-off-by: Huang Shijie <b32955@freescale.com>
---

v1 --> v2:
   add the seed support.

---
 drivers/mtd/tests/mtd_torturetest.c |   82 +++++++++++++++++++++++++---------
 1 files changed, 60 insertions(+), 22 deletions(-)
Ricard Wanderlof - Feb. 5, 2013, 9:48 a.m.
On Tue, 5 Feb 2013, Huang Shijie wrote:

> Add a new module parameter 'pattern'. The meaning of the pattern is:
>  (1) pattern == 0 for 55/AA pattern.
>  (2) pattern < 0 for random pattern.
>  (3) pattern > 0 for random pattern too, the value of the pattern is used
>      as the seed for the random generator.
>
> Signed-off-by: Huang Shijie <b32955@freescale.com>
> ...
> +static int pattern;
> +module_param(pattern, int, S_IRUGO);
> +MODULE_PARM_DESC(pattern, "0 for 55/AA pattern(default);"
> +			"less then 0 for random pattern;"
> +			"greater then 0 for random too, "
> +			"the value of the pattern is the seed.");
                                           ^^^^^^^^ parameter ?

/Ricard
Huang Shijie - Feb. 5, 2013, 10:01 a.m.
于 2013年02月05日 17:48, Ricard Wanderlof 写道:
>
> On Tue, 5 Feb 2013, Huang Shijie wrote:
>
>> Add a new module parameter 'pattern'. The meaning of the pattern is:
>> (1) pattern == 0 for 55/AA pattern.
>> (2) pattern < 0 for random pattern.
>> (3) pattern > 0 for random pattern too, the value of the pattern is used
>> as the seed for the random generator.
>>
>> Signed-off-by: Huang Shijie <b32955@freescale.com>
>> ...
>> +static int pattern;
>> +module_param(pattern, int, S_IRUGO);
>> +MODULE_PARM_DESC(pattern, "0 for 55/AA pattern(default);"
>> + "less then 0 for random pattern;"
>> + "greater then 0 for random too, "
>> + "the value of the pattern is the seed.");
> ^^^^^^^^ parameter ?
ok, thanks.

Huang Shijie
>
> /Ricard
Artem Bityutskiy - Feb. 13, 2013, 10:37 a.m.
On Tue, 2013-02-05 at 16:21 +0800, Huang Shijie wrote:
> Add a new module parameter 'pattern'. The meaning of the pattern is:
>   (1) pattern == 0 for 55/AA pattern.
>   (2) pattern < 0 for random pattern.
>   (3) pattern > 0 for random pattern too, the value of the pattern is used
>       as the seed for the random generator.

Please, do not add parameters, make it simple - teach the test to use
both the old patterns plus additional cycles with random patterns.
Huang Shijie - Feb. 16, 2013, 4 a.m.
On Wed, Feb 13, 2013 at 6:37 PM, Artem Bityutskiy <dedekind1@gmail.com> wrote:
> On Tue, 2013-02-05 at 16:21 +0800, Huang Shijie wrote:
>> Add a new module parameter 'pattern'. The meaning of the pattern is:
>>   (1) pattern == 0 for 55/AA pattern.
>>   (2) pattern < 0 for random pattern.
>>   (3) pattern > 0 for random pattern too, the value of the pattern is used
>>       as the seed for the random generator.
>
> Please, do not add parameters, make it simple - teach the test to use
> both the old patterns plus additional cycles with random patterns.

but if we do not add new parameter, how can we create a random seed?
Is it ok without set the random seed?

thanks
Huang Shijie

>
> --
> Best Regards,
> Artem Bityutskiy
>
>
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/
Artem Bityutskiy - March 2, 2013, 2:44 p.m.
On Sat, 2013-02-16 at 12:00 +0800, Huang Shijie wrote:
> On Wed, Feb 13, 2013 at 6:37 PM, Artem Bityutskiy <dedekind1@gmail.com> wrote:
> > On Tue, 2013-02-05 at 16:21 +0800, Huang Shijie wrote:
> >> Add a new module parameter 'pattern'. The meaning of the pattern is:
> >>   (1) pattern == 0 for 55/AA pattern.
> >>   (2) pattern < 0 for random pattern.
> >>   (3) pattern > 0 for random pattern too, the value of the pattern is used
> >>       as the seed for the random generator.
> >
> > Please, do not add parameters, make it simple - teach the test to use
> > both the old patterns plus additional cycles with random patterns.
> 
> but if we do not add new parameter, how can we create a random seed?

Unless you have a real practical reason to let users pass the initial
random seed, do not do this.

> Is it ok without set the random seed?

I think so.
Huang Shijie - March 4, 2013, 2:29 a.m.
于 2013年03月02日 22:44, Artem Bityutskiy 写道:
> On Sat, 2013-02-16 at 12:00 +0800, Huang Shijie wrote:
>> On Wed, Feb 13, 2013 at 6:37 PM, Artem Bityutskiy<dedekind1@gmail.com>  wrote:
>>> On Tue, 2013-02-05 at 16:21 +0800, Huang Shijie wrote:
>>>> Add a new module parameter 'pattern'. The meaning of the pattern is:
>>>>    (1) pattern == 0 for 55/AA pattern.
>>>>    (2) pattern<  0 for random pattern.
>>>>    (3) pattern>  0 for random pattern too, the value of the pattern is used
>>>>        as the seed for the random generator.
>>> Please, do not add parameters, make it simple - teach the test to use
>>> both the old patterns plus additional cycles with random patterns.
>> but if we do not add new parameter, how can we create a random seed?
> Unless you have a real practical reason to let users pass the initial
> random seed, do not do this.
>
ok. got it.

thanks
Huang Shijie

Patch

diff --git a/drivers/mtd/tests/mtd_torturetest.c b/drivers/mtd/tests/mtd_torturetest.c
index 516cf66..5481c99 100644
--- a/drivers/mtd/tests/mtd_torturetest.c
+++ b/drivers/mtd/tests/mtd_torturetest.c
@@ -32,6 +32,7 @@ 
 #include <linux/mtd/mtd.h>
 #include <linux/slab.h>
 #include <linux/sched.h>
+#include <linux/random.h>
 
 #define RETRIES 3
 
@@ -64,6 +65,13 @@  module_param(cycles_count, uint, S_IRUGO);
 MODULE_PARM_DESC(cycles_count, "how many erase cycles to do "
 			       "(infinite by default)");
 
+static int pattern;
+module_param(pattern, int, S_IRUGO);
+MODULE_PARM_DESC(pattern, "0 for 55/AA pattern(default);"
+			"less then 0 for random pattern;"
+			"greater then 0 for random too, "
+			"the value of the pattern is the seed.");
+
 static struct mtd_info *mtd;
 
 /* This buffer contains 0x555555...0xAAAAAA... pattern */
@@ -72,6 +80,8 @@  static unsigned char *patt_5A5;
 static unsigned char *patt_A5A;
 /* This buffer contains all 0xFF bytes */
 static unsigned char *patt_FF;
+/* This buffer contains the random data. */
+static unsigned char *patt_rd;
 /* This a temporary buffer is use when checking data */
 static unsigned char *check_buf;
 /* How many erase cycles were done */
@@ -228,6 +238,12 @@  static int __init tort_init(void)
 		pr_info("torturing just %d pages per eraseblock\n",
 			pgcnt);
 	pr_info("write verify %s\n", check ? "enabled" : "disabled");
+	if (pattern == 0)
+		pr_info("Test pattern is 55/AA.\n");
+	else if (pattern < 0)
+		pr_info("Test pattern is random.\n");
+	else
+		pr_info("Test pattern is random, seed is 0x%d.\n", pattern);
 
 	mtd = get_mtd_device(NULL, dev);
 	if (IS_ERR(mtd)) {
@@ -249,16 +265,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");
-		goto out_mtd;
-	}
+	if (!pattern) {
+		patt_5A5 = kmalloc(mtd->erasesize, GFP_KERNEL);
+		if (!patt_5A5) {
+			pr_err("error: cannot allocate memory\n");
+			goto out_mtd;
+		}
 
-	patt_A5A = kmalloc(mtd->erasesize, GFP_KERNEL);
-	if (!patt_A5A) {
-		pr_err("error: cannot allocate memory\n");
-		goto out_patt_5A5;
+		patt_A5A = kmalloc(mtd->erasesize, GFP_KERNEL);
+		if (!patt_A5A) {
+			pr_err("error: cannot allocate memory\n");
+			goto out_patt_5A5;
+		}
+	} else {
+		patt_rd = kmalloc(mtd->erasesize, GFP_KERNEL);
+		if (!patt_rd) {
+			pr_err("error: cannot allocate memory\n");
+			goto out_patt_rd;
+		}
 	}
 
 	patt_FF = kmalloc(mtd->erasesize, GFP_KERNEL);
@@ -277,14 +301,20 @@  static int __init tort_init(void)
 
 	/* Initialize patterns */
 	memset(patt_FF, 0xFF, mtd->erasesize);
-	for (i = 0; i < mtd->erasesize / pgsize; i++) {
-		if (!(i & 1)) {
-			memset(patt_5A5 + i * pgsize, 0x55, pgsize);
-			memset(patt_A5A + i * pgsize, 0xAA, pgsize);
-		} else {
-			memset(patt_5A5 + i * pgsize, 0xAA, pgsize);
-			memset(patt_A5A + i * pgsize, 0x55, pgsize);
+	if (!pattern) {
+		for (i = 0; i < mtd->erasesize / pgsize; i++) {
+			if (!(i & 1)) {
+				memset(patt_5A5 + i * pgsize, 0x55, pgsize);
+				memset(patt_A5A + i * pgsize, 0xAA, pgsize);
+			} else {
+				memset(patt_5A5 + i * pgsize, 0xAA, pgsize);
+				memset(patt_A5A + i * pgsize, 0x55, pgsize);
+			}
 		}
+	} else {
+		/* set the seed. */
+		if (pattern > 0)
+			prandom_seed(pattern);
 	}
 
 	/*
@@ -335,10 +365,15 @@  static int __init tort_init(void)
 			}
 
 			/* Write the pattern */
-			if ((eb + erase_cycles) & 1)
-				patt = patt_5A5;
-			else
-				patt = patt_A5A;
+			if (!pattern) {
+				if ((eb + erase_cycles) & 1)
+					patt = patt_5A5;
+				else
+					patt = patt_A5A;
+			} else {
+				patt = patt_rd;
+				prandom_bytes(patt, mtd->erasesize);
+			}
 			err = write_pattern(i, patt);
 			if (err)
 				goto out;
@@ -350,8 +385,9 @@  static int __init tort_init(void)
 				if (err) {
 					pr_info("verify failed for %s"
 					       " pattern\n",
-					       ((eb + erase_cycles) & 1) ?
-					       "0x55AA55..." : "0xAA55AA...");
+					       pattern ? "random pattern" :
+					       (((eb + erase_cycles) & 1) ?
+					       "0x55AA55..." : "0xAA55AA..."));
 					goto out;
 				}
 				cond_resched();
@@ -386,6 +422,8 @@  out_patt_A5A:
 	kfree(patt_A5A);
 out_patt_5A5:
 	kfree(patt_5A5);
+out_patt_rd:
+	kfree(patt_rd);
 out_mtd:
 	put_mtd_device(mtd);
 	if (err)