migration: new ram_init_bitmaps()

Rearrange the bitmap initialization and the first sync.  Since at it,
make sure the locks are taken/released in correct order (I moved RCU
unlock upper - though it may not affect much).

Signed-off-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
Peter Xu 2017-10-19 14:32:00 +08:00 committed by Juan Quintela
parent 84593a0807
commit d6eff5d75d
1 changed files with 36 additions and 27 deletions

View File

@ -2110,6 +2110,41 @@ static int ram_state_init(RAMState **rsp)
return 0;
}
static void ram_list_init_bitmaps(void)
{
RAMBlock *block;
unsigned long pages;
/* Skip setting bitmap if there is no RAM */
if (ram_bytes_total()) {
QLIST_FOREACH_RCU(block, &ram_list.blocks, next) {
pages = block->max_length >> TARGET_PAGE_BITS;
block->bmap = bitmap_new(pages);
bitmap_set(block->bmap, 0, pages);
if (migrate_postcopy_ram()) {
block->unsentmap = bitmap_new(pages);
bitmap_set(block->unsentmap, 0, pages);
}
}
}
}
static void ram_init_bitmaps(RAMState *rs)
{
/* For memory_global_dirty_log_start below. */
qemu_mutex_lock_iothread();
qemu_mutex_lock_ramlist();
rcu_read_lock();
ram_list_init_bitmaps();
memory_global_dirty_log_start();
migration_bitmap_sync(rs);
rcu_read_unlock();
qemu_mutex_unlock_ramlist();
qemu_mutex_unlock_iothread();
}
static int ram_init_all(RAMState **rsp)
{
if (ram_state_init(rsp)) {
@ -2121,33 +2156,7 @@ static int ram_init_all(RAMState **rsp)
return -1;
}
/* For memory_global_dirty_log_start below. */
qemu_mutex_lock_iothread();
qemu_mutex_lock_ramlist();
rcu_read_lock();
/* Skip setting bitmap if there is no RAM */
if (ram_bytes_total()) {
RAMBlock *block;
QLIST_FOREACH_RCU(block, &ram_list.blocks, next) {
unsigned long pages = block->max_length >> TARGET_PAGE_BITS;
block->bmap = bitmap_new(pages);
bitmap_set(block->bmap, 0, pages);
if (migrate_postcopy_ram()) {
block->unsentmap = bitmap_new(pages);
bitmap_set(block->unsentmap, 0, pages);
}
}
}
memory_global_dirty_log_start();
migration_bitmap_sync(*rsp);
qemu_mutex_unlock_ramlist();
qemu_mutex_unlock_iothread();
rcu_read_unlock();
ram_init_bitmaps(*rsp);
return 0;
}