[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PULL 22/22] qcow2: Stop overwriting compressed clusters on
From: |
Kevin Wolf |
Subject: |
[Qemu-block] [PULL 22/22] qcow2: Stop overwriting compressed clusters one by one |
Date: |
Thu, 12 Sep 2019 15:46:04 +0200 |
From: Alberto Garcia <address@hidden>
handle_alloc() tries to find as many contiguous clusters that need
copy-on-write as possible in order to allocate all of them at the same
time.
However, compressed clusters are only overwritten one by one, so let's
say that we have an image with 1024 consecutive compressed clusters:
qemu-img create -f qcow2 hd.qcow2 64M
for f in `seq 0 64 65472`; do
qemu-io -c "write -c ${f}k 64k" hd.qcow2
done
In this case trying to overwrite the whole image with one large write
request results in 1024 separate allocations:
qemu-io -c "write 0 64M" hd.qcow2
This restriction comes from commit 095a9c58ce12afeeb90c2 from 2008.
Nowadays QEMU can overwrite multiple compressed clusters just fine,
and in fact it already does: as long as the first cluster that
handle_alloc() finds is not compressed, all other compressed clusters
in the same batch will be overwritten in one go:
qemu-img create -f qcow2 hd.qcow2 64M
qemu-io -c "write -z 0 64k" hd.qcow2
for f in `seq 64 64 65472`; do
qemu-io -c "write -c ${f}k 64k" hd.qcow2
done
Compared to the previous one, overwriting this image on my computer
goes from 8.35s down to 230ms.
Signed-off-by: Alberto Garcia <address@hidden>
Reviewed-by: John Snow <address@hidden
Signed-off-by: Kevin Wolf <address@hidden>
---
block/qcow2-cluster.c | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index f09cc992af..dcacd3c450 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -1351,13 +1351,7 @@ static int handle_alloc(BlockDriverState *bs, uint64_t
guest_offset,
}
entry = be64_to_cpu(l2_slice[l2_index]);
-
- /* For the moment, overwrite compressed clusters one by one */
- if (entry & QCOW_OFLAG_COMPRESSED) {
- nb_clusters = 1;
- } else {
- nb_clusters = count_cow_clusters(bs, nb_clusters, l2_slice, l2_index);
- }
+ nb_clusters = count_cow_clusters(bs, nb_clusters, l2_slice, l2_index);
/* This function is only called when there were no non-COW clusters, so if
* we can't find any unallocated or COW clusters either, something is
--
2.20.1
- [Qemu-block] [PULL 11/22] iotests: Test blockdev-create for vpc, (continued)
- [Qemu-block] [PULL 11/22] iotests: Test blockdev-create for vpc, Kevin Wolf, 2019/09/12
- [Qemu-block] [PULL 12/22] iotests: skip 232 when run tests as root, Kevin Wolf, 2019/09/12
- [Qemu-block] [PULL 13/22] block/nfs: add support for nfs_umount, Kevin Wolf, 2019/09/12
- [Qemu-block] [PULL 15/22] iotests: exclude killed processes from running under Valgrind, Kevin Wolf, 2019/09/12
- [Qemu-block] [PULL 16/22] iotests: Add casenotrun report to bash tests, Kevin Wolf, 2019/09/12
- [Qemu-block] [PULL 14/22] iotests: allow Valgrind checking all QEMU processes, Kevin Wolf, 2019/09/12
- [Qemu-block] [PULL 17/22] iotests: Valgrind fails with nonexistent directory, Kevin Wolf, 2019/09/12
- [Qemu-block] [PULL 18/22] iotests: extended timeout under Valgrind, Kevin Wolf, 2019/09/12
- [Qemu-block] [PULL 19/22] iotests: extend sleeping time under Valgrind, Kevin Wolf, 2019/09/12
- [Qemu-block] [PULL 20/22] qemu-io: Don't leak pattern file in error path, Kevin Wolf, 2019/09/12
- [Qemu-block] [PULL 22/22] qcow2: Stop overwriting compressed clusters one by one,
Kevin Wolf <=
- [Qemu-block] [PULL 21/22] block/create: Do not abort if a block driver is not available, Kevin Wolf, 2019/09/12
- Re: [Qemu-block] [PULL 00/22] Block layer patches, Peter Maydell, 2019/09/13