qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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,
	peter.maydell@linaro.org, lirans@il.ibm.com, quintela@redhat.com,
	jsnow@redhat.com, armbru@redhat.com, mreitz@redhat.com,
	stefanha@redhat.com, den@openvz.org, amit.shah@redhat.com,
	pbonzini@redhat.com, dgilbert@redhat.com
Subject: Re: [Qemu-devel] [PATCH v9 10/13] migration: add postcopy migration of dirty bitmaps
Date: Thu, 28 Dec 2017 14:14:57 +0800	[thread overview]
Message-ID: <20171228061457.GI9192@lemon> (raw)
In-Reply-To: <20171220154945.88410-11-vsementsov@virtuozzo.com>

On Wed, 12/20 18:49, Vladimir Sementsov-Ogievskiy wrote:
> Postcopy migration of dirty bitmaps. Only named dirty bitmaps,
> associated with root nodes and non-root named nodes are migrated.
> 
> If destination qemu is already containing a dirty bitmap with the same name
> as a migrated bitmap (for the same node), then, if their granularities are
> the same the migration will be done, otherwise the error will be generated.
> 
> If destination qemu doesn't contain such bitmap it will be created.
> 
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

Looks good in general, a few nits below.

> +static void send_bitmap_bits(QEMUFile *f, DirtyBitmapMigBitmapState *dbms,
> +                             uint64_t start_sector, uint32_t nr_sectors)
> +{
> +    /* align for buffer_is_zero() */
> +    uint64_t align = 4 * sizeof(long);
> +    uint64_t unaligned_size =
> +        bdrv_dirty_bitmap_serialization_size(
> +            dbms->bitmap, start_sector << BDRV_SECTOR_BITS,
> +            (uint64_t)nr_sectors << BDRV_SECTOR_BITS);
> +    uint64_t buf_size = (unaligned_size + align - 1) & ~(align - 1);

QEMU_ALIGN_UP() ?

> +    uint8_t *buf = g_malloc0(buf_size);
> +    uint32_t flags = DIRTY_BITMAP_MIG_FLAG_BITS;
> +
> +    bdrv_dirty_bitmap_serialize_part(
> +        dbms->bitmap, buf, start_sector << BDRV_SECTOR_BITS,
> +        (uint64_t)nr_sectors << BDRV_SECTOR_BITS);
> +
> +    if (buffer_is_zero(buf, buf_size)) {
> +        g_free(buf);
> +        buf = NULL;
> +        flags |= DIRTY_BITMAP_MIG_FLAG_ZEROES;
> +    }
> +
> +    trace_send_bitmap_bits(flags, start_sector, nr_sectors, buf_size);
> +
> +    send_bitmap_header(f, dbms, flags);
> +
> +    qemu_put_be64(f, start_sector);
> +    qemu_put_be32(f, nr_sectors);
> +
> +    /* if a block is zero we need to flush here since the network
> +     * bandwidth is now a lot higher than the storage device bandwidth.
> +     * thus if we queue zero blocks we slow down the migration. */
> +    if (flags & DIRTY_BITMAP_MIG_FLAG_ZEROES) {
> +        qemu_fflush(f);
> +    } else {
> +        qemu_put_be64(f, buf_size);
> +        qemu_put_buffer(f, buf, buf_size);
> +    }
> +
> +    g_free(buf);
> +}
> +

<snip>

> +static void dirty_bitmap_save_pending(QEMUFile *f, void *opaque,
> +                                      uint64_t max_size,
> +                                      uint64_t *res_precopy_only,
> +                                      uint64_t *res_compatible,
> +                                      uint64_t *res_postcopy_only)
> +{
> +    DirtyBitmapMigBitmapState *dbms;
> +    uint64_t pending = 0;
> +
> +    qemu_mutex_lock_iothread();
> +
> +    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
> +        uint64_t gran = bdrv_dirty_bitmap_granularity(dbms->bitmap);
> +        uint64_t sectors = dbms->bulk_completed ? 0 :
> +                           dbms->total_sectors - dbms->cur_sector;
> +
> +        pending += (sectors * BDRV_SECTOR_SIZE + gran - 1) / gran;

DIV_ROUND_UP()?

> +    }
> +
> +    qemu_mutex_unlock_iothread();
> +
> +    trace_dirty_bitmap_save_pending(pending, max_size);
> +
> +    *res_postcopy_only += pending;
> +}

<snip>

> +static int dirty_bitmap_load_header(QEMUFile *f, DirtyBitmapLoadState *s)
> +{
> +    Error *local_err = NULL;
> +    s->flags = qemu_get_bitmap_flags(f);
> +    trace_dirty_bitmap_load_header(s->flags);
> +
> +    if (s->flags & DIRTY_BITMAP_MIG_FLAG_DEVICE_NAME) {
> +        if (!qemu_get_counted_string(f, s->node_name)) {
> +            error_report("Unable to read node name string");
> +            return -EINVAL;
> +        }
> +        s->bs = bdrv_lookup_bs(s->node_name, s->node_name, &local_err);
> +        if (!s->bs) {
> +            error_report_err(local_err);
> +            return -EINVAL;
> +        }
> +    } else if (!s->bs) {
> +        error_report("Error: block device name is not set");
> +        return -EINVAL;
> +    }
> +
> +    if (s->flags & DIRTY_BITMAP_MIG_FLAG_BITMAP_NAME) {
> +        if (!qemu_get_counted_string(f, s->bitmap_name)) {
> +            error_report("Unable to read node name string");

s/node name/bitmap name/

> +            return -EINVAL;
> +        }
> +        s->bitmap = bdrv_find_dirty_bitmap(s->bs, s->bitmap_name);
> +
> +        /* bitmap may be NULL here, it wouldn't be an error if it is the
> +         * first occurrence of the bitmap */
> +        if (!s->bitmap && !(s->flags & DIRTY_BITMAP_MIG_FLAG_START)) {
> +            error_report("Error: unknown dirty bitmap "
> +                         "'%s' for block device '%s'",
> +                         s->bitmap_name, s->node_name);
> +            return -EINVAL;
> +        }
> +    } else if (!s->bitmap) {
> +        error_report("Error: block device name is not set");
> +        return -EINVAL;
> +    }
> +
> +    return 0;
> +}
> +

Fam

  reply	other threads:[~2017-12-28  6:15 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-20 15:49 [Qemu-devel] [PATCH v9 00/13] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 01/13] block/dirty-bitmap: add bdrv_dirty_bitmap_enable_successor() Vladimir Sementsov-Ogievskiy
2017-12-28  5:16   ` Fam Zheng
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 02/13] block/dirty-bitmap: fix locking in bdrv_reclaim_dirty_bitmap Vladimir Sementsov-Ogievskiy
2017-12-28  5:20   ` Fam Zheng
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 03/13] block/dirty-bitmap: add _locked version of bdrv_reclaim_dirty_bitmap Vladimir Sementsov-Ogievskiy
2017-12-28  5:24   ` Fam Zheng
2017-12-28 11:16     ` Vladimir Sementsov-Ogievskiy
2017-12-29  1:31       ` Fam Zheng
2018-01-18  8:43         ` Paolo Bonzini
2018-01-18  9:55           ` Vladimir Sementsov-Ogievskiy
2018-01-18 10:09             ` Paolo Bonzini
2018-01-19 14:12               ` Vladimir Sementsov-Ogievskiy
2018-01-22 12:14                 ` Vladimir Sementsov-Ogievskiy
2018-01-22 17:50                   ` John Snow
2018-01-24 10:16                   ` Paolo Bonzini
2018-01-24 22:29                     ` John Snow
2018-02-06 14:53                     ` Vladimir Sementsov-Ogievskiy
2018-02-12 17:30               ` Vladimir Sementsov-Ogievskiy
2018-02-13  7:45                 ` Paolo Bonzini
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 04/13] dirty-bitmap: add locked state Vladimir Sementsov-Ogievskiy
2017-12-22  2:03   ` John Snow
2017-12-22  9:37     ` Vladimir Sementsov-Ogievskiy
2017-12-22  8:46   ` Vladimir Sementsov-Ogievskiy
2017-12-28  5:32   ` Fam Zheng
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 05/13] migration: introduce postcopy-only pending Vladimir Sementsov-Ogievskiy
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 06/13] qapi: add dirty-bitmaps migration capability Vladimir Sementsov-Ogievskiy
2017-12-28  5:41   ` Fam Zheng
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 07/13] migration: include migrate_dirty_bitmaps in migrate_postcopy Vladimir Sementsov-Ogievskiy
2017-12-28  5:42   ` Fam Zheng
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 08/13] migration/qemu-file: add qemu_put_counted_string() Vladimir Sementsov-Ogievskiy
2017-12-28  5:48   ` Fam Zheng
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 09/13] migration: add is_active_iterate handler Vladimir Sementsov-Ogievskiy
2017-12-28  5:50   ` Fam Zheng
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 10/13] migration: add postcopy migration of dirty bitmaps Vladimir Sementsov-Ogievskiy
2017-12-28  6:14   ` Fam Zheng [this message]
2017-12-28 11:47     ` Vladimir Sementsov-Ogievskiy
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 11/13] iotests: add default node-name Vladimir Sementsov-Ogievskiy
2017-12-28  6:15   ` Fam Zheng
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 12/13] iotests: add dirty bitmap migration test Vladimir Sementsov-Ogievskiy
2017-12-28  6:28   ` Fam Zheng
2017-12-20 15:49 ` [Qemu-devel] [PATCH v9 13/13] iotests: add dirty bitmap postcopy test Vladimir Sementsov-Ogievskiy
2017-12-28  6:33   ` Fam Zheng
2017-12-28 11:49     ` Vladimir Sementsov-Ogievskiy
2018-01-17 18:30       ` John Snow
2018-01-18  9:57         ` Vladimir Sementsov-Ogievskiy
2018-01-19 18:08           ` Vladimir Sementsov-Ogievskiy
2018-01-19 18:20             ` John Snow
2018-01-20  0:37             ` John Snow
2018-01-22  9:06               ` Vladimir Sementsov-Ogievskiy

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=20171228061457.GI9192@lemon \
    --to=famz@redhat.com \
    --cc=amit.shah@redhat.com \
    --cc=armbru@redhat.com \
    --cc=den@openvz.org \
    --cc=dgilbert@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=lirans@il.ibm.com \
    --cc=mreitz@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).