migration: make *save_live return errors
Make *save_live() return negative values when there is one error, and updates all callers to check for the error. Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
42802d47dd
commit
2975725f6b
|
@ -256,6 +256,7 @@ int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
|
||||||
uint64_t bytes_transferred_last;
|
uint64_t bytes_transferred_last;
|
||||||
double bwidth = 0;
|
double bwidth = 0;
|
||||||
uint64_t expected_time = 0;
|
uint64_t expected_time = 0;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (stage < 0) {
|
if (stage < 0) {
|
||||||
cpu_physical_memory_set_dirty_tracking(0);
|
cpu_physical_memory_set_dirty_tracking(0);
|
||||||
|
@ -264,7 +265,7 @@ int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
|
||||||
|
|
||||||
if (cpu_physical_sync_dirty_bitmap(0, TARGET_PHYS_ADDR_MAX) != 0) {
|
if (cpu_physical_sync_dirty_bitmap(0, TARGET_PHYS_ADDR_MAX) != 0) {
|
||||||
qemu_file_set_error(f, -EINVAL);
|
qemu_file_set_error(f, -EINVAL);
|
||||||
return 0;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stage == 1) {
|
if (stage == 1) {
|
||||||
|
@ -300,7 +301,7 @@ int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
|
||||||
bytes_transferred_last = bytes_transferred;
|
bytes_transferred_last = bytes_transferred;
|
||||||
bwidth = qemu_get_clock_ns(rt_clock);
|
bwidth = qemu_get_clock_ns(rt_clock);
|
||||||
|
|
||||||
while (!qemu_file_rate_limit(f)) {
|
while ((ret = qemu_file_rate_limit(f)) == 0) {
|
||||||
int bytes_sent;
|
int bytes_sent;
|
||||||
|
|
||||||
bytes_sent = ram_save_block(f);
|
bytes_sent = ram_save_block(f);
|
||||||
|
@ -310,6 +311,10 @@ int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
bwidth = qemu_get_clock_ns(rt_clock) - bwidth;
|
bwidth = qemu_get_clock_ns(rt_clock) - bwidth;
|
||||||
bwidth = (bytes_transferred - bytes_transferred_last) / bwidth;
|
bwidth = (bytes_transferred - bytes_transferred_last) / bwidth;
|
||||||
|
|
||||||
|
|
|
@ -557,6 +557,8 @@ static void blk_mig_cleanup(Monitor *mon)
|
||||||
|
|
||||||
static int block_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
|
static int block_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
DPRINTF("Enter save live stage %d submitted %d transferred %d\n",
|
DPRINTF("Enter save live stage %d submitted %d transferred %d\n",
|
||||||
stage, block_mig_state.submitted, block_mig_state.transferred);
|
stage, block_mig_state.submitted, block_mig_state.transferred);
|
||||||
|
|
||||||
|
@ -580,9 +582,10 @@ static int block_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
|
||||||
|
|
||||||
flush_blks(f);
|
flush_blks(f);
|
||||||
|
|
||||||
if (qemu_file_get_error(f)) {
|
ret = qemu_file_get_error(f);
|
||||||
|
if (ret) {
|
||||||
blk_mig_cleanup(mon);
|
blk_mig_cleanup(mon);
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
blk_mig_reset_dirty_cursor();
|
blk_mig_reset_dirty_cursor();
|
||||||
|
@ -608,9 +611,10 @@ static int block_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
|
||||||
|
|
||||||
flush_blks(f);
|
flush_blks(f);
|
||||||
|
|
||||||
if (qemu_file_get_error(f)) {
|
ret = qemu_file_get_error(f);
|
||||||
|
if (ret) {
|
||||||
blk_mig_cleanup(mon);
|
blk_mig_cleanup(mon);
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -625,8 +629,9 @@ static int block_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
|
||||||
/* report completion */
|
/* report completion */
|
||||||
qemu_put_be64(f, (100 << BDRV_SECTOR_BITS) | BLK_MIG_FLAG_PROGRESS);
|
qemu_put_be64(f, (100 << BDRV_SECTOR_BITS) | BLK_MIG_FLAG_PROGRESS);
|
||||||
|
|
||||||
if (qemu_file_get_error(f)) {
|
ret = qemu_file_get_error(f);
|
||||||
return 0;
|
if (ret) {
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
monitor_printf(mon, "Block migration completed\n");
|
monitor_printf(mon, "Block migration completed\n");
|
||||||
|
|
14
savevm.c
14
savevm.c
|
@ -1534,7 +1534,11 @@ int qemu_savevm_state_begin(Monitor *mon, QEMUFile *f, int blk_enable,
|
||||||
qemu_put_be32(f, se->instance_id);
|
qemu_put_be32(f, se->instance_id);
|
||||||
qemu_put_be32(f, se->version_id);
|
qemu_put_be32(f, se->version_id);
|
||||||
|
|
||||||
se->save_live_state(mon, f, QEMU_VM_SECTION_START, se->opaque);
|
ret = se->save_live_state(mon, f, QEMU_VM_SECTION_START, se->opaque);
|
||||||
|
if (ret < 0) {
|
||||||
|
qemu_savevm_state_cancel(mon, f);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ret = qemu_file_get_error(f);
|
ret = qemu_file_get_error(f);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
|
@ -1565,7 +1569,7 @@ int qemu_savevm_state_iterate(Monitor *mon, QEMUFile *f)
|
||||||
qemu_put_be32(f, se->section_id);
|
qemu_put_be32(f, se->section_id);
|
||||||
|
|
||||||
ret = se->save_live_state(mon, f, QEMU_VM_SECTION_PART, se->opaque);
|
ret = se->save_live_state(mon, f, QEMU_VM_SECTION_PART, se->opaque);
|
||||||
if (!ret) {
|
if (ret <= 0) {
|
||||||
/* Do not proceed to the next vmstate before this one reported
|
/* Do not proceed to the next vmstate before this one reported
|
||||||
completion of the current stage. This serializes the migration
|
completion of the current stage. This serializes the migration
|
||||||
and reduces the probability that a faster changing state is
|
and reduces the probability that a faster changing state is
|
||||||
|
@ -1586,6 +1590,7 @@ int qemu_savevm_state_iterate(Monitor *mon, QEMUFile *f)
|
||||||
int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f)
|
int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f)
|
||||||
{
|
{
|
||||||
SaveStateEntry *se;
|
SaveStateEntry *se;
|
||||||
|
int ret;
|
||||||
|
|
||||||
cpu_synchronize_all_states();
|
cpu_synchronize_all_states();
|
||||||
|
|
||||||
|
@ -1597,7 +1602,10 @@ int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f)
|
||||||
qemu_put_byte(f, QEMU_VM_SECTION_END);
|
qemu_put_byte(f, QEMU_VM_SECTION_END);
|
||||||
qemu_put_be32(f, se->section_id);
|
qemu_put_be32(f, se->section_id);
|
||||||
|
|
||||||
se->save_live_state(mon, f, QEMU_VM_SECTION_END, se->opaque);
|
ret = se->save_live_state(mon, f, QEMU_VM_SECTION_END, se->opaque);
|
||||||
|
if (ret < 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QTAILQ_FOREACH(se, &savevm_handlers, entry) {
|
QTAILQ_FOREACH(se, &savevm_handlers, entry) {
|
||||||
|
|
Loading…
Reference in a new issue