From eea45924903f03dc6d8f20576be0a4a84d5acce4 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Wed, 10 Feb 2021 10:16:11 -0500 Subject: [PATCH 4/5] qemu-img convert: Don't pre-zero images RH-Author: Kevin Wolf Message-id: <20210210101611.137928-2-kwolf@redhat.com> Patchwork-id: 101030 O-Subject: [RHEL-8.4.0 qemu-kvm PATCH 1/1] qemu-img convert: Don't pre-zero images Bugzilla: 1855250 RH-Acked-by: Stefano Garzarella RH-Acked-by: Laszlo Ersek RH-Acked-by: Max Reitz Since commit 5a37b60a61c, qemu-img create will pre-zero the target image if it isn't already zero-initialised (most importantly, for host block devices, but also iscsi etc.), so that writing explicit zeros wouldn't be necessary later. This could speed up the operation significantly, in particular when the source image file was only sparsely populated. However, it also means that some block are written twice: Once when pre-zeroing them, and then when they are overwritten with actual data. On a full image, the pre-zeroing is wasted work because everything will be overwritten. In practice, write_zeroes typically turns out faster than writing explicit zero buffers, but slow enough that first zeroing everything and then overwriting parts can be a significant net loss. Meanwhile, qemu-img convert was rewritten in 690c7301600 and zero blocks are now written to the target using bdrv_co_pwrite_zeroes() if the target could be pre-zeroed. This way we already make use of the faster write_zeroes operation, but avoid writing any blocks twice. Remove the pre-zeroing because these days this former optimisation has actually turned into a pessimisation in the common case. Reported-by: Nir Soffer Signed-off-by: Kevin Wolf Message-Id: <20200622151203.35624-1-kwolf@redhat.com> Tested-by: Nir Soffer Reviewed-by: Eric Blake Signed-off-by: Kevin Wolf (cherry picked from commit edafc70c0c8510862f2f213a3acf7067113bcd08) Signed-off-by: Kevin Wolf Signed-off-by: Danilo C. L. de Paula --- qemu-img.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/qemu-img.c b/qemu-img.c index a27ad70851..b10dc5129b 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -2029,15 +2029,6 @@ static int convert_do_copy(ImgConvertState *s) s->has_zero_init = false; } - if (!s->has_zero_init && !s->target_has_backing && - bdrv_can_write_zeroes_with_unmap(blk_bs(s->target))) - { - ret = blk_make_zero(s->target, BDRV_REQ_MAY_UNMAP | BDRV_REQ_NO_FALLBACK); - if (ret == 0) { - s->has_zero_init = true; - } - } - /* Allocate buffer for copied data. For compressed images, only one cluster * can be copied at a time. */ if (s->compressed) { -- 2.27.0