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:
Peter Xu 2018-05-02 18:47:33 +08:00 committed by Juan Quintela
parent edd090c728
commit 08614f3497
2 changed files with 45 additions and 1 deletions

View File

@ -2491,6 +2491,41 @@ static int ram_init_all(RAMState **rsp)
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
* 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)
{
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 = {

View File

@ -88,6 +88,7 @@ ram_dirty_bitmap_reload_complete(char *str) "%s"
ram_dirty_bitmap_sync_start(void) ""
ram_dirty_bitmap_sync_wait(void) ""
ram_dirty_bitmap_sync_complete(void) ""
ram_state_resume_prepare(uint64_t v) "%" PRId64
# migration/migration.c
await_return_path_close_on_source_close(void) ""