migration: setup ramstate for resume
After we updated the dirty bitmaps of ramblocks, we also need to update the critical fields in RAMState to make sure it is ready for a resume. Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Signed-off-by: Peter Xu <peterx@redhat.com> Message-Id: <20180502104740.12123-18-peterx@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
edd090c728
commit
08614f3497
@ -2491,6 +2491,41 @@ static int ram_init_all(RAMState **rsp)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ram_state_resume_prepare(RAMState *rs, QEMUFile *out)
|
||||||
|
{
|
||||||
|
RAMBlock *block;
|
||||||
|
uint64_t pages = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Postcopy is not using xbzrle/compression, so no need for that.
|
||||||
|
* Also, since source are already halted, we don't need to care
|
||||||
|
* about dirty page logging as well.
|
||||||
|
*/
|
||||||
|
|
||||||
|
RAMBLOCK_FOREACH(block) {
|
||||||
|
pages += bitmap_count_one(block->bmap,
|
||||||
|
block->used_length >> TARGET_PAGE_BITS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This may not be aligned with current bitmaps. Recalculate. */
|
||||||
|
rs->migration_dirty_pages = pages;
|
||||||
|
|
||||||
|
rs->last_seen_block = NULL;
|
||||||
|
rs->last_sent_block = NULL;
|
||||||
|
rs->last_page = 0;
|
||||||
|
rs->last_version = ram_list.version;
|
||||||
|
/*
|
||||||
|
* Disable the bulk stage, otherwise we'll resend the whole RAM no
|
||||||
|
* matter what we have sent.
|
||||||
|
*/
|
||||||
|
rs->ram_bulk_stage = false;
|
||||||
|
|
||||||
|
/* Update RAMState cache of output QEMUFile */
|
||||||
|
rs->f = out;
|
||||||
|
|
||||||
|
trace_ram_state_resume_prepare(pages);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Each of ram_save_setup, ram_save_iterate and ram_save_complete has
|
* Each of ram_save_setup, ram_save_iterate and ram_save_complete has
|
||||||
* long-running RCU critical section. When rcu-reclaims in the code
|
* long-running RCU critical section. When rcu-reclaims in the code
|
||||||
@ -3486,8 +3521,16 @@ out:
|
|||||||
static int ram_resume_prepare(MigrationState *s, void *opaque)
|
static int ram_resume_prepare(MigrationState *s, void *opaque)
|
||||||
{
|
{
|
||||||
RAMState *rs = *(RAMState **)opaque;
|
RAMState *rs = *(RAMState **)opaque;
|
||||||
|
int ret;
|
||||||
|
|
||||||
return ram_dirty_bitmap_sync_all(s, rs);
|
ret = ram_dirty_bitmap_sync_all(s, rs);
|
||||||
|
if (ret) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ram_state_resume_prepare(rs, s->to_dst_file);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SaveVMHandlers savevm_ram_handlers = {
|
static SaveVMHandlers savevm_ram_handlers = {
|
||||||
|
@ -88,6 +88,7 @@ ram_dirty_bitmap_reload_complete(char *str) "%s"
|
|||||||
ram_dirty_bitmap_sync_start(void) ""
|
ram_dirty_bitmap_sync_start(void) ""
|
||||||
ram_dirty_bitmap_sync_wait(void) ""
|
ram_dirty_bitmap_sync_wait(void) ""
|
||||||
ram_dirty_bitmap_sync_complete(void) ""
|
ram_dirty_bitmap_sync_complete(void) ""
|
||||||
|
ram_state_resume_prepare(uint64_t v) "%" PRId64
|
||||||
|
|
||||||
# migration/migration.c
|
# migration/migration.c
|
||||||
await_return_path_close_on_source_close(void) ""
|
await_return_path_close_on_source_close(void) ""
|
||||||
|
Loading…
Reference in New Issue
Block a user