diff options
Diffstat (limited to 'migration')
-rw-r--r-- | migration/block.c | 22 | ||||
-rw-r--r-- | migration/migration.c | 12 |
2 files changed, 24 insertions, 10 deletions
diff --git a/migration/block.c b/migration/block.c index 4d8c2e94b9..114cedbfd0 100644 --- a/migration/block.c +++ b/migration/block.c @@ -674,16 +674,14 @@ static int64_t get_remaining_dirty(void) return dirty << BDRV_SECTOR_BITS; } -/* Called with iothread lock taken. */ -static void block_migration_cleanup(void *opaque) + +/* Called with iothread lock taken. */ +static void block_migration_cleanup_bmds(void) { BlkMigDevState *bmds; - BlkMigBlock *blk; AioContext *ctx; - bdrv_drain_all(); - unset_dirty_tracking(); while ((bmds = QSIMPLEQ_FIRST(&block_mig_state.bmds_list)) != NULL) { @@ -701,6 +699,16 @@ static void block_migration_cleanup(void *opaque) g_free(bmds->aio_bitmap); g_free(bmds); } +} + +/* Called with iothread lock taken. */ +static void block_migration_cleanup(void *opaque) +{ + BlkMigBlock *blk; + + bdrv_drain_all(); + + block_migration_cleanup_bmds(); blk_mig_lock(); while ((blk = QSIMPLEQ_FIRST(&block_mig_state.blk_list)) != NULL) { @@ -844,6 +852,10 @@ static int block_save_complete(QEMUFile *f, void *opaque) qemu_put_be64(f, BLK_MIG_FLAG_EOS); + /* Make sure that our BlockBackends are gone, so that the block driver + * nodes can be inactivated. */ + block_migration_cleanup_bmds(); + return 0; } diff --git a/migration/migration.c b/migration/migration.c index 6f0705af1e..fc95acbde6 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -1825,17 +1825,19 @@ static void migration_completion(MigrationState *s, int current_active_state, if (!ret) { ret = vm_stop_force_state(RUN_STATE_FINISH_MIGRATE); + if (ret >= 0) { + qemu_file_set_rate_limit(s->to_dst_file, INT64_MAX); + qemu_savevm_state_complete_precopy(s->to_dst_file, false); + } /* * Don't mark the image with BDRV_O_INACTIVE flag if * we will go into COLO stage later. */ if (ret >= 0 && !migrate_colo_enabled()) { ret = bdrv_inactivate_all(); - } - if (ret >= 0) { - qemu_file_set_rate_limit(s->to_dst_file, INT64_MAX); - qemu_savevm_state_complete_precopy(s->to_dst_file, false); - s->block_inactive = true; + if (ret >= 0) { + s->block_inactive = true; + } } } qemu_mutex_unlock_iothread(); |