On Mon, Jun 22, 2020 at 6:12 PM Kevin Wolf <kw...@redhat.com> wrote: > > 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 <nsof...@redhat.com> > Signed-off-by: Kevin Wolf <kw...@redhat.com>
Thanks, you can also add: Tested-by: Nir Soffer <nsof...@redhat.com> > --- > qemu-img.c | 9 --------- > 1 file changed, 9 deletions(-) > > diff --git a/qemu-img.c b/qemu-img.c > index d7e846e607..bdb9f6aa46 100644 > --- a/qemu-img.c > +++ b/qemu-img.c > @@ -2084,15 +2084,6 @@ static int convert_do_copy(ImgConvertState *s) > s->has_zero_init = bdrv_has_zero_init(blk_bs(s->target)); > } > > - 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.25.4 >