Skip to content

Commit

Permalink
mtd: Make MTD tests cancelable
Browse files Browse the repository at this point in the history
I always go nuts when I start an MTD test on a slow device and have to
wait forever until it finishes. From the debug output I already know
what the issue is but I have to wait or reset the board hard. Resetting
is often not an option (remote access, you don't want lose the current
state, etc...).

The solution is easy, check for pending signals at key positions in the
code. Using that one can even stop a test by pressing CTRL-C as
insmod/modprobe have SIGINT pending.

Signed-off-by: Richard Weinberger <richard@nod.at>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
  • Loading branch information
Richard Weinberger authored and Brian Norris committed Apr 6, 2015
1 parent d2b51c8 commit 2a6a28e
Show file tree
Hide file tree
Showing 10 changed files with 120 additions and 24 deletions.
6 changes: 6 additions & 0 deletions drivers/mtd/tests/mtd_nandecctest.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
#include <linux/slab.h>
#include <linux/mtd/nand_ecc.h>

#include "mtd_test.h"

/*
* Test the implementation for software ECC
*
Expand Down Expand Up @@ -274,6 +276,10 @@ static int nand_ecc_test_run(const size_t size)
}
pr_info("ok - %s-%zd\n",
nand_ecc_test[i].name, size);

err = mtdtest_relax();
if (err)
break;
}
error:
kfree(error_data);
Expand Down
12 changes: 12 additions & 0 deletions drivers/mtd/tests/mtd_test.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,16 @@
#include <linux/mtd/mtd.h>
#include <linux/sched.h>

static inline int mtdtest_relax(void)
{
cond_resched();
if (signal_pending(current)) {
pr_info("aborting test due to pending signal!\n");
return -EINTR;
}

return 0;
}

int mtdtest_erase_eraseblock(struct mtd_info *mtd, unsigned int ebnum);
int mtdtest_scan_for_bad_eraseblocks(struct mtd_info *mtd, unsigned char *bbt,
Expand Down
4 changes: 4 additions & 0 deletions drivers/mtd/tests/nandbiterrs.c
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,10 @@ static int overwrite_test(void)
break;
}

err = mtdtest_relax();
if (err)
break;

opno++;
}

Expand Down
26 changes: 21 additions & 5 deletions drivers/mtd/tests/oobtest.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,10 @@ static int write_whole_device(void)
return err;
if (i % 256 == 0)
pr_info("written up to eraseblock %u\n", i);
cond_resched();

err = mtdtest_relax();
if (err)
return err;
}
pr_info("written %u eraseblocks\n", i);
return 0;
Expand Down Expand Up @@ -318,7 +321,10 @@ static int verify_all_eraseblocks(void)
return err;
if (i % 256 == 0)
pr_info("verified up to eraseblock %u\n", i);
cond_resched();

err = mtdtest_relax();
if (err)
return err;
}
pr_info("verified %u eraseblocks\n", i);
return 0;
Expand Down Expand Up @@ -429,7 +435,10 @@ static int __init mtd_oobtest_init(void)
goto out;
if (i % 256 == 0)
pr_info("verified up to eraseblock %u\n", i);
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}
pr_info("verified %u eraseblocks\n", i);

Expand Down Expand Up @@ -642,7 +651,11 @@ static int __init mtd_oobtest_init(void)
goto out;
if (i % 256 == 0)
pr_info("written up to eraseblock %u\n", i);
cond_resched();

err = mtdtest_relax();
if (err)
goto out;

addr += mtd->writesize;
}
}
Expand Down Expand Up @@ -680,7 +693,10 @@ static int __init mtd_oobtest_init(void)
}
if (i % 256 == 0)
pr_info("verified up to eraseblock %u\n", i);
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}
pr_info("verified %u eraseblocks\n", i);

Expand Down
10 changes: 8 additions & 2 deletions drivers/mtd/tests/pagetest.c
Original file line number Diff line number Diff line change
Expand Up @@ -407,7 +407,10 @@ static int __init mtd_pagetest_init(void)
goto out;
if (i % 256 == 0)
pr_info("written up to eraseblock %u\n", i);
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}
pr_info("written %u eraseblocks\n", i);

Expand All @@ -422,7 +425,10 @@ static int __init mtd_pagetest_init(void)
goto out;
if (i % 256 == 0)
pr_info("verified up to eraseblock %u\n", i);
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}
pr_info("verified %u eraseblocks\n", i);

Expand Down
5 changes: 4 additions & 1 deletion drivers/mtd/tests/readtest.c
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,10 @@ static int __init mtd_readtest_init(void)
if (!err)
err = ret;
}
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}

if (err)
Expand Down
36 changes: 29 additions & 7 deletions drivers/mtd/tests/speedtest.c
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,10 @@ static int __init mtd_speedtest_init(void)
err = write_eraseblock(i);
if (err)
goto out;
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}
stop_timing();
speed = calc_speed();
Expand All @@ -284,7 +287,10 @@ static int __init mtd_speedtest_init(void)
err = read_eraseblock(i);
if (err)
goto out;
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}
stop_timing();
speed = calc_speed();
Expand All @@ -303,7 +309,10 @@ static int __init mtd_speedtest_init(void)
err = write_eraseblock_by_page(i);
if (err)
goto out;
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}
stop_timing();
speed = calc_speed();
Expand All @@ -318,7 +327,10 @@ static int __init mtd_speedtest_init(void)
err = read_eraseblock_by_page(i);
if (err)
goto out;
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}
stop_timing();
speed = calc_speed();
Expand All @@ -337,7 +349,10 @@ static int __init mtd_speedtest_init(void)
err = write_eraseblock_by_2pages(i);
if (err)
goto out;
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}
stop_timing();
speed = calc_speed();
Expand All @@ -352,7 +367,10 @@ static int __init mtd_speedtest_init(void)
err = read_eraseblock_by_2pages(i);
if (err)
goto out;
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}
stop_timing();
speed = calc_speed();
Expand Down Expand Up @@ -385,7 +403,11 @@ static int __init mtd_speedtest_init(void)
err = multiblock_erase(i, j);
if (err)
goto out;
cond_resched();

err = mtdtest_relax();
if (err)
goto out;

i += j;
}
stop_timing();
Expand Down
5 changes: 4 additions & 1 deletion drivers/mtd/tests/stresstest.c
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,10 @@ static int __init mtd_stresstest_init(void)
err = do_operation();
if (err)
goto out;
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}
pr_info("finished, %d operations done\n", op);

Expand Down
25 changes: 20 additions & 5 deletions drivers/mtd/tests/subpagetest.c
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,10 @@ static int verify_all_eraseblocks_ff(void)
return err;
if (i % 256 == 0)
pr_info("verified up to eraseblock %u\n", i);
cond_resched();

err = mtdtest_relax();
if (err)
return err;
}
pr_info("verified %u eraseblocks\n", i);
return 0;
Expand Down Expand Up @@ -346,7 +349,10 @@ static int __init mtd_subpagetest_init(void)
goto out;
if (i % 256 == 0)
pr_info("written up to eraseblock %u\n", i);
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}
pr_info("written %u eraseblocks\n", i);

Expand All @@ -360,7 +366,10 @@ static int __init mtd_subpagetest_init(void)
goto out;
if (i % 256 == 0)
pr_info("verified up to eraseblock %u\n", i);
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}
pr_info("verified %u eraseblocks\n", i);

Expand All @@ -383,7 +392,10 @@ static int __init mtd_subpagetest_init(void)
goto out;
if (i % 256 == 0)
pr_info("written up to eraseblock %u\n", i);
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}
pr_info("written %u eraseblocks\n", i);

Expand All @@ -398,7 +410,10 @@ static int __init mtd_subpagetest_init(void)
goto out;
if (i % 256 == 0)
pr_info("verified up to eraseblock %u\n", i);
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}
pr_info("verified %u eraseblocks\n", i);

Expand Down
15 changes: 12 additions & 3 deletions drivers/mtd/tests/torturetest.c
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,10 @@ static int __init tort_init(void)
" for 0xFF... pattern\n");
goto out;
}
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}
}

Expand All @@ -294,7 +297,10 @@ static int __init tort_init(void)
err = write_pattern(i, patt);
if (err)
goto out;
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}

/* Verify what we wrote */
Expand All @@ -314,7 +320,10 @@ static int __init tort_init(void)
"0x55AA55..." : "0xAA55AA...");
goto out;
}
cond_resched();

err = mtdtest_relax();
if (err)
goto out;
}
}

Expand Down

0 comments on commit 2a6a28e

Please sign in to comment.