From patchwork Fri Jun 3 12:30:20 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Wolf X-Patchwork-Id: 629794 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3rLkDM0VyDz9t7r for ; Fri, 3 Jun 2016 22:38:58 +1000 (AEST) Received: from localhost ([::1]:54766 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b8oNI-00007X-UB for incoming@patchwork.ozlabs.org; Fri, 03 Jun 2016 08:38:52 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53904) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b8oFX-0002td-5R for qemu-devel@nongnu.org; Fri, 03 Jun 2016 08:30:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1b8oFR-0007pa-0O for qemu-devel@nongnu.org; Fri, 03 Jun 2016 08:30:51 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57462) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b8oFK-0007mP-Eu; Fri, 03 Jun 2016 08:30:38 -0400 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 14CA0C01605F; Fri, 3 Jun 2016 12:30:38 +0000 (UTC) Received: from noname.redhat.com (ovpn-116-70.ams2.redhat.com [10.36.116.70]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u53CUS4x001541; Fri, 3 Jun 2016 08:30:36 -0400 From: Kevin Wolf To: qemu-block@nongnu.org Date: Fri, 3 Jun 2016 14:30:20 +0200 Message-Id: <1464957021-3469-5-git-send-email-kwolf@redhat.com> In-Reply-To: <1464957021-3469-1-git-send-email-kwolf@redhat.com> References: <1464957021-3469-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Fri, 03 Jun 2016 12:30:38 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 4/5] qemu-img bench: Implement -S (step size) X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, den@openvz.org, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" With this new option, qemu-img bench can be told to advance the current offset after each request by a different value than the buffer size. This is useful for controlling the conditions for cluster allocation in image formats (e.g. qcow2 cluster allocation with COW in front of the request, or COW areas that aren't overwritten immediately). Signed-off-by: Kevin Wolf Reviewed-by: Denis V. Lunev --- qemu-img-cmds.hx | 4 ++-- qemu-img.c | 25 +++++++++++++++++++++---- qemu-img.texi | 6 ++++-- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx index b9b521e..f5d0098 100644 --- a/qemu-img-cmds.hx +++ b/qemu-img-cmds.hx @@ -10,9 +10,9 @@ STEXI ETEXI DEF("bench", img_bench, - "bench [-c count] [-d depth] [-f fmt] [-n] [-o offset] [-q] [-s buffer_size] [-t cache] [-w] filename") + "bench [-c count] [-d depth] [-f fmt] [-n] [-o offset] [-q] [-s buffer_size] [-S step_size] [-t cache] [-w] filename") STEXI -@item bench [-c @var{count}] [-d @var{depth}] [-f @var{fmt}] [-n] [-o @var{offset}] [-q] [-s @var{buffer_size}] [-t @var{cache}] [-w] @var{filename} +@item bench [-c @var{count}] [-d @var{depth}] [-f @var{fmt}] [-n] [-o @var{offset}] [-q] [-s @var{buffer_size}] [-S @var{step_size}] [-t @var{cache}] [-w] @var{filename} ETEXI DEF("check", img_check, diff --git a/qemu-img.c b/qemu-img.c index fcac8b8..ff99181 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -3464,6 +3464,7 @@ typedef struct BenchData { uint64_t image_size; bool write; int bufsize; + int step; int nrreq; int n; uint8_t *buf; @@ -3500,7 +3501,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; } } @@ -3516,6 +3517,7 @@ static int img_bench(int argc, char **argv) int depth = 64; int64_t offset = 0; size_t bufsize = 4096; + size_t step = 0; int64_t image_size; BlockBackend *blk = NULL; BenchData data = {}; @@ -3530,7 +3532,7 @@ static int img_bench(int argc, char **argv) {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS}, {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; } @@ -3598,6 +3600,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) { @@ -3637,15 +3653,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, 0, data.nrreq * data.bufsize); diff --git a/qemu-img.texi b/qemu-img.texi index c37380e..6b03d3f 100644 --- a/qemu-img.texi +++ b/qemu-img.texi @@ -131,14 +131,16 @@ Skip the creation of the target volume Command description: @table @option -@item bench [-c @var{count}] [-d @var{depth}] [-f @var{fmt}] [-n] [-o @var{offset}] [-q] [-s @var{buffer_size}] [-t @var{cache}] [-w] @var{filename} +@item bench [-c @var{count}] [-d @var{depth}] [-f @var{fmt}] [-n] [-o @var{offset}] [-q] [-s @var{buffer_size}] [-S @var{step_size}] [-t @var{cache}] [-w] @var{filename} Run a simple sequential I/O benchmark on the specified image. If @code{-w} is specified, a write test is performed, otherwise a read test is performed. A total number of @var{count} I/O requests is performed, each @var{buffer_size} bytes in size, and with @var{depth} requests in parallel. The first request -starts at the position given by @var{offset}. +starts at the position given by @var{offset}, each following request increases +the current position by @var{step_size}. If @var{step_size} is not given, +@var{buffer_size} is used for its value. If @code{-n} is specified, the native AIO backend is used if possible. On Linux, this option only works if @code{-t none} or @code{-t directsync} is