[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 04/15] qcow2: alloc space for COW in one chunk
From: |
Anton Nefedov |
Subject: |
[Qemu-devel] [PATCH v2 04/15] qcow2: alloc space for COW in one chunk |
Date: |
Thu, 1 Jun 2017 18:14:22 +0300 |
From: "Denis V. Lunev" <address@hidden>
Currently each single write operation can result in 3 write operations
if guest offsets are not cluster aligned. One write is performed for the
real payload and two for COW-ed areas. Thus the data possibly lays
non-contiguously on the host filesystem. This will reduce further
sequential read performance significantly.
The patch allocates the space in the file with cluster granularity,
ensuring
1. better host offset locality
2. less space allocation operations
(which can be expensive on distributed storage)
Signed-off-by: Denis V. Lunev <address@hidden>
Signed-off-by: Anton Nefedov <address@hidden>
---
block/qcow2.c | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)
diff --git a/block/qcow2.c b/block/qcow2.c
index b3ba5da..cd5efba 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -1575,6 +1575,24 @@ fail:
return ret;
}
+static void handle_alloc_space(BlockDriverState *bs, QCowL2Meta *l2meta)
+{
+ BDRVQcow2State *s = bs->opaque;
+ QCowL2Meta *m;
+
+ for (m = l2meta; m != NULL; m = m->next) {
+ uint64_t bytes = m->nb_clusters << s->cluster_bits;
+
+ if (m->cow_start.nb_bytes == 0 && m->cow_end.nb_bytes == 0) {
+ continue;
+ }
+
+ /* try to alloc host space in one chunk for better locality */
+ bdrv_co_pwrite_zeroes(bs->file, m->alloc_offset, bytes,
+ BDRV_REQ_ALLOCATE);
+ }
+}
+
static coroutine_fn int qcow2_co_pwritev(BlockDriverState *bs, uint64_t offset,
uint64_t bytes, QEMUIOVector *qiov,
int flags)
@@ -1656,8 +1674,12 @@ static coroutine_fn int
qcow2_co_pwritev(BlockDriverState *bs, uint64_t offset,
if (ret < 0) {
goto fail;
}
-
qemu_co_mutex_unlock(&s->lock);
+
+ if (bs->file->bs->supported_zero_flags & BDRV_REQ_ALLOCATE) {
+ handle_alloc_space(bs, l2meta);
+ }
+
BLKDBG_EVENT(bs->file, BLKDBG_WRITE_AIO);
trace_qcow2_writev_data(qemu_coroutine_self(),
cluster_offset + offset_in_cluster);
--
2.7.4
- [Qemu-devel] [PATCH v2 00/15] qcow2: space preallocation and COW improvements, Anton Nefedov, 2017/06/01
- [Qemu-devel] [PATCH v2 01/15] block: introduce BDRV_REQ_ALLOCATE flag, Anton Nefedov, 2017/06/01
- [Qemu-devel] [PATCH v2 04/15] qcow2: alloc space for COW in one chunk,
Anton Nefedov <=
- [Qemu-devel] [PATCH v2 05/15] qcow2: do not COW the empty areas, Anton Nefedov, 2017/06/01
- [Qemu-devel] [PATCH v2 03/15] blkdebug: support BDRV_REQ_ALLOCATE, Anton Nefedov, 2017/06/01
- [Qemu-devel] [PATCH v2 07/15] qcow2: set inactive flag, Anton Nefedov, 2017/06/01
- [Qemu-devel] [PATCH v2 10/15] qcow2: handle_prealloc(): find out if area zeroed by earlier preallocation, Anton Nefedov, 2017/06/01
- [Qemu-devel] [PATCH v2 06/15] qcow2: preallocation at image expand, Anton Nefedov, 2017/06/01
- [Qemu-devel] [PATCH v2 08/15] qcow2: truncate preallocated space, Anton Nefedov, 2017/06/01