From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45585) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cazs6-0006HK-1d for qemu-devel@nongnu.org; Tue, 07 Feb 2017 02:07:30 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cazs1-000781-PT for qemu-devel@nongnu.org; Tue, 07 Feb 2017 02:07:26 -0500 Received: from mx1.redhat.com ([209.132.183.28]:41544) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cazs1-00077k-H6 for qemu-devel@nongnu.org; Tue, 07 Feb 2017 02:07:21 -0500 Date: Tue, 7 Feb 2017 02:07:19 -0500 From: Jeff Cody Message-ID: <20170207070719.GE27752@localhost.localdomain> References: <1486045515-8009-1-git-send-email-den@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1486045515-8009-1-git-send-email-den@openvz.org> Subject: Re: [Qemu-devel] [PATCH v2 1/1] mirror: do not increase offset during initial zero_or_discard phase List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Denis V. Lunev" Cc: qemu-devel@nongnu.org, Anton Nefedov , Kevin Wolf , Max Reitz , Eric Blake On Thu, Feb 02, 2017 at 05:25:15PM +0300, Denis V. Lunev wrote: > From: Anton Nefedov > > If explicit zeroing out before mirroring is required for the target image, > it moves the block job offset counter to EOF, then offset and len counters > count the image size twice. There is no harm but stats are confusing, > specifically the progress of the operation is always reported as 99% by > management tools. > > The patch skips offset increase for the first "technical" pass over the > image. This should not cause any further harm. > > Signed-off-by: Anton Nefedov > Signed-off-by: Denis V. Lunev > CC: Jeff Cody > CC: Kevin Wolf > CC: Max Reitz > CC: Eric Blake > --- > Changes from v1: > - changed the approach - we do not allow to increase the offset rather then > to move it back > - description rewritten > - kludges to tests are removed as not actually needed with this approach > > block/mirror.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/block/mirror.c b/block/mirror.c > index 301ba92..f100f5d 100644 > --- a/block/mirror.c > +++ b/block/mirror.c > @@ -69,6 +69,7 @@ typedef struct MirrorBlockJob { > bool waiting_for_io; > int target_cluster_sectors; > int max_iov; > + bool initial_zeroing_ongoing; > } MirrorBlockJob; > > typedef struct MirrorOp { > @@ -117,9 +118,10 @@ static void mirror_iteration_done(MirrorOp *op, int ret) > if (s->cow_bitmap) { > bitmap_set(s->cow_bitmap, chunk_num, nb_chunks); > } > - s->common.offset += (uint64_t)op->nb_sectors * BDRV_SECTOR_SIZE; > + if (!s->initial_zeroing_ongoing) { > + s->common.offset += (uint64_t)op->nb_sectors * BDRV_SECTOR_SIZE; > + } > } > - > qemu_iovec_destroy(&op->qiov); > g_free(op); > > @@ -566,6 +568,7 @@ static int coroutine_fn mirror_dirty_init(MirrorBlockJob *s) > return 0; > } > > + s->initial_zeroing_ongoing = true; > for (sector_num = 0; sector_num < end; ) { > int nb_sectors = MIN(end - sector_num, > QEMU_ALIGN_DOWN(INT_MAX, s->granularity) >> BDRV_SECTOR_BITS); > @@ -573,6 +576,7 @@ static int coroutine_fn mirror_dirty_init(MirrorBlockJob *s) > mirror_throttle(s); > > if (block_job_is_cancelled(&s->common)) { > + s->initial_zeroing_ongoing = false; > return 0; > } > > @@ -587,6 +591,7 @@ static int coroutine_fn mirror_dirty_init(MirrorBlockJob *s) > } > > mirror_wait_for_all_io(s); > + s->initial_zeroing_ongoing = false; > } > > /* First part, loop on the sectors and initialize the dirty bitmap. */ > -- > 2.7.4 > Thanks, Applied to my block branch: git://github.com/codyprime/qemu-kvm-jtc.git block -Jeff