Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mtd: tests: add multiblock erase test to the mtd_speedtest

New multiblock erase speed test is added to mtd_speedtest.
It consists of 2-, 4-, 8-, 16-, 32- and 64-blocks at once
multiblock erase tests.

Signed-off-by: Roman Tereshonkov <roman.tereshonkov@nokia.com>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>

authored by

Roman Tereshonkov and committed by
David Woodhouse
4085bcc6 fc7fe769

+57 -2
+57 -2
drivers/mtd/tests/mtd_speedtest.c
··· 94 94 return 0; 95 95 } 96 96 97 + static int multiblock_erase(int ebnum, int blocks) 98 + { 99 + int err; 100 + struct erase_info ei; 101 + loff_t addr = ebnum * mtd->erasesize; 102 + 103 + memset(&ei, 0, sizeof(struct erase_info)); 104 + ei.mtd = mtd; 105 + ei.addr = addr; 106 + ei.len = mtd->erasesize * blocks; 107 + 108 + err = mtd->erase(mtd, &ei); 109 + if (err) { 110 + printk(PRINT_PREF "error %d while erasing EB %d, blocks %d\n", 111 + err, ebnum, blocks); 112 + return err; 113 + } 114 + 115 + if (ei.state == MTD_ERASE_FAILED) { 116 + printk(PRINT_PREF "some erase error occurred at EB %d," 117 + "blocks %d\n", ebnum, blocks); 118 + return -EIO; 119 + } 120 + 121 + return 0; 122 + } 123 + 97 124 static int erase_whole_device(void) 98 125 { 99 126 int err; ··· 319 292 ms = (finish.tv_sec - start.tv_sec) * 1000 + 320 293 (finish.tv_usec - start.tv_usec) / 1000; 321 294 k = goodebcnt * mtd->erasesize / 1024; 322 - speed = (k * 1000) / ms; 295 + if (ms) 296 + speed = (k * 1000) / ms; 297 + else 298 + speed = 0; 323 299 return speed; 324 300 } 325 301 ··· 355 325 356 326 static int __init mtd_speedtest_init(void) 357 327 { 358 - int err, i; 328 + int err, i, blocks, j, k; 359 329 long speed; 360 330 uint64_t tmp; 361 331 ··· 525 495 speed = calc_speed(); 526 496 printk(PRINT_PREF "erase speed is %ld KiB/s\n", speed); 527 497 498 + /* Multi-block erase all eraseblocks */ 499 + for (k = 1; k < 7; k++) { 500 + blocks = 1 << k; 501 + printk(PRINT_PREF "Testing %dx multi-block erase speed\n", 502 + blocks); 503 + start_timing(); 504 + for (i = 0; i < ebcnt; ) { 505 + for (j = 0; j < blocks && (i + j) < ebcnt; j++) 506 + if (bbt[i + j]) 507 + break; 508 + if (j < 1) { 509 + i++; 510 + continue; 511 + } 512 + err = multiblock_erase(i, j); 513 + if (err) 514 + goto out; 515 + cond_resched(); 516 + i += j; 517 + } 518 + stop_timing(); 519 + speed = calc_speed(); 520 + printk(PRINT_PREF "%dx multi-block erase speed is %ld KiB/s\n", 521 + blocks, speed); 522 + } 528 523 printk(PRINT_PREF "finished\n"); 529 524 out: 530 525 kfree(iobuf);