From: Fam Zheng <famz@redhat.com>
To: Eric Blake <eblake@redhat.com>
Cc: qemu-devel@nongnu.org, qemu-block@nongnu.org, den@openvz.org,
kwolf@redhat.com, Stefan Hajnoczi <stefanha@redhat.com>,
Max Reitz <mreitz@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v3 1/5] block: split write_zeroes always
Date: Thu, 26 May 2016 16:51:57 +0800 [thread overview]
Message-ID: <20160526085157.GE31052@ad.usersys.redhat.com> (raw)
In-Reply-To: <1464234529-13018-2-git-send-email-eblake@redhat.com>
On Wed, 05/25 21:48, Eric Blake wrote:
> From: "Denis V. Lunev" <den@openvz.org>
>
> We should split requests even if they are less than write_zeroes_alignment.
> For example we can have the following request:
> offset 62k
> size 4k
> write_zeroes_alignment 64k
> The original code sent 1 request covering 2 qcow2 clusters, and resulted
> in both clusters being allocated. But by splitting the request, we can
> cater to the case where one of the two clusters can be zeroed as a
> whole, for only 1 cluster allocated after the operation.
>
> Signed-off-by: Denis V. Lunev <den@openvz.org>
> CC: Eric Blake <eblake@redhat.com>
> CC: Kevin Wolf <kwolf@redhat.com>
> Message-Id: <1463476543-3087-2-git-send-email-den@openvz.org>
>
> [eblake: Avoid exceeding nb_sectors, hoist alignment checks out of
> loop, and update testsuite to show that patch works]
>
> Signed-off-by: Eric Blake <eblake@redhat.com>
> ---
> block/io.c | 30 +++++++++++++++++-------------
> tests/qemu-iotests/154.out | 18 ++++++++++++------
> 2 files changed, 29 insertions(+), 19 deletions(-)
>
> diff --git a/block/io.c b/block/io.c
> index f474b9a..26b5845 100644
> --- a/block/io.c
> +++ b/block/io.c
> @@ -1118,28 +1118,32 @@ static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs,
> struct iovec iov = {0};
> int ret = 0;
> bool need_flush = false;
> + int head = 0;
> + int tail = 0;
>
> int max_write_zeroes = MIN_NON_ZERO(bs->bl.max_write_zeroes,
> BDRV_REQUEST_MAX_SECTORS);
> + if (bs->bl.write_zeroes_alignment) {
> + assert(is_power_of_2(bs->bl.write_zeroes_alignment));
> + head = sector_num & (bs->bl.write_zeroes_alignment - 1);
> + tail = (sector_num + nb_sectors) & (bs->bl.write_zeroes_alignment - 1);
> + max_write_zeroes &= ~(bs->bl.write_zeroes_alignment - 1);
> + }
>
> while (nb_sectors > 0 && !ret) {
> int num = nb_sectors;
>
> /* Align request. Block drivers can expect the "bulk" of the request
> - * to be aligned.
> + * to be aligned, and that unaligned requests do not cross cluster
> + * boundaries.
> */
> - if (bs->bl.write_zeroes_alignment
> - && num > bs->bl.write_zeroes_alignment) {
> - if (sector_num % bs->bl.write_zeroes_alignment != 0) {
> - /* Make a small request up to the first aligned sector. */
> - num = bs->bl.write_zeroes_alignment;
> - num -= sector_num % bs->bl.write_zeroes_alignment;
> - } else if ((sector_num + num) % bs->bl.write_zeroes_alignment != 0) {
> - /* Shorten the request to the last aligned sector. num cannot
> - * underflow because num > bs->bl.write_zeroes_alignment.
> - */
> - num -= (sector_num + num) % bs->bl.write_zeroes_alignment;
> - }
> + if (head) {
> + /* Make a small request up to the first aligned sector. */
> + num = MIN(nb_sectors, bs->bl.write_zeroes_alignment - head);
> + head = 0;
> + } else if (tail && num > bs->bl.write_zeroes_alignment) {
> + /* Shorten the request to the last aligned sector. */
> + num -= tail;
> }
>
> /* limit request size */
> diff --git a/tests/qemu-iotests/154.out b/tests/qemu-iotests/154.out
> index 8946b73..b9d27c5 100644
> --- a/tests/qemu-iotests/154.out
> +++ b/tests/qemu-iotests/154.out
> @@ -106,11 +106,14 @@ read 1024/1024 bytes at offset 67584
> read 5120/5120 bytes at offset 68608
> 5 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> [{ "start": 0, "length": 32768, "depth": 1, "zero": true, "data": false},
> -{ "start": 32768, "length": 8192, "depth": 0, "zero": false, "data": true, "offset": 20480},
> +{ "start": 32768, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": 20480},
> +{ "start": 36864, "length": 4096, "depth": 0, "zero": true, "data": false},
> { "start": 40960, "length": 8192, "depth": 1, "zero": true, "data": false},
> -{ "start": 49152, "length": 8192, "depth": 0, "zero": false, "data": true, "offset": 28672},
> +{ "start": 49152, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": 24576},
> +{ "start": 53248, "length": 4096, "depth": 0, "zero": true, "data": false},
> { "start": 57344, "length": 8192, "depth": 1, "zero": true, "data": false},
> -{ "start": 65536, "length": 8192, "depth": 0, "zero": false, "data": true, "offset": 36864},
> +{ "start": 65536, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": 28672},
> +{ "start": 69632, "length": 4096, "depth": 0, "zero": true, "data": false},
> { "start": 73728, "length": 134144000, "depth": 1, "zero": true, "data": false}]
>
> == spanning two clusters, non-zero after request ==
> @@ -145,11 +148,14 @@ read 7168/7168 bytes at offset 65536
> read 1024/1024 bytes at offset 72704
> 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> [{ "start": 0, "length": 32768, "depth": 1, "zero": true, "data": false},
> -{ "start": 32768, "length": 8192, "depth": 0, "zero": false, "data": true, "offset": 20480},
> +{ "start": 32768, "length": 4096, "depth": 0, "zero": true, "data": false},
> +{ "start": 36864, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": 20480},
> { "start": 40960, "length": 8192, "depth": 1, "zero": true, "data": false},
> -{ "start": 49152, "length": 8192, "depth": 0, "zero": false, "data": true, "offset": 28672},
> +{ "start": 49152, "length": 4096, "depth": 0, "zero": true, "data": false},
> +{ "start": 53248, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": 24576},
> { "start": 57344, "length": 8192, "depth": 1, "zero": true, "data": false},
> -{ "start": 65536, "length": 8192, "depth": 0, "zero": false, "data": true, "offset": 36864},
> +{ "start": 65536, "length": 4096, "depth": 0, "zero": true, "data": false},
> +{ "start": 69632, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": 28672},
> { "start": 73728, "length": 134144000, "depth": 1, "zero": true, "data": false}]
>
> == spanning two clusters, partially overwriting backing file ==
> --
> 2.5.5
>
Reviewed-by: Fam Zheng <famz@redhat.com>
next prev parent reply other threads:[~2016-05-26 8:52 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-26 3:48 [Qemu-devel] [PATCH v3 0/5] qcow2_co_write_zeroes and related improvements Eric Blake
2016-05-26 3:48 ` [Qemu-devel] [PATCH v3 1/5] block: split write_zeroes always Eric Blake
2016-05-26 8:51 ` Fam Zheng [this message]
2016-05-26 3:48 ` [Qemu-devel] [PATCH v3 2/5] qcow2: simplify logic in qcow2_co_write_zeroes Eric Blake
2016-05-26 3:48 ` [Qemu-devel] [PATCH v3 3/5] qcow2: add tracepoints for qcow2_co_write_zeroes Eric Blake
2016-05-26 3:48 ` [Qemu-devel] [PATCH v3 4/5] qemu-iotests: Test one more spot for optimizing write_zeroes Eric Blake
2016-05-26 3:48 ` [Qemu-devel] [PATCH v3 5/5] qcow2: Catch more unaligned write_zero into zero cluster Eric Blake
2016-05-26 13:41 ` Denis V. Lunev
2016-05-26 14:35 ` Eric Blake
2016-06-02 10:14 ` Kevin Wolf
2016-06-02 12:33 ` Eric Blake
2016-05-26 14:56 ` Denis V. Lunev
2016-06-02 10:20 ` [Qemu-devel] [PATCH v3 0/5] qcow2_co_write_zeroes and related improvements Kevin Wolf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160526085157.GE31052@ad.usersys.redhat.com \
--to=famz@redhat.com \
--cc=den@openvz.org \
--cc=eblake@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.