diff options
Diffstat (limited to 'migration/ram.c')
-rw-r--r-- | migration/ram.c | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/migration/ram.c b/migration/ram.c index 60f9cfe8be..1b19a899c9 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -2110,30 +2110,15 @@ static int ram_state_init(RAMState **rsp) return 0; } -static int ram_init_all(RAMState **rsp) +static void ram_list_init_bitmaps(void) { - if (ram_state_init(rsp)) { - return -1; - } - - if (xbzrle_init()) { - ram_state_cleanup(rsp); - return -1; - } - - /* For memory_global_dirty_log_start below. */ - qemu_mutex_lock_iothread(); - - qemu_mutex_lock_ramlist(); - rcu_read_lock(); + RAMBlock *block; + unsigned long pages; /* 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; - + pages = block->max_length >> TARGET_PAGE_BITS; block->bmap = bitmap_new(pages); bitmap_set(block->bmap, 0, pages); if (migrate_postcopy_ram()) { @@ -2142,12 +2127,36 @@ static int ram_init_all(RAMState **rsp) } } } +} + +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(*rsp); + migration_bitmap_sync(rs); + + rcu_read_unlock(); qemu_mutex_unlock_ramlist(); qemu_mutex_unlock_iothread(); - rcu_read_unlock(); +} + +static int ram_init_all(RAMState **rsp) +{ + if (ram_state_init(rsp)) { + return -1; + } + + if (xbzrle_init()) { + ram_state_cleanup(rsp); + return -1; + } + + ram_init_bitmaps(*rsp); return 0; } |