aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2011-03-27 22:06:57 +0200
committerArnd Bergmann <arnd@arndb.de>2011-03-27 22:06:57 +0200
commitc32531a81a6206588ebb6b2413675c715dccb76e (patch)
tree1eb1bb15496c6a7a4c80bb91e03acdab006a358f
parent61472b698bb573ec135982d55749394c276140b6 (diff)
flashbench: add --offset command line argument
This makes it easier to do the --open-au test case on drives whose erase block is not a power of two. Note that for those, you have to pass a blocksize that is also not a power of two, but a fraction of the erase size, e.g. flashbench --open-au --random --open-au-nr=6 \ --erasesize=$[3 * 1024 * 1024] \ --blocksize=$[24 * 1024] \ --offset=$[24 * 1024 * 1024] \ /dev/sde Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-rw-r--r--flashbench.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/flashbench.c b/flashbench.c
index 9d04a23..aaf4c5d 100644
--- a/flashbench.c
+++ b/flashbench.c
@@ -466,6 +466,7 @@ static int try_program(struct device *dev)
return 0;
}
+#if 0
static int try_open_au_oob(struct device *dev, unsigned int erasesize,
unsigned int blocksize,
unsigned int count,
@@ -505,12 +506,18 @@ static int try_open_au_oob(struct device *dev, unsigned int erasesize,
return 0;
}
+#endif
static int try_open_au(struct device *dev, unsigned int erasesize,
unsigned int blocksize,
unsigned int count,
+ unsigned long long offset,
bool random)
{
+ /* start 16 MB into the device, to skip FAT */
+ if (offset == -1ull)
+ offset = 1024 * 1024 * 16;
+
/* find maximum number of open AUs */
struct operation program[] = {
/* loop through power of two multiple of one sector */
@@ -521,8 +528,7 @@ static int try_open_au(struct device *dev, unsigned int erasesize,
{O_PRINTF},
{O_FORMAT},
{O_LENGTH},
- /* start 16 MB into the device, to skip FAT */
- {O_OFF_FIXED, .val = 1024 * 1024 * 16}, {O_DROP},
+ {O_OFF_FIXED, .val = offset}, {O_DROP},
/* print one line of aggregated
per second results */
{O_PRINTF}, {O_FORMAT}, {O_BPS},
@@ -588,6 +594,7 @@ static void print_help(const char *name)
printf(" --fat-nr=N look through first N erase blocks (default: 6)\n");
printf("-O, --open-au find number of open erase blocks\n");
printf(" --open-au-nr=N try N open erase blocks\n");
+ printf(" --offset=N start at position N\n");
printf("-r, --random use pseudorandom access with erase block\n");
printf("-v, --verbose increase verbosity of output\n");
printf("-c, --count=N run each test N times (default: 8\n");
@@ -603,6 +610,7 @@ struct arguments {
int count;
int blocksize;
int erasesize;
+ unsigned long long offset;
int scatter_order;
int scatter_span;
int interval_order;
@@ -624,6 +632,7 @@ static int parse_arguments(int argc, char **argv, struct arguments *args)
{ "fat-nr", 1, NULL, 'F' },
{ "open-au", 0, NULL, 'O' },
{ "open-au-nr", 1, NULL, '0' },
+ { "offset", 1, NULL, 't' },
{ "random", 0, NULL, 'r' },
{ "verbose", 0, NULL, 'v' },
{ "count", 1, NULL, 'c' },
@@ -637,6 +646,7 @@ static int parse_arguments(int argc, char **argv, struct arguments *args)
args->scatter_order = 9;
args->scatter_span = 1;
args->blocksize = 16384;
+ args->offset = -1ull;
args->erasesize = 4 * 1024 * 1024;
args->fat_nr = 6;
args->open_au_nr = 2;
@@ -718,6 +728,10 @@ static int parse_arguments(int argc, char **argv, struct arguments *args)
args->erasesize = atoi(optarg);
break;
+ case 't':
+ args->offset = strtoull(optarg, NULL, 0);
+ break;
+
case '?':
print_help(argv[0]);
return -EINVAL;
@@ -806,7 +820,7 @@ int main(int argc, char **argv)
if (args.open_au) {
ret = try_open_au(&dev, args.erasesize, args.blocksize,
- args.open_au_nr, args.random);
+ args.open_au_nr, args.offset, args.random);
if (ret < 0) {
errno = -ret;
perror("find_fat");