aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd
diff options
context:
space:
mode:
authorRichard Weinberger <richard@nod.at>2015-03-29 15:52:06 -0400
committerBrian Norris <computersforpeace@gmail.com>2015-04-05 21:12:53 -0400
commit2a6a28e7922c07c116ba8f2aa3682c03ef8be678 (patch)
treea12044a676ee8b2b3668b6e1bcffae46180befb1 /drivers/mtd
parentd2b51c808745ca93c020ba34a3cf256ad52adc63 (diff)
mtd: Make MTD tests cancelable
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>
Diffstat (limited to 'drivers/mtd')
-rw-r--r--drivers/mtd/tests/mtd_nandecctest.c6
-rw-r--r--drivers/mtd/tests/mtd_test.h12
-rw-r--r--drivers/mtd/tests/nandbiterrs.c4
-rw-r--r--drivers/mtd/tests/oobtest.c26
-rw-r--r--drivers/mtd/tests/pagetest.c10
-rw-r--r--drivers/mtd/tests/readtest.c5
-rw-r--r--drivers/mtd/tests/speedtest.c36
-rw-r--r--drivers/mtd/tests/stresstest.c5
-rw-r--r--drivers/mtd/tests/subpagetest.c25
-rw-r--r--drivers/mtd/tests/torturetest.c15
10 files changed, 120 insertions, 24 deletions
diff --git a/drivers/mtd/tests/mtd_nandecctest.c b/drivers/mtd/tests/mtd_nandecctest.c
index e579f9027c47..79316159eec6 100644
--- a/drivers/mtd/tests/mtd_nandecctest.c
+++ b/drivers/mtd/tests/mtd_nandecctest.c
@@ -9,6 +9,8 @@
9#include <linux/slab.h> 9#include <linux/slab.h>
10#include <linux/mtd/nand_ecc.h> 10#include <linux/mtd/nand_ecc.h>
11 11
12#include "mtd_test.h"
13
12/* 14/*
13 * Test the implementation for software ECC 15 * Test the implementation for software ECC
14 * 16 *
@@ -274,6 +276,10 @@ static int nand_ecc_test_run(const size_t size)
274 } 276 }
275 pr_info("ok - %s-%zd\n", 277 pr_info("ok - %s-%zd\n",
276 nand_ecc_test[i].name, size); 278 nand_ecc_test[i].name, size);
279
280 err = mtdtest_relax();
281 if (err)
282 break;
277 } 283 }
278error: 284error:
279 kfree(error_data); 285 kfree(error_data);
diff --git a/drivers/mtd/tests/mtd_test.h b/drivers/mtd/tests/mtd_test.h
index f437c776c54f..4b7bee17c924 100644
--- a/drivers/mtd/tests/mtd_test.h
+++ b/drivers/mtd/tests/mtd_test.h
@@ -1,4 +1,16 @@
1#include <linux/mtd/mtd.h> 1#include <linux/mtd/mtd.h>
2#include <linux/sched.h>
3
4static inline int mtdtest_relax(void)
5{
6 cond_resched();
7 if (signal_pending(current)) {
8 pr_info("aborting test due to pending signal!\n");
9 return -EINTR;
10 }
11
12 return 0;
13}
2 14
3int mtdtest_erase_eraseblock(struct mtd_info *mtd, unsigned int ebnum); 15int mtdtest_erase_eraseblock(struct mtd_info *mtd, unsigned int ebnum);
4int mtdtest_scan_for_bad_eraseblocks(struct mtd_info *mtd, unsigned char *bbt, 16int mtdtest_scan_for_bad_eraseblocks(struct mtd_info *mtd, unsigned char *bbt,
diff --git a/drivers/mtd/tests/nandbiterrs.c b/drivers/mtd/tests/nandbiterrs.c
index 273f7e553954..09a4ccac53a2 100644
--- a/drivers/mtd/tests/nandbiterrs.c
+++ b/drivers/mtd/tests/nandbiterrs.c
@@ -320,6 +320,10 @@ static int overwrite_test(void)
320 break; 320 break;
321 } 321 }
322 322
323 err = mtdtest_relax();
324 if (err)
325 break;
326
323 opno++; 327 opno++;
324 } 328 }
325 329
diff --git a/drivers/mtd/tests/oobtest.c b/drivers/mtd/tests/oobtest.c
index c6b35644a10f..8e8525f0202f 100644
--- a/drivers/mtd/tests/oobtest.c
+++ b/drivers/mtd/tests/oobtest.c
@@ -112,7 +112,10 @@ static int write_whole_device(void)
112 return err; 112 return err;
113 if (i % 256 == 0) 113 if (i % 256 == 0)
114 pr_info("written up to eraseblock %u\n", i); 114 pr_info("written up to eraseblock %u\n", i);
115 cond_resched(); 115
116 err = mtdtest_relax();
117 if (err)
118 return err;
116 } 119 }
117 pr_info("written %u eraseblocks\n", i); 120 pr_info("written %u eraseblocks\n", i);
118 return 0; 121 return 0;
@@ -318,7 +321,10 @@ static int verify_all_eraseblocks(void)
318 return err; 321 return err;
319 if (i % 256 == 0) 322 if (i % 256 == 0)
320 pr_info("verified up to eraseblock %u\n", i); 323 pr_info("verified up to eraseblock %u\n", i);
321 cond_resched(); 324
325 err = mtdtest_relax();
326 if (err)
327 return err;
322 } 328 }
323 pr_info("verified %u eraseblocks\n", i); 329 pr_info("verified %u eraseblocks\n", i);
324 return 0; 330 return 0;
@@ -429,7 +435,10 @@ static int __init mtd_oobtest_init(void)
429 goto out; 435 goto out;
430 if (i % 256 == 0) 436 if (i % 256 == 0)
431 pr_info("verified up to eraseblock %u\n", i); 437 pr_info("verified up to eraseblock %u\n", i);
432 cond_resched(); 438
439 err = mtdtest_relax();
440 if (err)
441 goto out;
433 } 442 }
434 pr_info("verified %u eraseblocks\n", i); 443 pr_info("verified %u eraseblocks\n", i);
435 444
@@ -642,7 +651,11 @@ static int __init mtd_oobtest_init(void)
642 goto out; 651 goto out;
643 if (i % 256 == 0) 652 if (i % 256 == 0)
644 pr_info("written up to eraseblock %u\n", i); 653 pr_info("written up to eraseblock %u\n", i);
645 cond_resched(); 654
655 err = mtdtest_relax();
656 if (err)
657 goto out;
658
646 addr += mtd->writesize; 659 addr += mtd->writesize;
647 } 660 }
648 } 661 }
@@ -680,7 +693,10 @@ static int __init mtd_oobtest_init(void)
680 } 693 }
681 if (i % 256 == 0) 694 if (i % 256 == 0)
682 pr_info("verified up to eraseblock %u\n", i); 695 pr_info("verified up to eraseblock %u\n", i);
683 cond_resched(); 696
697 err = mtdtest_relax();
698 if (err)
699 goto out;
684 } 700 }
685 pr_info("verified %u eraseblocks\n", i); 701 pr_info("verified %u eraseblocks\n", i);
686 702
diff --git a/drivers/mtd/tests/pagetest.c b/drivers/mtd/tests/pagetest.c
index 88296e888e9d..ba1890d5632c 100644
--- a/drivers/mtd/tests/pagetest.c
+++ b/drivers/mtd/tests/pagetest.c
@@ -407,7 +407,10 @@ static int __init mtd_pagetest_init(void)
407 goto out; 407 goto out;
408 if (i % 256 == 0) 408 if (i % 256 == 0)
409 pr_info("written up to eraseblock %u\n", i); 409 pr_info("written up to eraseblock %u\n", i);
410 cond_resched(); 410
411 err = mtdtest_relax();
412 if (err)
413 goto out;
411 } 414 }
412 pr_info("written %u eraseblocks\n", i); 415 pr_info("written %u eraseblocks\n", i);
413 416
@@ -422,7 +425,10 @@ static int __init mtd_pagetest_init(void)
422 goto out; 425 goto out;
423 if (i % 256 == 0) 426 if (i % 256 == 0)
424 pr_info("verified up to eraseblock %u\n", i); 427 pr_info("verified up to eraseblock %u\n", i);
425 cond_resched(); 428
429 err = mtdtest_relax();
430 if (err)
431 goto out;
426 } 432 }
427 pr_info("verified %u eraseblocks\n", i); 433 pr_info("verified %u eraseblocks\n", i);
428 434
diff --git a/drivers/mtd/tests/readtest.c b/drivers/mtd/tests/readtest.c
index a54cf1511114..a3196b750a22 100644
--- a/drivers/mtd/tests/readtest.c
+++ b/drivers/mtd/tests/readtest.c
@@ -190,7 +190,10 @@ static int __init mtd_readtest_init(void)
190 if (!err) 190 if (!err)
191 err = ret; 191 err = ret;
192 } 192 }
193 cond_resched(); 193
194 err = mtdtest_relax();
195 if (err)
196 goto out;
194 } 197 }
195 198
196 if (err) 199 if (err)
diff --git a/drivers/mtd/tests/speedtest.c b/drivers/mtd/tests/speedtest.c
index a77019cb5510..5a6f31af06f9 100644
--- a/drivers/mtd/tests/speedtest.c
+++ b/drivers/mtd/tests/speedtest.c
@@ -269,7 +269,10 @@ static int __init mtd_speedtest_init(void)
269 err = write_eraseblock(i); 269 err = write_eraseblock(i);
270 if (err) 270 if (err)
271 goto out; 271 goto out;
272 cond_resched(); 272
273 err = mtdtest_relax();
274 if (err)
275 goto out;
273 } 276 }
274 stop_timing(); 277 stop_timing();
275 speed = calc_speed(); 278 speed = calc_speed();
@@ -284,7 +287,10 @@ static int __init mtd_speedtest_init(void)
284 err = read_eraseblock(i); 287 err = read_eraseblock(i);
285 if (err) 288 if (err)
286 goto out; 289 goto out;
287 cond_resched(); 290
291 err = mtdtest_relax();
292 if (err)
293 goto out;
288 } 294 }
289 stop_timing(); 295 stop_timing();
290 speed = calc_speed(); 296 speed = calc_speed();
@@ -303,7 +309,10 @@ static int __init mtd_speedtest_init(void)
303 err = write_eraseblock_by_page(i); 309 err = write_eraseblock_by_page(i);
304 if (err) 310 if (err)
305 goto out; 311 goto out;
306 cond_resched(); 312
313 err = mtdtest_relax();
314 if (err)
315 goto out;
307 } 316 }
308 stop_timing(); 317 stop_timing();
309 speed = calc_speed(); 318 speed = calc_speed();
@@ -318,7 +327,10 @@ static int __init mtd_speedtest_init(void)
318 err = read_eraseblock_by_page(i); 327 err = read_eraseblock_by_page(i);
319 if (err) 328 if (err)
320 goto out; 329 goto out;
321 cond_resched(); 330
331 err = mtdtest_relax();
332 if (err)
333 goto out;
322 } 334 }
323 stop_timing(); 335 stop_timing();
324 speed = calc_speed(); 336 speed = calc_speed();
@@ -337,7 +349,10 @@ static int __init mtd_speedtest_init(void)
337 err = write_eraseblock_by_2pages(i); 349 err = write_eraseblock_by_2pages(i);
338 if (err) 350 if (err)
339 goto out; 351 goto out;
340 cond_resched(); 352
353 err = mtdtest_relax();
354 if (err)
355 goto out;
341 } 356 }
342 stop_timing(); 357 stop_timing();
343 speed = calc_speed(); 358 speed = calc_speed();
@@ -352,7 +367,10 @@ static int __init mtd_speedtest_init(void)
352 err = read_eraseblock_by_2pages(i); 367 err = read_eraseblock_by_2pages(i);
353 if (err) 368 if (err)
354 goto out; 369 goto out;
355 cond_resched(); 370
371 err = mtdtest_relax();
372 if (err)
373 goto out;
356 } 374 }
357 stop_timing(); 375 stop_timing();
358 speed = calc_speed(); 376 speed = calc_speed();
@@ -385,7 +403,11 @@ static int __init mtd_speedtest_init(void)
385 err = multiblock_erase(i, j); 403 err = multiblock_erase(i, j);
386 if (err) 404 if (err)
387 goto out; 405 goto out;
388 cond_resched(); 406
407 err = mtdtest_relax();
408 if (err)
409 goto out;
410
389 i += j; 411 i += j;
390 } 412 }
391 stop_timing(); 413 stop_timing();
diff --git a/drivers/mtd/tests/stresstest.c b/drivers/mtd/tests/stresstest.c
index d90c1c01dac6..e509f8aa9a7e 100644
--- a/drivers/mtd/tests/stresstest.c
+++ b/drivers/mtd/tests/stresstest.c
@@ -221,7 +221,10 @@ static int __init mtd_stresstest_init(void)
221 err = do_operation(); 221 err = do_operation();
222 if (err) 222 if (err)
223 goto out; 223 goto out;
224 cond_resched(); 224
225 err = mtdtest_relax();
226 if (err)
227 goto out;
225 } 228 }
226 pr_info("finished, %d operations done\n", op); 229 pr_info("finished, %d operations done\n", op);
227 230
diff --git a/drivers/mtd/tests/subpagetest.c b/drivers/mtd/tests/subpagetest.c
index 0b835c631f91..aecc6ce5a9e1 100644
--- a/drivers/mtd/tests/subpagetest.c
+++ b/drivers/mtd/tests/subpagetest.c
@@ -269,7 +269,10 @@ static int verify_all_eraseblocks_ff(void)
269 return err; 269 return err;
270 if (i % 256 == 0) 270 if (i % 256 == 0)
271 pr_info("verified up to eraseblock %u\n", i); 271 pr_info("verified up to eraseblock %u\n", i);
272 cond_resched(); 272
273 err = mtdtest_relax();
274 if (err)
275 return err;
273 } 276 }
274 pr_info("verified %u eraseblocks\n", i); 277 pr_info("verified %u eraseblocks\n", i);
275 return 0; 278 return 0;
@@ -346,7 +349,10 @@ static int __init mtd_subpagetest_init(void)
346 goto out; 349 goto out;
347 if (i % 256 == 0) 350 if (i % 256 == 0)
348 pr_info("written up to eraseblock %u\n", i); 351 pr_info("written up to eraseblock %u\n", i);
349 cond_resched(); 352
353 err = mtdtest_relax();
354 if (err)
355 goto out;
350 } 356 }
351 pr_info("written %u eraseblocks\n", i); 357 pr_info("written %u eraseblocks\n", i);
352 358
@@ -360,7 +366,10 @@ static int __init mtd_subpagetest_init(void)
360 goto out; 366 goto out;
361 if (i % 256 == 0) 367 if (i % 256 == 0)
362 pr_info("verified up to eraseblock %u\n", i); 368 pr_info("verified up to eraseblock %u\n", i);
363 cond_resched(); 369
370 err = mtdtest_relax();
371 if (err)
372 goto out;
364 } 373 }
365 pr_info("verified %u eraseblocks\n", i); 374 pr_info("verified %u eraseblocks\n", i);
366 375
@@ -383,7 +392,10 @@ static int __init mtd_subpagetest_init(void)
383 goto out; 392 goto out;
384 if (i % 256 == 0) 393 if (i % 256 == 0)
385 pr_info("written up to eraseblock %u\n", i); 394 pr_info("written up to eraseblock %u\n", i);
386 cond_resched(); 395
396 err = mtdtest_relax();
397 if (err)
398 goto out;
387 } 399 }
388 pr_info("written %u eraseblocks\n", i); 400 pr_info("written %u eraseblocks\n", i);
389 401
@@ -398,7 +410,10 @@ static int __init mtd_subpagetest_init(void)
398 goto out; 410 goto out;
399 if (i % 256 == 0) 411 if (i % 256 == 0)
400 pr_info("verified up to eraseblock %u\n", i); 412 pr_info("verified up to eraseblock %u\n", i);
401 cond_resched(); 413
414 err = mtdtest_relax();
415 if (err)
416 goto out;
402 } 417 }
403 pr_info("verified %u eraseblocks\n", i); 418 pr_info("verified %u eraseblocks\n", i);
404 419
diff --git a/drivers/mtd/tests/torturetest.c b/drivers/mtd/tests/torturetest.c
index 5045cf1b3160..e5d6e6d9532f 100644
--- a/drivers/mtd/tests/torturetest.c
+++ b/drivers/mtd/tests/torturetest.c
@@ -279,7 +279,10 @@ static int __init tort_init(void)
279 " for 0xFF... pattern\n"); 279 " for 0xFF... pattern\n");
280 goto out; 280 goto out;
281 } 281 }
282 cond_resched(); 282
283 err = mtdtest_relax();
284 if (err)
285 goto out;
283 } 286 }
284 } 287 }
285 288
@@ -294,7 +297,10 @@ static int __init tort_init(void)
294 err = write_pattern(i, patt); 297 err = write_pattern(i, patt);
295 if (err) 298 if (err)
296 goto out; 299 goto out;
297 cond_resched(); 300
301 err = mtdtest_relax();
302 if (err)
303 goto out;
298 } 304 }
299 305
300 /* Verify what we wrote */ 306 /* Verify what we wrote */
@@ -314,7 +320,10 @@ static int __init tort_init(void)
314 "0x55AA55..." : "0xAA55AA..."); 320 "0x55AA55..." : "0xAA55AA...");
315 goto out; 321 goto out;
316 } 322 }
317 cond_resched(); 323
324 err = mtdtest_relax();
325 if (err)
326 goto out;
318 } 327 }
319 } 328 }
320 329