From 6bd68781331590c4f2fbd1fdf98e80d7f6588b31 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Wed, 27 Jun 2012 10:59:15 +0200 Subject: [PATCH] savevm: introduce is_active method Enable the creation of a method to tell migration if that section is active and should be migrate. We use it for blk-migration, that is normally not active. We don't create the method for RAM, as setups without RAM are very strange O:-) Signed-off-by: Juan Quintela --- block-migration.c | 13 ++++++------- savevm.c | 15 +++++++++++++++ vmstate.h | 1 + 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/block-migration.c b/block-migration.c index cd8a8dd..6d37dc1 100644 --- a/block-migration.c +++ b/block-migration.c @@ -548,13 +548,6 @@ static int block_save_live(QEMUFile *f, int stage, void *opaque) DPRINTF("Enter save live stage %d submitted %d transferred %d\n", stage, block_mig_state.submitted, block_mig_state.transferred); - - if (block_mig_state.blk_enable != 1) { - /* no need to migrate storage */ - qemu_put_be64(f, BLK_MIG_FLAG_EOS); - return 1; - } - if (stage == 1) { init_blk_migration(f); @@ -710,11 +703,17 @@ static void block_set_params(const MigrationParams *params, void *opaque) block_mig_state.blk_enable |= params->shared; } +static bool block_is_active(void *opaque) +{ + return block_mig_state.blk_enable == 1; +} + SaveVMHandlers savevm_block_handlers = { .set_params = block_set_params, .save_live_state = block_save_live, .load_state = block_load, .cancel = block_migration_cancel, + .is_active = block_is_active, }; void blk_mig_init(void) diff --git a/savevm.c b/savevm.c index 888c5a2..afa0c9e 100644 --- a/savevm.c +++ b/savevm.c @@ -1576,6 +1576,11 @@ int qemu_savevm_state_begin(QEMUFile *f, if (!se->ops || !se->ops->save_live_state) { continue; } + if (se->ops && se->ops->is_active) { + if (!se->ops->is_active(se->opaque)) { + continue; + } + } /* Section type */ qemu_put_byte(f, QEMU_VM_SECTION_START); qemu_put_be32(f, se->section_id); @@ -1618,6 +1623,11 @@ int qemu_savevm_state_iterate(QEMUFile *f) if (!se->ops || !se->ops->save_live_state) { continue; } + if (se->ops && se->ops->is_active) { + if (!se->ops->is_active(se->opaque)) { + continue; + } + } if (qemu_file_rate_limit(f)) { return 0; } @@ -1658,6 +1668,11 @@ int qemu_savevm_state_complete(QEMUFile *f) if (!se->ops || !se->ops->save_live_state) { continue; } + if (se->ops && se->ops->is_active) { + if (!se->ops->is_active(se->opaque)) { + continue; + } + } trace_savevm_section_start(); /* Section type */ qemu_put_byte(f, QEMU_VM_SECTION_END); diff --git a/vmstate.h b/vmstate.h index 1dd42f5..96651a5 100644 --- a/vmstate.h +++ b/vmstate.h @@ -35,6 +35,7 @@ typedef struct SaveVMHandlers { int (*save_live_state)(QEMUFile *f, int stage, void *opaque); void (*cancel)(void *opaque); LoadStateHandler *load_state; + bool (*is_active)(void *opaque); } SaveVMHandlers; int register_savevm(DeviceState *dev, -- 2.7.4