From: Fam Zheng <famz@redhat.com>
To: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Cc: qemu-block@nongnu.org, qemu-devel@nongnu.org, kwolf@redhat.com,
mreitz@redhat.com, jsnow@redhat.com, den@openvz.org,
stefanha@redhat.com, pbonzini@redhat.com, jcody@redhat.com
Subject: Re: [Qemu-devel] [PATCH 02/21] backup: init copy_bitmap from sync_bitmap for incremental
Date: Tue, 24 Jan 2017 15:09:39 +0800 [thread overview]
Message-ID: <20170124070938.GB27126@lemon.Home> (raw)
In-Reply-To: <1482503344-6424-3-git-send-email-vsementsov@virtuozzo.com>
On Fri, 12/23 17:28, Vladimir Sementsov-Ogievskiy wrote:
> We should not copy non-dirty clusters in write notifiers. So,
> initialize copy_bitmap from sync_bitmap.
>
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> ---
> block/backup.c | 32 +++++++++++++++++++++++++++++++-
> 1 file changed, 31 insertions(+), 1 deletion(-)
>
> diff --git a/block/backup.c b/block/backup.c
> index 6b27e55..621b1c0 100644
> --- a/block/backup.c
> +++ b/block/backup.c
> @@ -437,6 +437,34 @@ out:
> return ret;
> }
>
> +/* init copy_bitmap from sync_bitmap */
> +static void backup_incremental_init_copy_bitmap(BackupBlockJob *job)
> +{
> + int64_t sector;
> + BdrvDirtyBitmapIter *dbi;
> + uint32_t sect_gran =
> + bdrv_dirty_bitmap_granularity(job->sync_bitmap) >> BDRV_SECTOR_BITS;
> + int64_t sz = bdrv_dirty_bitmap_size(job->sync_bitmap);
> + int64_t sectors_per_cluster = cluster_size_sectors(job);
> + uint32_t cl_gran = MAX(1, sect_gran / sectors_per_cluster);
> +
> + dbi = bdrv_dirty_iter_new(job->sync_bitmap, 0);
> + while ((sector = bdrv_dirty_iter_next(dbi)) != -1) {
> + int64_t cluster = sector / sectors_per_cluster;
> + int64_t next_sector = (cluster + cl_gran) * sectors_per_cluster;
> +
> + hbitmap_set(job->copy_bitmap, cluster, cl_gran);
> +
> + if (next_sector >= sz) {
> + break;
> + }
> +
> + bdrv_set_dirty_iter(dbi, (cluster + cl_gran) * sectors_per_cluster);
> + }
> +
> + bdrv_dirty_iter_free(dbi);
> +}
> +
> static void coroutine_fn backup_run(void *opaque)
> {
> BackupBlockJob *job = opaque;
> @@ -453,20 +481,22 @@ static void coroutine_fn backup_run(void *opaque)
> end = DIV_ROUND_UP(job->common.len, job->cluster_size);
>
> job->copy_bitmap = hbitmap_alloc(end, 0);
> - hbitmap_set(job->copy_bitmap, 0, end);
>
> job->before_write.notify = backup_before_write_notify;
> bdrv_add_before_write_notifier(bs, &job->before_write);
>
> if (job->sync_mode == MIRROR_SYNC_MODE_NONE) {
> + hbitmap_set(job->copy_bitmap, 0, end);
This is confusing. It seems job->copy_bitmap is actually a superset of clusters
to copy instead of the exact one? Because "none" mode doesn't need blanket copy
- only overwritten clusters are copied...
> while (!block_job_is_cancelled(&job->common)) {
> /* Yield until the job is cancelled. We just let our before_write
> * notify callback service CoW requests. */
> block_job_yield(&job->common);
> }
> } else if (job->sync_mode == MIRROR_SYNC_MODE_INCREMENTAL) {
> + backup_incremental_init_copy_bitmap(job);
... But here you are only marking bits in sync_bitmap.
Fam
> ret = backup_run_incremental(job);
> } else {
> + hbitmap_set(job->copy_bitmap, 0, end);
> /* Both FULL and TOP SYNC_MODE's require copying.. */
> for (; start < end; start++) {
> bool error_is_read;
> --
> 1.8.3.1
>
next prev parent reply other threads:[~2017-01-24 7:09 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-23 14:28 [Qemu-devel] [PATCH 00/21] new backup architecture Vladimir Sementsov-Ogievskiy
2016-12-23 14:28 ` [Qemu-devel] [PATCH 01/21] backup: move from done_bitmap to copy_bitmap Vladimir Sementsov-Ogievskiy
2017-01-23 5:34 ` Jeff Cody
2017-01-23 12:20 ` Vladimir Sementsov-Ogievskiy
2017-01-31 10:25 ` Stefan Hajnoczi
2016-12-23 14:28 ` [Qemu-devel] [PATCH 02/21] backup: init copy_bitmap from sync_bitmap for incremental Vladimir Sementsov-Ogievskiy
2017-01-24 7:09 ` Fam Zheng [this message]
2017-01-24 9:00 ` Vladimir Sementsov-Ogievskiy
2017-01-24 9:46 ` Fam Zheng
2017-01-24 10:16 ` Vladimir Sementsov-Ogievskiy
2017-01-31 10:36 ` Stefan Hajnoczi
2016-12-23 14:28 ` [Qemu-devel] [PATCH 03/21] backup: improve non-dirty bits progress processing Vladimir Sementsov-Ogievskiy
2017-01-24 7:17 ` Fam Zheng
2017-01-24 9:12 ` Vladimir Sementsov-Ogievskiy
2017-01-31 10:56 ` Stefan Hajnoczi
2016-12-23 14:28 ` [Qemu-devel] [PATCH 04/21] backup: use copy_bitmap in incremental backup Vladimir Sementsov-Ogievskiy
2017-01-31 11:01 ` Stefan Hajnoczi
2016-12-23 14:28 ` [Qemu-devel] [PATCH 05/21] hbitmap: improve dirty iter Vladimir Sementsov-Ogievskiy
2017-01-31 11:20 ` Stefan Hajnoczi
2017-01-31 11:29 ` Stefan Hajnoczi
2016-12-23 14:28 ` [Qemu-devel] [PATCH 06/21] backup: rewrite top mode cluster skipping Vladimir Sementsov-Ogievskiy
2017-01-31 13:31 ` Stefan Hajnoczi
2016-12-23 14:28 ` [Qemu-devel] [PATCH 07/21] backup: refactor: merge top/full/incremental backup code Vladimir Sementsov-Ogievskiy
2017-01-31 14:26 ` Stefan Hajnoczi
2016-12-23 14:28 ` [Qemu-devel] [PATCH 08/21] backup: skip unallocated clusters for full mode Vladimir Sementsov-Ogievskiy
2017-01-24 7:59 ` Fam Zheng
2017-01-24 9:18 ` Vladimir Sementsov-Ogievskiy
2017-01-24 9:36 ` Fam Zheng
2017-01-24 10:13 ` Vladimir Sementsov-Ogievskiy
2017-01-24 11:12 ` Fam Zheng
2017-01-31 14:33 ` Stefan Hajnoczi
2017-01-31 14:38 ` Stefan Hajnoczi
2016-12-23 14:28 ` [Qemu-devel] [PATCH 09/21] backup: separate copy function Vladimir Sementsov-Ogievskiy
2017-01-31 14:40 ` Stefan Hajnoczi
2016-12-23 14:28 ` [Qemu-devel] [PATCH 10/21] backup: refactor backup_copy_cluster() Vladimir Sementsov-Ogievskiy
2017-01-31 14:57 ` Stefan Hajnoczi
2016-12-23 14:28 ` [Qemu-devel] [PATCH 11/21] backup: move r/w error handling code to r/w functions Vladimir Sementsov-Ogievskiy
2017-01-31 14:57 ` Stefan Hajnoczi
2016-12-23 14:28 ` [Qemu-devel] [PATCH 12/21] iotests: add supported_cache_modes to main function Vladimir Sementsov-Ogievskiy
2017-01-31 14:58 ` Stefan Hajnoczi
2016-12-23 14:28 ` [Qemu-devel] [PATCH 13/21] coroutine: add qemu_coroutine_add_next Vladimir Sementsov-Ogievskiy
2017-01-31 15:03 ` Stefan Hajnoczi
2016-12-23 14:28 ` [Qemu-devel] [PATCH 14/21] block: add trace point on bdrv_close_all Vladimir Sementsov-Ogievskiy
2017-01-31 15:03 ` Stefan Hajnoczi
2016-12-23 14:28 ` [Qemu-devel] [PATCH 15/21] bitmap: add bitmap_count_between() function Vladimir Sementsov-Ogievskiy
2017-01-31 15:15 ` Stefan Hajnoczi
2016-12-23 14:28 ` [Qemu-devel] [PATCH 16/21] hbitmap: add hbitmap_count_between() function Vladimir Sementsov-Ogievskiy
2017-01-31 15:56 ` Stefan Hajnoczi
2016-12-23 14:29 ` [Qemu-devel] [PATCH 17/21] backup: make all reads not serializing Vladimir Sementsov-Ogievskiy
2017-01-31 16:30 ` Stefan Hajnoczi
2016-12-23 14:29 ` [Qemu-devel] [PATCH 18/21] backup: new async architecture Vladimir Sementsov-Ogievskiy
2017-01-31 16:46 ` Stefan Hajnoczi
2017-02-01 16:13 ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2016-12-23 14:29 ` [Qemu-devel] [PATCH 20/21] backup: move bitmap handling from backup_do_cow to get_work Vladimir Sementsov-Ogievskiy
2016-12-23 14:29 ` [Qemu-devel] [PATCH 21/21] backup: refactor: remove backup_do_cow() Vladimir Sementsov-Ogievskiy
2017-01-09 11:04 ` [Qemu-devel] [PATCH 00/21] new backup architecture Stefan Hajnoczi
2017-01-10 6:05 ` Jeff Cody
2017-01-10 18:48 ` John Snow
2017-01-31 10:20 ` Stefan Hajnoczi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170124070938.GB27126@lemon.Home \
--to=famz@redhat.com \
--cc=den@openvz.org \
--cc=jcody@redhat.com \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
--cc=vsementsov@virtuozzo.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.