aboutsummaryrefslogtreecommitdiff
path: root/qemu-img.c
diff options
context:
space:
mode:
Diffstat (limited to 'qemu-img.c')
-rw-r--r--qemu-img.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/qemu-img.c b/qemu-img.c
index 480ef8dba3..c5e2638a5a 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -3465,6 +3465,7 @@ typedef struct BenchData {
uint64_t image_size;
bool write;
int bufsize;
+ int step;
int nrreq;
int n;
uint8_t *buf;
@@ -3501,7 +3502,7 @@ static void bench_cb(void *opaque, int ret)
exit(EXIT_FAILURE);
}
b->in_flight++;
- b->offset += b->bufsize;
+ b->offset += b->step;
b->offset %= b->image_size;
}
}
@@ -3518,6 +3519,7 @@ static int img_bench(int argc, char **argv)
int64_t offset = 0;
size_t bufsize = 4096;
int pattern = 0;
+ size_t step = 0;
int64_t image_size;
BlockBackend *blk = NULL;
BenchData data = {};
@@ -3533,7 +3535,7 @@ static int img_bench(int argc, char **argv)
{"pattern", required_argument, 0, OPTION_PATTERN},
{0, 0, 0, 0}
};
- c = getopt_long(argc, argv, "hc:d:f:no:qs:t:w", long_options, NULL);
+ c = getopt_long(argc, argv, "hc:d:f:no:qs:S:t:w", long_options, NULL);
if (c == -1) {
break;
}
@@ -3601,6 +3603,20 @@ static int img_bench(int argc, char **argv)
bufsize = sval;
break;
}
+ case 'S':
+ {
+ int64_t sval;
+ char *end;
+
+ sval = qemu_strtosz_suffix(optarg, &end, QEMU_STRTOSZ_DEFSUFFIX_B);
+ if (sval < 0 || sval > INT_MAX || *end) {
+ error_report("Invalid step size specified");
+ return 1;
+ }
+
+ step = sval;
+ break;
+ }
case 't':
ret = bdrv_parse_cache_mode(optarg, &flags, &writethrough);
if (ret < 0) {
@@ -3651,15 +3667,16 @@ static int img_bench(int argc, char **argv)
.blk = blk,
.image_size = image_size,
.bufsize = bufsize,
+ .step = step ?: bufsize,
.nrreq = depth,
.n = count,
.offset = offset,
.write = is_write,
};
printf("Sending %d %s requests, %d bytes each, %d in parallel "
- "(starting at offset %" PRId64 ")\n",
+ "(starting at offset %" PRId64 ", step size %d)\n",
data.n, data.write ? "write" : "read", data.bufsize, data.nrreq,
- data.offset);
+ data.offset, data.step);
data.buf = blk_blockalign(blk, data.nrreq * data.bufsize);
memset(data.buf, pattern, data.nrreq * data.bufsize);