All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Peter Xu <peterx@redhat.com>
Cc: qemu-devel@nongnu.org, Laurent Vivier <lvivier@redhat.com>,
	"Daniel P . Berrange" <berrange@redhat.com>,
	Alexey Perevalov <a.perevalov@samsung.com>,
	Juan Quintela <quintela@redhat.com>,
	Andrea Arcangeli <aarcange@redhat.com>
Subject: Re: [Qemu-devel] [RFC v2 20/33] migration: new message MIG_RP_MSG_RECV_BITMAP
Date: Mon, 9 Oct 2017 20:12:15 +0100	[thread overview]
Message-ID: <20171009191214.GA3481@work-vm> (raw)
In-Reply-To: <20170927100416.GA17044@pxdev.xzpeter.org>

* Peter Xu (peterx@redhat.com) wrote:
> On Fri, Sep 22, 2017 at 12:05:42PM +0100, Dr. David Alan Gilbert wrote:
> 
> [...]
> 
> > > diff --git a/migration/ram.c b/migration/ram.c
> > > index 7e20097..5d938e3 100644
> > > --- a/migration/ram.c
> > > +++ b/migration/ram.c
> > > @@ -182,6 +182,70 @@ void ramblock_recv_bitmap_clear(RAMBlock *rb, void *host_addr)
> > >      clear_bit(ramblock_recv_bitmap_offset(host_addr, rb), rb->receivedmap);
> > >  }
> > >  
> > > +#define  RAMBLOCK_RECV_BITMAP_ENDING  (0x0123456789abcdefULL)
> > > +
> > > +/*
> > > + * Format: bitmap_size (8 bytes) + whole_bitmap (N bytes).
> > > + *
> > > + * Returns >0 if success with sent bytes, or <0 if error.
> > > + */
> > > +int64_t ramblock_recv_bitmap_send(QEMUFile *file,
> > > +                                  const char *block_name)
> > > +{
> > > +    RAMBlock *block = qemu_ram_block_by_name(block_name);
> > > +    unsigned long *le_bitmap, nbits;
> > > +    uint64_t size;
> > > +
> > > +    if (!block) {
> > > +        error_report("%s: invalid block name: %s", __func__, block_name);
> > > +        return -1;
> > > +    }
> > > +
> > > +    nbits = block->used_length >> TARGET_PAGE_BITS;
> > > +
> > > +    /*
> > > +     * Make sure the tmp bitmap buffer is big enough, e.g., on 32bit
> > > +     * machines we may need 4 more bytes for padding (see below
> > > +     * comment). So extend it a bit before hand.
> > > +     */
> > > +    le_bitmap = bitmap_new(nbits + BITS_PER_LONG);
> > 
> > I do worry what will happen on really huge RAMBlocks; the worst case is
> > that this temporary bitmap is a few GB.
> 
> IIUC the bitmap ratio is 32K, so the ramblock will be 1GB only if the
> guest RAM region size is 1GB * 32K = 32TB.
> 
> Then, can I just assume allocating (only) 1GB temporary memory for a
> guest using more than 32TB memory not a problem? :-)
> 
> I hope I didn't calculate it wrongly though.

No, I think that's right; I was off a few bits.
If they've got 32TB of RAM, then 1GB is probably no issue.

Dave

> > 
> > > +    /*
> > > +     * Always use little endian when sending the bitmap. This is
> > > +     * required that when source and destination VMs are not using the
> > > +     * same endianess. (Note: big endian won't work.)
> > > +     */
> > > +    bitmap_to_le(le_bitmap, block->receivedmap, nbits);
> > > +
> > > +    /* Size of the bitmap, in bytes */
> > > +    size = nbits / 8;
> > > +
> > > +    /*
> > > +     * size is always aligned to 8 bytes for 64bit machines, but it
> > > +     * may not be true for 32bit machines. We need this padding to
> > > +     * make sure the migration can survive even between 32bit and
> > > +     * 64bit machines.
> > > +     */
> > > +    size = ROUND_UP(size, 8);
> > > +
> > > +    qemu_put_be64(file, size);
> > > +    qemu_put_buffer(file, (const uint8_t *)le_bitmap, size);
> > > +    /*
> > > +     * Mark as an end, in case the middle part is screwed up due to
> > > +     * some "misterious" reason.
> > > +     */
> > > +    qemu_put_be64(file, RAMBLOCK_RECV_BITMAP_ENDING);
> > > +    qemu_fflush(file);
> > > +
> > > +    free(le_bitmap);
> > > +
> > > +    if (qemu_file_get_error(file)) {
> > > +        return qemu_file_get_error(file);
> > > +    }
> > > +
> > > +    return size + sizeof(size);
> > > +}
> > > +
> > >  /*
> > >   * An outstanding page request, on the source, having been received
> > >   * and queued
> > > @@ -2706,6 +2770,83 @@ static int ram_load(QEMUFile *f, void *opaque, int version_id)
> > >      return ret;
> > >  }
> > >  
> > > +/*
> > > + * Read the received bitmap, revert it as the initial dirty bitmap.
> > > + * This is only used when the postcopy migration is paused but wants
> > > + * to resume from a middle point.
> > > + */
> > > +int ram_dirty_bitmap_reload(MigrationState *s, RAMBlock *block)
> > > +{
> > > +    int ret = -EINVAL;
> > > +    QEMUFile *file = s->rp_state.from_dst_file;
> > > +    unsigned long *le_bitmap, nbits = block->used_length >> TARGET_PAGE_BITS;
> > > +    uint64_t local_size = nbits / 8;
> > > +    uint64_t size, end_mark;
> > > +
> > > +    if (s->state != MIGRATION_STATUS_POSTCOPY_RECOVER) {
> > > +        error_report("%s: incorrect state %s", __func__,
> > > +                     MigrationStatus_lookup[s->state]);
> > > +        return -EINVAL;
> > > +    }
> > > +
> > > +    /*
> > > +     * Note: see comments in ramblock_recv_bitmap_send() on why we
> > > +     * need the endianess convertion, and the paddings.
> > > +     */
> > > +    local_size = ROUND_UP(local_size, 8);
> > > +
> > > +    /* Add addings */
> > > +    le_bitmap = bitmap_new(nbits + BITS_PER_LONG);
> > > +
> > > +    size = qemu_get_be64(file);
> > > +
> > > +    /* The size of the bitmap should match with our ramblock */
> > > +    if (size != local_size) {
> > > +        error_report("%s: ramblock '%s' bitmap size mismatch "
> > > +                     "(0x%lx != 0x%lx)", __func__, block->idstr,
> > > +                     size, local_size);
> > 
> > You need to use PRIx64 formatters there - %lx isn't portable.
> 
> Yes. Fixing.
> 
> > 
> > > +        ret = -EINVAL;
> > > +        goto out;
> > > +    }
> > > +
> > > +    size = qemu_get_buffer(file, (uint8_t *)le_bitmap, local_size);
> > > +    end_mark = qemu_get_be64(file);
> > > +
> > > +    ret = qemu_file_get_error(file);
> > > +    if (ret || size != local_size) {
> > > +        error_report("%s: read bitmap failed for ramblock '%s': %d",
> > > +                     __func__, block->idstr, ret);
> > 
> > You might like to include size/local_size in the error.
> 
> Will do.  Thanks,
> 
> -- 
> Peter Xu
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK

  reply	other threads:[~2017-10-09 19:12 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-30  8:31 [Qemu-devel] [RFC v2 00/33] Migration: postcopy failure recovery Peter Xu
2017-08-30  8:31 ` [Qemu-devel] [RFC v2 01/33] bitmap: remove BITOP_WORD() Peter Xu
2017-09-20  8:41   ` Juan Quintela
2017-08-30  8:31 ` [Qemu-devel] [RFC v2 02/33] bitmap: introduce bitmap_count_one() Peter Xu
2017-09-20  8:25   ` Juan Quintela
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 03/33] bitmap: provide to_le/from_le helpers Peter Xu
2017-09-21 17:35   ` Dr. David Alan Gilbert
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 04/33] migration: dump str in migrate_set_state trace Peter Xu
2017-09-06 14:36   ` Dr. David Alan Gilbert
2017-09-20  8:44   ` Juan Quintela
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 05/33] migration: better error handling with QEMUFile Peter Xu
2017-09-21 17:51   ` Dr. David Alan Gilbert
2017-09-26  8:48     ` Peter Xu
2017-09-26  8:53       ` Dr. David Alan Gilbert
2017-09-26  9:13         ` Peter Xu
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 06/33] migration: reuse mis->userfault_quit_fd Peter Xu
2017-09-20  8:47   ` Juan Quintela
2017-09-20  9:06   ` Juan Quintela
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 07/33] migration: provide postcopy_fault_thread_notify() Peter Xu
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 08/33] migration: new postcopy-pause state Peter Xu
2017-09-21 17:57   ` Dr. David Alan Gilbert
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 09/33] migration: implement "postcopy-pause" src logic Peter Xu
2017-09-21 19:21   ` Dr. David Alan Gilbert
2017-09-26  9:35     ` Peter Xu
2017-10-09 15:32       ` Dr. David Alan Gilbert
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 10/33] migration: allow dst vm pause on postcopy Peter Xu
2017-09-21 19:29   ` Dr. David Alan Gilbert
2017-09-27  7:34     ` Peter Xu
2017-10-09 18:58       ` Dr. David Alan Gilbert
2017-10-10  9:38         ` Peter Xu
2017-10-10 11:31           ` Peter Xu
2017-10-31 18:57             ` Dr. David Alan Gilbert
2017-10-10 12:30           ` Dr. David Alan Gilbert
2017-10-11  3:00             ` Peter Xu
2017-10-12 12:19               ` Dr. David Alan Gilbert
2017-10-13  5:08                 ` Peter Xu
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 11/33] migration: allow src return path to pause Peter Xu
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 12/33] migration: allow send_rq to fail Peter Xu
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 13/33] migration: allow fault thread to pause Peter Xu
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 14/33] qmp: hmp: add migrate "resume" option Peter Xu
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 15/33] migration: pass MigrationState to migrate_init() Peter Xu
2017-09-22  9:09   ` Dr. David Alan Gilbert
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 16/33] migration: rebuild channel on source Peter Xu
2017-09-22  9:56   ` Dr. David Alan Gilbert
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 17/33] migration: new state "postcopy-recover" Peter Xu
2017-09-22 10:08   ` Dr. David Alan Gilbert
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 18/33] migration: wakeup dst ram-load-thread for recover Peter Xu
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 19/33] migration: new cmd MIG_CMD_RECV_BITMAP Peter Xu
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 20/33] migration: new message MIG_RP_MSG_RECV_BITMAP Peter Xu
2017-09-22 11:05   ` Dr. David Alan Gilbert
2017-09-27 10:04     ` Peter Xu
2017-10-09 19:12       ` Dr. David Alan Gilbert [this message]
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 21/33] migration: new cmd MIG_CMD_POSTCOPY_RESUME Peter Xu
2017-09-22 11:08   ` Dr. David Alan Gilbert
2017-09-27 10:11     ` Peter Xu
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 22/33] migration: new message MIG_RP_MSG_RESUME_ACK Peter Xu
2017-09-22 11:13   ` Dr. David Alan Gilbert
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 23/33] migration: introduce SaveVMHandlers.resume_prepare Peter Xu
2017-09-22 11:17   ` Dr. David Alan Gilbert
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 24/33] migration: synchronize dirty bitmap for resume Peter Xu
2017-09-22 11:33   ` Dr. David Alan Gilbert
2017-09-28  2:30     ` Peter Xu
2017-10-02 11:04       ` Dr. David Alan Gilbert
2017-10-09  3:55         ` Peter Xu
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 25/33] migration: setup ramstate " Peter Xu
2017-09-22 11:53   ` Dr. David Alan Gilbert
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 26/33] migration: final handshake for the resume Peter Xu
2017-09-22 11:56   ` Dr. David Alan Gilbert
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 27/33] migration: free SocketAddress where allocated Peter Xu
2017-09-22 20:08   ` Dr. David Alan Gilbert
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 28/33] migration: return incoming task tag for sockets Peter Xu
2017-09-22 20:11   ` Dr. David Alan Gilbert
2017-09-28  3:12     ` Peter Xu
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 29/33] migration: return incoming task tag for exec Peter Xu
2017-09-22 20:15   ` Dr. David Alan Gilbert
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 30/33] migration: return incoming task tag for fd Peter Xu
2017-09-22 20:15   ` Dr. David Alan Gilbert
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 31/33] migration: store listen task tag Peter Xu
2017-09-22 20:17   ` Dr. David Alan Gilbert
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 32/33] migration: allow migrate_incoming for paused VM Peter Xu
2017-09-22 20:32   ` Dr. David Alan Gilbert
2017-09-28  6:54     ` Peter Xu
2017-10-09 17:28       ` Dr. David Alan Gilbert
2017-10-10 10:08         ` Peter Xu
2017-08-30  8:32 ` [Qemu-devel] [RFC v2 33/33] migration: init dst in migration_object_init too Peter Xu
2017-09-22 20:37   ` Dr. David Alan Gilbert

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=20171009191214.GA3481@work-vm \
    --to=dgilbert@redhat.com \
    --cc=a.perevalov@samsung.com \
    --cc=aarcange@redhat.com \
    --cc=berrange@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.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.