diff options
author | Peter Xu <peterx@redhat.com> | 2017-10-19 14:32:00 +0800 |
---|---|---|
committer | Juan Quintela <quintela@redhat.com> | 2017-10-23 18:03:38 +0200 |
commit | d6eff5d75d6b8d2fb18dca4ebd9f02a16d8e7f3b (patch) | |
tree | b2f4cb7b2de61a1b4b27837bbd883dbf14f7a224 /migration | |
parent | 84593a0807004d852132eaa56edf24d55793d480 (diff) |
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>
Diffstat (limited to 'migration')
-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; } |