On 07/07/2016 05:35 AM, Denis V. Lunev wrote: > With a bdrv_co_write_zeroes method on a target BDS zeroes will not be placed > into the wire. Thus the target could be very efficiently zeroed out. This > is should be done with the largest chunk possible. > > Signed-off-by: Denis V. Lunev <[email protected]> > Reviewed-by: Vladimir Sementsov-Ogievskiy<[email protected]> > CC: Stefan Hajnoczi <[email protected]> > CC: Fam Zheng <[email protected]> > CC: Kevin Wolf <[email protected]> > CC: Max Reitz <[email protected]> > CC: Jeff Cody <[email protected]> > CC: Eric Blake <[email protected]> > --- > block/mirror.c | 33 +++++++++++++++++++++++++++++++-- > 1 file changed, 31 insertions(+), 2 deletions(-) > > diff --git a/block/mirror.c b/block/mirror.c > index 7208023..4ecfbf1 100644 > --- a/block/mirror.c > +++ b/block/mirror.c > @@ -526,8 +526,37 @@ static int mirror_dirty_init(MirrorBlockJob *s) > last_pause_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME); > > if (base == NULL && !bdrv_has_zero_init(target_bs)) { > - bdrv_set_dirty_bitmap(s->dirty_bitmap, 0, end); > - return 0; > + if (!bdrv_can_write_zeroes_with_unmap(target_bs)) { > + bdrv_set_dirty_bitmap(s->dirty_bitmap, 0, end); > + return 0; > + } > + > + for (sector_num = 0; sector_num < end; ) { > + int64_t now = qemu_clock_get_ns(QEMU_CLOCK_REALTIME); > + > + int nb_sectors = QEMU_ALIGN_DOWN(INT_MAX, s->granularity); > + nb_sectors = MIN(nb_sectors >> BDRV_SECTOR_BITS, end - > sector_num); > + > + if (now - last_pause_ns > SLICE_TIME) { > + last_pause_ns = now; > + block_job_sleep_ns(&s->common, QEMU_CLOCK_REALTIME, 0); > + } > + > + if (block_job_is_cancelled(&s->common)) { > + return 0; > + } > + > + if (s->in_flight >= MAX_IN_FLIGHT) { > + trace_mirror_yield(s, s->in_flight, s->buf_free_count, -1); > + mirror_wait_for_io(s); > + continue; > + } > + > + mirror_do_zero_or_discard(s, sector_num, nb_sectors, false); > + sector_num += nb_sectors; > + } > + > + mirror_drain(s); > } > > /* First part, loop on the sectors and initialize the dirty bitmap. */ >
Apart from needing the coroutine tag and Eric's comments, I think this is fine. --js
