From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, anton.nefedov@virtuozzo.com,
vsementsov@virtuozzo.com, qemu-devel@nongnu.org,
mreitz@redhat.com
Subject: [PATCH] qcow2: Reduce write_zeroes size in handle_alloc_space()
Date: Tue, 9 Jun 2020 16:08:59 +0200 [thread overview]
Message-ID: <20200609140859.142230-1-kwolf@redhat.com> (raw)
Since commit c8bb23cbdbe, handle_alloc_space() is called for newly
allocated clusters to efficiently initialise the COW areas with zeros if
necessary. It skips the whole operation if both start_cow nor end_cow
are empty. However, it requests zeroing the whole request size (possibly
multiple megabytes) even if only one end of the request actually needs
this.
This patch reduces the write_zeroes request size in this case so that we
don't unnecessarily zero-initialise a region that we're going to
overwrite immediately.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block/qcow2.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/block/qcow2.c b/block/qcow2.c
index 0cd2e6757e..77742877fb 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -2403,6 +2403,8 @@ static int handle_alloc_space(BlockDriverState *bs, QCowL2Meta *l2meta)
}
for (m = l2meta; m != NULL; m = m->next) {
+ uint64_t start = m->alloc_offset;
+ uint64_t len = m->nb_clusters * s->cluster_size;
int ret;
if (!m->cow_start.nb_bytes && !m->cow_end.nb_bytes) {
@@ -2413,21 +2415,25 @@ static int handle_alloc_space(BlockDriverState *bs, QCowL2Meta *l2meta)
continue;
}
+ if (!m->cow_start.nb_bytes) {
+ start += m->cow_end.offset;
+ len -= m->cow_end.offset;
+ } else if (!m->cow_end.nb_bytes) {
+ len = m->cow_start.nb_bytes;
+ }
+
/*
* instead of writing zero COW buffers,
* efficiently zero out the whole clusters
*/
- ret = qcow2_pre_write_overlap_check(bs, 0, m->alloc_offset,
- m->nb_clusters * s->cluster_size,
- true);
+ ret = qcow2_pre_write_overlap_check(bs, 0, start, len, true);
if (ret < 0) {
return ret;
}
BLKDBG_EVENT(bs->file, BLKDBG_CLUSTER_ALLOC_SPACE);
- ret = bdrv_co_pwrite_zeroes(s->data_file, m->alloc_offset,
- m->nb_clusters * s->cluster_size,
+ ret = bdrv_co_pwrite_zeroes(s->data_file, start, len,
BDRV_REQ_NO_FALLBACK);
if (ret < 0) {
if (ret != -ENOTSUP && ret != -EAGAIN) {
--
2.25.4
next reply other threads:[~2020-06-09 14:10 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-09 14:08 Kevin Wolf [this message]
2020-06-09 14:28 ` [PATCH] qcow2: Reduce write_zeroes size in handle_alloc_space() Vladimir Sementsov-Ogievskiy
2020-06-09 14:46 ` Eric Blake
2020-06-09 15:18 ` Kevin Wolf
2020-06-09 15:29 ` Vladimir Sementsov-Ogievskiy
2020-06-10 8:38 ` Vladimir Sementsov-Ogievskiy
2020-06-09 16:19 ` Eric Blake
2020-06-10 6:50 ` Vladimir Sementsov-Ogievskiy
2020-06-10 11:25 ` Kevin Wolf
2020-06-09 14:43 ` Eric Blake
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=20200609140859.142230-1-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=anton.nefedov@virtuozzo.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=vsementsov@virtuozzo.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.